From 316b23324c185308ce0ae3b432408cbfaffb033f Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 21 Jun 2018 21:23:48 +0200 Subject: [PATCH 001/359] Fix typos --- src/levels/rampup/reversingChanges.js | 2 +- src/levels/remote/pushArgs.js | 2 +- src/levels/remote/pushArgs2.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/levels/rampup/reversingChanges.js b/src/levels/rampup/reversingChanges.js index f64c1ae0..5619adb5 100644 --- a/src/levels/rampup/reversingChanges.js +++ b/src/levels/rampup/reversingChanges.js @@ -68,7 +68,7 @@ exports.level = { "beforeMarkdowns": [ "## Git Revert", "", - "While reseting works great for local branches on your own machine, its method of \"rewriting history\" doesn't work for remote branches that others are using.", + "While resetting works great for local branches on your own machine, its method of \"rewriting history\" doesn't work for remote branches that others are using.", "", "In order to reverse changes and *share* those reversed changes with others, we need to use `git revert`. Let's see it in action" ], diff --git a/src/levels/remote/pushArgs.js b/src/levels/remote/pushArgs.js index 3b7f236c..7da6ee93 100644 --- a/src/levels/remote/pushArgs.js +++ b/src/levels/remote/pushArgs.js @@ -60,7 +60,7 @@ exports.level = { "", "translates to this in English:", "", - "*Go to the branch named \"master\" in my repository, grab all the commits, and then go to the branch \"master\" on the remote named \"origin.\" Place whatever commits are missing on that branch and then tell me when you're done.*", + "*Go to the branch named \"master\" in my repository, grab all the commits, and then go to the branch \"master\" on the remote named \"origin\". Place whatever commits are missing on that branch and then tell me when you're done.*", "", "By specifying `master` as the \"place\" argument, we told git where the commits will *come from* and where the commits *will go*. It's essentially the \"place\" or \"location\" to synchronize between the two repositories.", "", diff --git a/src/levels/remote/pushArgs2.js b/src/levels/remote/pushArgs2.js index d9804f94..f333e40e 100644 --- a/src/levels/remote/pushArgs2.js +++ b/src/levels/remote/pushArgs2.js @@ -55,7 +55,7 @@ exports.level = { "", "`git push origin :`", "", - "This is commonly referred to as a colon refspec. Refspec is just a fancy name for a location that git can figure out (like the branch `foo` or even just `HEAD~1`)", + "This is commonly referred to as a colon refspec. Refspec is just a fancy name for a location that git can figure out (like the branch `foo` or even just `HEAD~1`)"., "", "Once you are specifying both the source and destination independently, you can get quite fancy and precise with remote commands. Let's see a demo!" ] From 0021fae10e48f8a35b6fc95bc74df8999cb00b99 Mon Sep 17 00:00:00 2001 From: Daniel Le Berre Date: Sat, 29 Sep 2018 09:34:50 +0200 Subject: [PATCH 002/359] Fix typo in french --- src/levels/mixed/describe.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js index 155c0c0a..0424c54c 100644 --- a/src/levels/mixed/describe.js +++ b/src/levels/mixed/describe.js @@ -128,7 +128,7 @@ "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Regardons un petit exemple. Prennons cet arbre :" + "Regardons un petit exemple. Prenons cet arbre :" ], "afterMarkdowns": [ "La commande`git describe master` donne le résultat :", From f77066482ca77f9b1909bf541c5f254e5fb34536 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Sun, 30 Sep 2018 21:23:05 -0700 Subject: [PATCH 003/359] Resolves #484 change solution command --- src/levels/mixed/grabbingOneCommit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/mixed/grabbingOneCommit.js b/src/levels/mixed/grabbingOneCommit.js index b1096188..6a3482a0 100644 --- a/src/levels/mixed/grabbingOneCommit.js +++ b/src/levels/mixed/grabbingOneCommit.js @@ -11,7 +11,7 @@ exports.level = { "git revert": true }, "goalTreeString": "%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22master%22%7D%2C%22debug%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22debug%22%7D%2C%22printf%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22printf%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D", - "solutionCommand": "git checkout master;git cherry-pick C4", + "solutionCommand": "git rebase -i master --solution-ordering C4", "startTree": "{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\"},\"debug\":{\"target\":\"C2\",\"id\":\"debug\"},\"printf\":{\"target\":\"C3\",\"id\":\"printf\"},\"bugFix\":{\"target\":\"C4\",\"id\":\"bugFix\"}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C2\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}", "name": { "ko": "딱 한개의 커밋만 가져오기", From 8d9ae4301d1697ce6ce7b7e380a78135fc2f1ae8 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Sun, 30 Sep 2018 21:25:19 -0700 Subject: [PATCH 004/359] Resolves #484 change solution command --- src/levels/mixed/grabbingOneCommit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/mixed/grabbingOneCommit.js b/src/levels/mixed/grabbingOneCommit.js index 6a3482a0..3b71c4c6 100644 --- a/src/levels/mixed/grabbingOneCommit.js +++ b/src/levels/mixed/grabbingOneCommit.js @@ -11,7 +11,7 @@ exports.level = { "git revert": true }, "goalTreeString": "%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22master%22%7D%2C%22debug%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22debug%22%7D%2C%22printf%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22printf%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D", - "solutionCommand": "git rebase -i master --solution-ordering C4", + "solutionCommand": "git checkout master; git rebase -i master --solution-ordering C4", "startTree": "{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\"},\"debug\":{\"target\":\"C2\",\"id\":\"debug\"},\"printf\":{\"target\":\"C3\",\"id\":\"printf\"},\"bugFix\":{\"target\":\"C4\",\"id\":\"bugFix\"}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C2\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}", "name": { "ko": "딱 한개의 커밋만 가져오기", From cf6fec06e7b8f06013df86a5377da602d20d2908 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Sun, 30 Sep 2018 21:28:01 -0700 Subject: [PATCH 005/359] Resolves #484 change solution command --- src/levels/mixed/grabbingOneCommit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/mixed/grabbingOneCommit.js b/src/levels/mixed/grabbingOneCommit.js index 3b71c4c6..898cf581 100644 --- a/src/levels/mixed/grabbingOneCommit.js +++ b/src/levels/mixed/grabbingOneCommit.js @@ -11,7 +11,7 @@ exports.level = { "git revert": true }, "goalTreeString": "%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22master%22%7D%2C%22debug%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22debug%22%7D%2C%22printf%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22printf%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D", - "solutionCommand": "git checkout master; git rebase -i master --solution-ordering C4", + "solutionCommand": "git rebase -i master --solution-ordering C4; git rebase bugFix master", "startTree": "{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\"},\"debug\":{\"target\":\"C2\",\"id\":\"debug\"},\"printf\":{\"target\":\"C3\",\"id\":\"printf\"},\"bugFix\":{\"target\":\"C4\",\"id\":\"bugFix\"}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C2\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}", "name": { "ko": "딱 한개의 커밋만 가져오기", From 780f53e226e36bd7062de04d78b6fff6769b55a9 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Sun, 30 Sep 2018 21:47:09 -0700 Subject: [PATCH 006/359] Resolves #486 -- easier to understand button labels when interactive rebasing --- src/js/views/rebaseView.js | 1 - src/style/main.css | 13 +++++++++++++ src/template.index.html | 11 ++++++++--- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/js/views/rebaseView.js b/src/js/views/rebaseView.js index ed19ca8f..49403561 100644 --- a/src/js/views/rebaseView.js +++ b/src/js/views/rebaseView.js @@ -164,7 +164,6 @@ var RebaseEntryView = Backbone.View.extend({ }, render: function() { - var json = this.model.toJSON(); this.$el.append(this.template(this.model.toJSON())); // hacky :( who would have known jquery barfs on ids with %'s and quotes diff --git a/src/style/main.css b/src/style/main.css index a5ee34cf..15a23383 100644 --- a/src/style/main.css +++ b/src/style/main.css @@ -770,6 +770,19 @@ li.rebaseEntry a#toggleButton { li.rebaseEntry.notPicked { opacity: 0.2; } + +li.rebaseEntry.notPicked span.showWhenPicked { + display: none; +} + +li.rebaseEntry span.showWhenNotPicked { + display: none; +} + +li.rebaseEntry.notPicked span.showWhenNotPicked { + display: inline; +} + /* Modal Views */ div.modalView.box.inFront.show { diff --git a/src/template.index.html b/src/template.index.html index c5312f4f..e788eb41 100644 --- a/src/template.index.html +++ b/src/template.index.html @@ -394,7 +394,7 @@ <% if (solutionOrder && solutionOrder.length) { %>

For the solution, order the commits as - <%= solutionOrder.join(', ') %> + <%= solutionOrder.join(', ') %>. You may need to omit or pick commits.

<% } %>

@@ -452,8 +452,13 @@ <%= id %> - Pick - + + Omit + + + Pick + + From 5e3012cca512e9c5a8bfa21bce5adba2fab88735 Mon Sep 17 00:00:00 2001 From: moskdev Date: Wed, 17 Oct 2018 22:10:02 +0300 Subject: [PATCH 007/359] Typo fix --- src/js/dialogs/confirmShowSolution.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/dialogs/confirmShowSolution.js b/src/js/dialogs/confirmShowSolution.js index 07815bcf..edd92462 100644 --- a/src/js/dialogs/confirmShowSolution.js +++ b/src/js/dialogs/confirmShowSolution.js @@ -99,7 +99,7 @@ exports.dialog = { type: 'ModalAlert', options: { markdowns: [ - '## Впевнений, що хошеш побачити розв’язок?', + '## Впевнений, що хочеш побачити розв’язок?', '', 'Я вірю в тебе! Ти впораєшся!' ] From 85ae115fc20da020bde4976b783d1b324b12f60f Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Fri, 19 Oct 2018 11:34:04 +0900 Subject: [PATCH 008/359] Resolves #487 --- src/levels/mixed/jugglingCommits2.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/mixed/jugglingCommits2.js b/src/levels/mixed/jugglingCommits2.js index 26fb0a0c..0c2b3615 100644 --- a/src/levels/mixed/jugglingCommits2.js +++ b/src/levels/mixed/jugglingCommits2.js @@ -9,7 +9,7 @@ exports.level = { "goalAsserts": { "master": [ function(data) { - return data.C2 > data.C3; + return data.C2 >= data.C3; }, function(data) { return data.C2 > data.C1; From c801f9ed46d83686a30c724b0a822b165aaef471 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Fri, 19 Oct 2018 15:08:14 +0900 Subject: [PATCH 009/359] Resolves #488 -- make https-y things links in the console --- src/js/react_views/CommandView.jsx | 28 ++++++++++++++++++++-------- src/js/sandbox/index.js | 2 +- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/js/react_views/CommandView.jsx b/src/js/react_views/CommandView.jsx index 362c4a6e..4eb55ebf 100644 --- a/src/js/react_views/CommandView.jsx +++ b/src/js/react_views/CommandView.jsx @@ -100,14 +100,26 @@ var CommandView = React.createClass({ var paragraphs = this.state.result.split("\n"); var result = []; for (var i = 0; i < paragraphs.length; i++) { - result.push( -

- ); + if (paragraphs[i].startsWith('https://')) { + result.push( + + ); + } else { + result.push( +

+ ); + } } return (

diff --git a/src/js/sandbox/index.js b/src/js/sandbox/index.js index c9131e23..1227cfdb 100644 --- a/src/js/sandbox/index.js +++ b/src/js/sandbox/index.js @@ -228,7 +228,7 @@ var Sandbox = Backbone.View.extend({ var url = 'https://learngitbranching.js.org/?NODEMO&command=importTreeNow%20' + escape(treeJSON); command.setResult( - intl.todo('Here is a link to the current state of the tree: ') + url + intl.todo('Here is a link to the current state of the tree: ') + '\n' + url ); command.finishWith(deferred); }, From d828f0e0a0280ba049a438d92b4a8d21c71812b2 Mon Sep 17 00:00:00 2001 From: PanAeon Date: Mon, 22 Oct 2018 14:21:02 +0100 Subject: [PATCH 010/359] Set html lang and meta http-equiv="content-language" attr on language change. --- src/js/app/index.js | 5 ++++- src/template.index.html | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/js/app/index.js b/src/js/app/index.js index 69e1fdce..21617d54 100644 --- a/src/js/app/index.js +++ b/src/js/app/index.js @@ -5,6 +5,7 @@ var React = require('react'); var assign = require('object-assign'); var util = require('../util'); var intl = require('../intl'); +var _ = require('underscore'); var LocaleStore = require('../stores/LocaleStore'); var LocaleActions = require('../actions/LocaleActions'); @@ -88,6 +89,9 @@ var vcsModeRefresh = function(eventData) { var intlRefresh = function() { if (!window.$) { return; } + var countryCode = LocaleStore.getLocale().replace(/_(.*)$/i, ""); + $("html").attr('lang', countryCode); + $("meta[http-equiv='content-language']").attr("content", countryCode); $('span.intl-aware').each(function(i, el) { var intl = require('../intl'); var key = $(el).attr('data-intl'); @@ -328,4 +332,3 @@ exports.getLevelDropdown = function() { }; exports.init = init; - diff --git a/src/template.index.html b/src/template.index.html index e788eb41..5fbc5fd6 100644 --- a/src/template.index.html +++ b/src/template.index.html @@ -12,6 +12,7 @@ + @@ -458,7 +459,7 @@ Pick - +
From 89f3a5177b830d03e1d7777174ae264c8e9944ac Mon Sep 17 00:00:00 2001 From: PanAeon Date: Mon, 22 Oct 2018 16:47:20 +0100 Subject: [PATCH 011/359] Generate alternate url for different locales so search engine could find them all. --- src/js/app/index.js | 20 +++++++++++++++++++- src/js/stores/LocaleStore.js | 7 +++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/js/app/index.js b/src/js/app/index.js index 69e1fdce..072b7945 100644 --- a/src/js/app/index.js +++ b/src/js/app/index.js @@ -1,6 +1,7 @@ var Backbone = require('backbone'); var EventEmitter = require('events').EventEmitter; var React = require('react'); +var _ = require('underscore'); var assign = require('object-assign'); var util = require('../util'); @@ -86,6 +87,22 @@ var vcsModeRefresh = function(eventData) { $('body').toggleClass('hgMode', !isGit); }; +var insertAlternateLinks = function(pageId) { + // For now pageId is null, which would link to the main page. + // In future if pageId is provided this method should link to a specific page + + // The value of the hreflang attribute identifies the language (in ISO 639-1 format) + // and optionally a region (in ISO 3166-1 Alpha 2 format) of an alternate URL + var altLinks = _.map(LocaleStore.getSupportedLocales(), function(langCode) { + var url = "https://learngitbranching.js.org/?locale=" + langCode; + return ''; + }); + var defaultUrl = "https://learngitbranching.js.org/?locale=" + LocaleStore.getDefaultLocale(); + altLinks.push(''); + $('head').prepend(altLinks); + +}; + var intlRefresh = function() { if (!window.$) { return; } $('span.intl-aware').each(function(i, el) { @@ -249,6 +266,8 @@ var initDemo = function(sandbox) { tryLocaleDetect(); } + insertAlternateLinks(); + if (params.command) { var command = unescape(params.command); sandbox.mainVis.customEvents.on('gitEngineReady', function() { @@ -328,4 +347,3 @@ exports.getLevelDropdown = function() { }; exports.init = init; - diff --git a/src/js/stores/LocaleStore.js b/src/js/stores/LocaleStore.js index 3b1a27b4..227bdd67 100644 --- a/src/js/stores/LocaleStore.js +++ b/src/js/stores/LocaleStore.js @@ -3,6 +3,7 @@ var AppConstants = require('../constants/AppConstants'); var AppDispatcher = require('../dispatcher/AppDispatcher'); var EventEmitter = require('events').EventEmitter; +var _ = require('underscore'); var assign = require('object-assign'); @@ -30,6 +31,8 @@ var headerLocaleMap = { 'pt-BR': 'pt_BR' }; +var supportedLocalesList = _.values(langLocaleMap).concat(_.values(headerLocaleMap)); + function _getLocaleFromHeader(langString) { var languages = langString.split(','); var desiredLocale; @@ -73,6 +76,10 @@ AppConstants.StoreSubscribePrototype, return _locale; }, + getSupportedLocales: function() { + return assign({}, supportedLocalesList); + }, + dispatchToken: AppDispatcher.register(function(payload) { var action = payload.action; var shouldInform = false; From d26d9c467410edd2e4a18af7aa87b4dd578c9e85 Mon Sep 17 00:00:00 2001 From: PanAeon Date: Mon, 22 Oct 2018 17:41:48 +0100 Subject: [PATCH 012/359] Set html lang, remove unused import --- src/js/app/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/js/app/index.js b/src/js/app/index.js index 21617d54..7dccef74 100644 --- a/src/js/app/index.js +++ b/src/js/app/index.js @@ -5,7 +5,6 @@ var React = require('react'); var assign = require('object-assign'); var util = require('../util'); var intl = require('../intl'); -var _ = require('underscore'); var LocaleStore = require('../stores/LocaleStore'); var LocaleActions = require('../actions/LocaleActions'); From ff37a369daf71f223dc3dbf187ef6f335905537d Mon Sep 17 00:00:00 2001 From: PanAeon Date: Mon, 22 Oct 2018 17:55:54 +0100 Subject: [PATCH 013/359] Small fix - replace regex with string split --- src/js/app/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/app/index.js b/src/js/app/index.js index 7dccef74..8bcb0acc 100644 --- a/src/js/app/index.js +++ b/src/js/app/index.js @@ -88,7 +88,7 @@ var vcsModeRefresh = function(eventData) { var intlRefresh = function() { if (!window.$) { return; } - var countryCode = LocaleStore.getLocale().replace(/_(.*)$/i, ""); + var countryCode = LocaleStore.getLocale().split("_")[0]; $("html").attr('lang', countryCode); $("meta[http-equiv='content-language']").attr("content", countryCode); $('span.intl-aware').each(function(i, el) { From 9d14feb1b39751ebddcd39efed3444bc25413381 Mon Sep 17 00:00:00 2001 From: PanAeon Date: Wed, 24 Oct 2018 11:12:48 +0100 Subject: [PATCH 014/359] Requested changes - removed underscore and sorted out duplicates in locales --- src/js/app/index.js | 4 ++-- src/js/stores/LocaleStore.js | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/js/app/index.js b/src/js/app/index.js index 072b7945..82e66870 100644 --- a/src/js/app/index.js +++ b/src/js/app/index.js @@ -1,7 +1,6 @@ var Backbone = require('backbone'); var EventEmitter = require('events').EventEmitter; var React = require('react'); -var _ = require('underscore'); var assign = require('object-assign'); var util = require('../util'); @@ -93,7 +92,8 @@ var insertAlternateLinks = function(pageId) { // The value of the hreflang attribute identifies the language (in ISO 639-1 format) // and optionally a region (in ISO 3166-1 Alpha 2 format) of an alternate URL - var altLinks = _.map(LocaleStore.getSupportedLocales(), function(langCode) { + + var altLinks = LocaleStore.getSupportedLocales().map(function(langCode) { var url = "https://learngitbranching.js.org/?locale=" + langCode; return ''; }); diff --git a/src/js/stores/LocaleStore.js b/src/js/stores/LocaleStore.js index 227bdd67..544a5af7 100644 --- a/src/js/stores/LocaleStore.js +++ b/src/js/stores/LocaleStore.js @@ -3,7 +3,6 @@ var AppConstants = require('../constants/AppConstants'); var AppDispatcher = require('../dispatcher/AppDispatcher'); var EventEmitter = require('events').EventEmitter; -var _ = require('underscore'); var assign = require('object-assign'); @@ -31,7 +30,9 @@ var headerLocaleMap = { 'pt-BR': 'pt_BR' }; -var supportedLocalesList = _.values(langLocaleMap).concat(_.values(headerLocaleMap)); +var supportedLocalesList = Object.values(langLocaleMap) + .concat(Object.values(headerLocaleMap)) + .filter(function (value, index, self) { return self.indexOf(value) === index;}); function _getLocaleFromHeader(langString) { var languages = langString.split(','); @@ -77,7 +78,7 @@ AppConstants.StoreSubscribePrototype, }, getSupportedLocales: function() { - return assign({}, supportedLocalesList); + return supportedLocalesList.slice(); }, dispatchToken: AppDispatcher.register(function(payload) { From 7c8c3f4892ba1a5d7b4f7174d66e2b5d973a21df Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Wed, 24 Oct 2018 12:36:12 -0700 Subject: [PATCH 015/359] Followup to PR #471 -- json issue --- src/levels/remote/pushArgs2.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/remote/pushArgs2.js b/src/levels/remote/pushArgs2.js index f333e40e..8e15cf6f 100644 --- a/src/levels/remote/pushArgs2.js +++ b/src/levels/remote/pushArgs2.js @@ -55,7 +55,7 @@ exports.level = { "", "`git push origin :`", "", - "This is commonly referred to as a colon refspec. Refspec is just a fancy name for a location that git can figure out (like the branch `foo` or even just `HEAD~1`)"., + "This is commonly referred to as a colon refspec. Refspec is just a fancy name for a location that git can figure out (like the branch `foo` or even just `HEAD~1`).", "", "Once you are specifying both the source and destination independently, you can get quite fancy and precise with remote commands. Let's see a demo!" ] From 27eac27653b28f6a9b625d8b80553c3137887677 Mon Sep 17 00:00:00 2001 From: paikwiki Date: Thu, 1 Nov 2018 17:01:48 +0900 Subject: [PATCH 016/359] Fix typo --- src/levels/intro/rebasing.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/intro/rebasing.js b/src/levels/intro/rebasing.js index d3358634..6d7c2f47 100644 --- a/src/levels/intro/rebasing.js +++ b/src/levels/intro/rebasing.js @@ -575,7 +575,7 @@ exports.level = { "", "브랜치끼리의 작업을 접목하는 두번째 방법은 *리베이스(rebase)*입니다. 리베이스는 기본적으로 커밋들을 모아서 복사한 뒤, 다른 곳에 떨궈 놓는 것입니다.", "", - "조금 어려게 느껴질 수 있지만, 리베이스를 하면 커밋들의 흐름을 보기 좋게 한 줄로 만들 수 있다는 장점이 있습니다. 리베이스를 쓰면 저장소의 커밋 로그와 이력이 한결 깨끗해집니다.", + "조금 어렵게 느껴질 수 있지만, 리베이스를 하면 커밋들의 흐름을 보기 좋게 한 줄로 만들 수 있다는 장점이 있습니다. 리베이스를 쓰면 저장소의 커밋 로그와 이력이 한결 깨끗해집니다.", "", "어떻게 동작하는지 살펴볼까요..." ] From 1ed0d3158696823092e8db876f4bd5a92d2e0594 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Wed, 14 Nov 2018 19:22:19 -0800 Subject: [PATCH 017/359] Resolves #497 -- fix unescaping random content from terminal (more) --- src/js/util/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/util/index.js b/src/js/util/index.js index ceab3013..51944aed 100644 --- a/src/js/util/index.js +++ b/src/js/util/index.js @@ -24,7 +24,8 @@ exports.splitTextCommand = function(value, func, context) { .replace(/^(\s+)/, '') .replace(/(\s+)$/, '') .replace(/"/g, '"') - .replace(/'/g, "'"); + .replace(/'/g, "'") + .replace(///g, "/"); if (index > 0 && !command.length) { return; From bf32cf6cd2865b4e93ad89ebb1c5a5810abbe416 Mon Sep 17 00:00:00 2001 From: CookieCompiler Date: Mon, 26 Nov 2018 21:15:13 +0100 Subject: [PATCH 018/359] fixed typo in german translation --- src/levels/mixed/tags.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/mixed/tags.js b/src/levels/mixed/tags.js index 69285b00..1e00da6a 100644 --- a/src/levels/mixed/tags.js +++ b/src/levels/mixed/tags.js @@ -375,7 +375,7 @@ "Lass uns ein Tag bei `C1` anlegen und damit die Version 1 unseres Prototyps markieren." ], "afterMarkdowns": [ - "Peng! Ziemlich einfach. Wir haben das Tag `v1` genannt und lassen es auf `C1` zeigen. Wenn du den Commit weglässt wir das Tag für den Commit erzeugt, auf den `HEAD` zeigt." + "Peng! Ziemlich einfach. Wir haben das Tag `v1` genannt und lassen es auf `C1` zeigen. Wenn du den Commit weglässt wird das Tag für den Commit erzeugt, auf den `HEAD` zeigt." ], "command": "git tag v1 C1", "beforeCommand": "git commit" From c339e4b0ca61bdd7ee0d036c0534ab9b0600c235 Mon Sep 17 00:00:00 2001 From: Roger Lee Date: Wed, 28 Nov 2018 10:57:14 +0800 Subject: [PATCH 019/359] update zh_cn translation in describe.js --- src/levels/mixed/describe.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js index 0424c54c..167cf55c 100644 --- a/src/levels/mixed/describe.js +++ b/src/levels/mixed/describe.js @@ -23,7 +23,7 @@ "es_AR": "Simplemente commiteá una vez en bugFix cuando estés listo para seguir", "pt_BR": "Simplesmente commite uma vez em bugFix quando quiser parar de experimentar", "zh_TW": "當你要移動的時候,只要在 bugFix 上面 commit 就好了", - "zh_CN": "在 bugFix 上面提交一次就可以了", + "zh_CN": "当你准备好时,在 bugFix 分支上面提交一次就可以了", "ru_RU": "Когда закончишь, просто сделай commit", "ko" : "다음으로 넘어가고 싶으면 bugFix를 한번 커밋하면 됩니다.", "uk" : "Просто зроби один коміт в bugFix коли ти будеш готовий іти далі" From c8344966dadb88fb2c3a99d06c3ecc7e0a220afe Mon Sep 17 00:00:00 2001 From: Sreeram Venkitesh <40194401+fillerInk@users.noreply.github.com> Date: Wed, 28 Nov 2018 21:06:32 +0530 Subject: [PATCH 020/359] corrected grammatical error in readme.md updated the readme.md file and corrected some grammatical mistakes. Added more lines to increase clarity. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b19d022b..371266bc 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Build Status](https://travis-ci.org/pcottle/learnGitBranching.svg?branch=master)](https://travis-ci.org/pcottle/learnGitBranching) -LearnGitBranching is a git repository visualizer, sandbox, and series of educational tutorials and challenges. Its primary purpose is to help developers understand git through the power of visualization (something that's absent when working on the command line). +LearnGitBranching is a git repository visualizer, sandbox, and a series of educational tutorials and challenges. Its primary purpose is to help developers understand git through the power of visualization (something that's absent when working on the command line). This is achieved through a game with different levels to get acquainted with the different git commands. You can input a variety of commands into LearnGitBranching (LGB) -- as commands are processed, the nearby commit tree will dynamically update to reflect the effects of each command: @@ -11,7 +11,7 @@ You can input a variety of commands into LearnGitBranching (LGB) -- as commands This visualization combined with tutorials and "levels" can help both beginners and intermediate developers polish their version control skills. A quick demo is available here: https://pcottle.github.com/learnGitBranching/?demo -Or you can launch the application normally here: +Or, you can launch the application normally here: https://pcottle.github.com/learnGitBranching/ ### Sandbox Mode From 5e8d83536e7257add533fedcf5b7f9e43ed8c89f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Wed, 28 Nov 2018 23:25:18 +0700 Subject: [PATCH 021/359] Fixed typos in comments and strings --- src/js/graph/treeCompare.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/graph/treeCompare.js b/src/js/graph/treeCompare.js index 0cf71286..132782bd 100644 --- a/src/js/graph/treeCompare.js +++ b/src/js/graph/treeCompare.js @@ -164,7 +164,7 @@ TreeCompare.compareBranchesWithinTreesHashAgnostic = function(treeA, treeB, bran return false; } - // dont mess up the rest of comparison + // don't mess up the rest of comparison branchA = _.clone(branchA); branchB = _.clone(branchB); branchA.target = this.getBaseRef(branchA.target); @@ -251,7 +251,7 @@ TreeCompare.getNumHashes = function(ref) { return func(results); } } - throw new Error('couldnt parse ref ' + ref); + throw new Error('couldn\'t parse ref ' + ref); }; TreeCompare.getBaseRef = function(ref) { From 694f414e224fde50b650194abca6c60160789e3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Thu, 29 Nov 2018 01:34:58 +0700 Subject: [PATCH 022/359] Fixed typos in comments and strings --- __tests__/base.js | 2 +- __tests__/remote.spec.js | 8 ++++---- src/js/app/index.js | 2 +- src/js/commands/index.js | 2 +- src/js/git/commands.js | 4 ++-- src/js/git/headless.js | 2 +- src/js/git/index.js | 30 ++++++++++++++-------------- src/js/level/builder.js | 8 ++++---- src/js/level/index.js | 4 ++-- src/js/level/parseWaterfall.js | 2 +- src/js/models/commandModel.js | 2 +- src/js/util/eventBaton.js | 4 ++-- src/js/views/builderViews.js | 2 +- src/js/views/gitDemonstrationView.js | 4 ++-- src/js/visuals/index.js | 4 ++-- src/js/visuals/visBase.js | 2 +- src/js/visuals/visBranch.js | 2 +- src/js/visuals/visNode.js | 2 +- src/js/visuals/visTag.js | 2 +- src/js/visuals/visualization.js | 2 +- todo.txt | 2 +- 21 files changed, 46 insertions(+), 46 deletions(-) diff --git a/__tests__/base.js b/__tests__/base.js index a8d5ab32..76a6ec7f 100644 --- a/__tests__/base.js +++ b/__tests__/base.js @@ -26,7 +26,7 @@ var getHeadlessSummary = function(headless) { var expectLevelAsync = function(headless, levelBlob) { var command = levelBlob.solutionCommand; if (command.indexOf('git rebase -i') !== -1) { - // dont do interactive rebase levels + // don't do interactive rebase levels return; } diff --git a/__tests__/remote.spec.js b/__tests__/remote.spec.js index 9f5f51e6..deff3562 100644 --- a/__tests__/remote.spec.js +++ b/__tests__/remote.spec.js @@ -261,7 +261,7 @@ describe('Git Remotes', function() { ); }); - it('doesnt fetch if out of sync, but will update explicit dest if specified', function() { + it('doesn\'t fetch if out of sync, but will update explicit dest if specified', function() { expectTreeAsync( 'git clone; git fakeTeamwork; go HEAD~1; git fetch origin master:master;go master; gc; go HEAD~1; git fakeTeamwork;git fetch origin master:master', '{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"C2","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C4":{"parents":["C2"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}}' @@ -304,14 +304,14 @@ describe('Git Remotes', function() { ); }); - it('doesnt let you fetch to master if you are checked out there', function() { + it('doesn\'t let you fetch to master if you are checked out there', function() { expectTreeAsync( 'git clone; git push origin master:foo; git fakeTeamwork foo 2; git fetch origin foo^:blah; git fetch foo:master', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null},"blah":{"target":"C2","id":"blah","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C3","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"foo","id":"HEAD"}}}' ); }); - it('doesnt let you delete branches that dont exist', function() { + it('doesn\'t let you delete branches that don\'t exist', function() { expectTreeAsync( 'git clone; git push origin :foo', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' @@ -325,7 +325,7 @@ describe('Git Remotes', function() { ); }); - it('makes a new branch from pull and doesnt bork', function() { + it('makes a new branch from pull and doesn\'t bork', function() { expectTreeAsync( 'git clone; git pull origin :bar', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"bar":{"target":"C1","id":"bar","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' diff --git a/src/js/app/index.js b/src/js/app/index.js index cf5f5cde..6c34800d 100644 --- a/src/js/app/index.js +++ b/src/js/app/index.js @@ -165,7 +165,7 @@ var initRootEvents = function(eventBaton) { var initDemo = function(sandbox) { var params = util.parseQueryString(window.location.href); - // being the smart programmer I am (not), I dont include a true value on demo, so + // being the smart programmer I am (not), I don't include a true value on demo, so // I have to check if the key exists here var commands; if (/(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent) || /android/i.test(navigator.userAgent)) { diff --git a/src/js/commands/index.js b/src/js/commands/index.js index a6045417..2f896e1c 100644 --- a/src/js/commands/index.js +++ b/src/js/commands/index.js @@ -16,7 +16,7 @@ var commandConfigs = { var commands = { execute: function(vcs, name, engine, commandObj) { if (!commandConfigs[vcs][name]) { - throw new Error('i dont have a command for ' + name); + throw new Error('i don\'t have a command for ' + name); } var config = commandConfigs[vcs][name]; if (config.delegate) { diff --git a/src/js/git/commands.js b/src/js/git/commands.js index 76a9165e..fb90d208 100644 --- a/src/js/git/commands.js +++ b/src/js/git/commands.js @@ -107,7 +107,7 @@ var assertBranchIsRemoteTracking = function(engine, branchName) { if (!tracking) { throw new GitError({ msg: intl.todo( - branchName + ' is not a remote tracking branch! I dont know where to push' + branchName + ' is not a remote tracking branch! I don\'t know where to push' ) }); } @@ -519,7 +519,7 @@ var commandConfig = { command.addWarning( intl.str('git-warning-hard') ); - // dont absorb the arg off of --hard + // don't absorb the arg off of --hard generalArgs = generalArgs.concat(commandOptions['--hard']); } diff --git a/src/js/git/headless.js b/src/js/git/headless.js index ffc7187a..a82081b9 100644 --- a/src/js/git/headless.js +++ b/src/js/git/headless.js @@ -36,7 +36,7 @@ function getMockFactory() { }; mockFactory.highlightEachWithPromise = function(chain, toRebase, destBranch) { - // dont add any steps + // don't add any steps return chain; }; diff --git a/src/js/git/index.js b/src/js/git/index.js index f0188246..e38b9934 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -61,7 +61,7 @@ GitEngine.prototype.initUniqueID = function() { GitEngine.prototype.handleModeChange = function(vcs, callback) { if (this.mode === vcs) { - // dont fire event aggressively + // don't fire event aggressively callback(); return; } @@ -96,8 +96,8 @@ GitEngine.prototype.setMode = function(vcs) { deferred.resolve(); var chain = deferred.promise; - // this stuff is tricky because we dont animate when - // we didnt do anything, but we DO animate when + // this stuff is tricky because we don't animate when + // we didn't do anything, but we DO animate when // either of the operations happen. so a lot of // branching ahead... var neededUpdate = this.updateAllBranchesForHg(); @@ -318,7 +318,7 @@ GitEngine.prototype.instantiateFromTree = function(tree) { if (tree.originTree) { var treeString = JSON.stringify(tree.originTree); - // if we dont have an animation queue (like when loading + // if we don't have an animation queue (like when loading // right away), just go ahead and make an empty one this.animationQueue = this.animationQueue || new AnimationQueue({ callback: function() {} @@ -434,7 +434,7 @@ GitEngine.prototype.findCommonAncestorForRemote = function(myTarget) { return this.getCommonAncestor( leftTarget, rightTarget, - true // dont throw since we dont know the order here. + true // don't throw since we don't know the order here. ).get('id'); }; @@ -451,7 +451,7 @@ GitEngine.prototype.findCommonAncestorWithRemote = function(originTarget) { // Like above, could have two parents var leftTarget = this.findCommonAncestorWithRemote(parents[0].get('id')); var rightTarget = this.findCommonAncestorWithRemote(parents[1].get('id')); - return this.getCommonAncestor(leftTarget, rightTarget, true /* dont throw */).get('id'); + return this.getCommonAncestor(leftTarget, rightTarget, true /* don't throw */).get('id'); }; GitEngine.prototype.makeBranchOnOriginAndTrack = function(branchName, target) { @@ -1113,7 +1113,7 @@ GitEngine.prototype.push = function(options) { if (!commitsToMake.length) { if (!options.force) { // We are already up to date, and we cant be deleting - // either since we dont have --force + // either since we don't have --force throw new GitError({ msg: intl.str('git-error-origin-fetch-uptodate') }); @@ -1133,7 +1133,7 @@ GitEngine.prototype.push = function(options) { // now here is the tricky part -- the difference between local master // and remote master might be commits C2, C3, and C4, but the remote - // might already have those commits. In this case, we dont need to + // might already have those commits. In this case, we don't need to // make them, so filter these out commitsToMake = _.filter(commitsToMake, function(commitJSON) { return !this.origin.refs[commitJSON.id]; @@ -1307,7 +1307,7 @@ GitEngine.prototype.fetchCore = function(sourceDestPairs, options) { // now here is the tricky part -- the difference between local master // and remote master might be commits C2, C3, and C4, but we - // might already have those commits. In this case, we dont need to + // might already have those commits. In this case, we don't need to // make them, so filter these out commitsToMake = _.filter(commitsToMake, function(commitJSON) { return !this.refs[commitJSON.id]; @@ -1617,7 +1617,7 @@ GitEngine.prototype.resolveName = function(someRef) { GitEngine.prototype.resolveID = function(idOrTarget) { if (idOrTarget === null || idOrTarget === undefined) { - throw new Error('Dont call this with null / undefined'); + throw new Error('Don\'t call this with null / undefined'); } if (typeof idOrTarget !== 'string') { @@ -1823,7 +1823,7 @@ GitEngine.prototype.pruneTreeAndPlay = function() { GitEngine.prototype.pruneTree = function() { var set = this.getUpstreamBranchSet(); - // dont prune commits that HEAD depends on + // don't prune commits that HEAD depends on var headSet = Graph.getUpstreamSet(this, 'HEAD'); _.each(headSet, function(val, commitID) { set[commitID] = true; @@ -2238,7 +2238,7 @@ GitEngine.prototype.rebaseInteractiveTest = function(targetSource, currentLocati if (extraCommits.length > 0) { throw new GitError({ - msg: intl.todo('Hey those commits dont exist in the set!') + msg: intl.todo('Hey those commits don\'t exist in the set!') }); } } @@ -2290,7 +2290,7 @@ GitEngine.prototype.rebaseInteractive = function(targetSource, currentLocation, _.each(options.initialCommitOrdering[0].split(','), function(id) { if (!rebaseMap[id]) { throw new GitError({ - msg: intl.todo('Hey those commits dont exist in the set!') + msg: intl.todo('Hey those commits don\'t exist in the set!') }); } initialCommitOrdering.push(id); @@ -2326,7 +2326,7 @@ GitEngine.prototype.filterRebaseCommits = function( } // we ALSO need to throw out commits that will do the same changes. like - // if the upstream set has a commit C4 and we have C4', we dont rebase the C4' again. + // if the upstream set has a commit C4 and we have C4', we don't rebase the C4' again. var baseID = this.scrapeBaseID(commit.get('id')); if (changesAlreadyMade[baseID]) { return false; @@ -2787,7 +2787,7 @@ GitEngine.prototype.log = function(ref, omitSet) { GitEngine.prototype.getCommonAncestor = function(ancestor, cousin, dontThrow) { if (this.isUpstreamOf(cousin, ancestor) && !dontThrow) { - throw new Error('Dont use common ancestor if we are upstream!'); + throw new Error('Don\'t use common ancestor if we are upstream!'); } var upstreamSet = Graph.getUpstreamSet(this, ancestor); diff --git a/src/js/level/builder.js b/src/js/level/builder.js index d3e7b1a2..bcb3d552 100644 --- a/src/js/level/builder.js +++ b/src/js/level/builder.js @@ -271,7 +271,7 @@ var LevelBuilder = Level.extend({ this.startDialogObj = levelObj; }.bind(this)) .fail(function() { - // nothing to do, they dont want to edit it apparently + // nothing to do, they don't want to edit it apparently }) .done(function() { if (command) { @@ -340,7 +340,7 @@ var LevelBuilder = Level.extend({ return whenEditedDialog.promise; }.bind(this)) .fail(function() { - // if they dont want to edit the start dialog, do nothing + // if they don't want to edit the start dialog, do nothing }) .done(function() { askForStartDeferred.resolve(); @@ -385,14 +385,14 @@ var LevelBuilder = Level.extend({ 'help builder': LevelBuilder.__super__.startDialog }; if (!methodMap[command.get('method')]) { - throw new Error('woah we dont support that method yet'); + throw new Error('woah we don\'t support that method yet'); } methodMap[command.get('method')].apply(this, arguments); }, afterCommandDefer: function(defer, command) { - // we dont need to compare against the goal anymore + // we don't need to compare against the goal anymore defer.resolve(); }, diff --git a/src/js/level/index.js b/src/js/level/index.js index 3466ce66..62b6a364 100644 --- a/src/js/level/index.js +++ b/src/js/level/index.js @@ -401,7 +401,7 @@ var Level = Sandbox.extend({ doesCommandCountTowardsTotal: function(command) { if (command.get('error')) { - // dont count errors towards our count + // don't count errors towards our count return false; } @@ -645,7 +645,7 @@ var Level = Sandbox.extend({ }; var method = methodMap[command.get('method')]; if (!method) { - throw new Error('woah we dont support that method yet', method); + throw new Error('woah we don\'t support that method yet', method); } method.apply(this, [command, defer]); diff --git a/src/js/level/parseWaterfall.js b/src/js/level/parseWaterfall.js index da48b6f9..4a711f4f 100644 --- a/src/js/level/parseWaterfall.js +++ b/src/js/level/parseWaterfall.js @@ -27,7 +27,7 @@ ParseWaterfall.prototype.initParseWaterfall = function() { return; } - // by deferring the initialization here, we dont require() + // by deferring the initialization here, we don't require() // level too early (which barfs our init) this.parseWaterfall = this.options.parseWaterfall || [ Commands.parse, diff --git a/src/js/models/commandModel.js b/src/js/models/commandModel.js index 9fd1a104..a8264ba6 100644 --- a/src/js/models/commandModel.js +++ b/src/js/models/commandModel.js @@ -43,7 +43,7 @@ var Command = Backbone.Model.extend({ }, initDefaults: function() { - // weird things happen with defaults if you dont + // weird things happen with defaults if you don't // make new objects this.set('generalArgs', []); this.set('supportedMap', {}); diff --git a/src/js/util/eventBaton.js b/src/js/util/eventBaton.js index e6059d43..fcfe4479 100644 --- a/src/js/util/eventBaton.js +++ b/src/js/util/eventBaton.js @@ -76,7 +76,7 @@ EventBaton.prototype.passBatonBack = function(name, func, context, args) { } }); if (indexBefore === undefined) { - throw new Error('you are the last baton holder! or i didnt find you'); + throw new Error('you are the last baton holder! or i didn\'t find you'); } var toCallObj = listeners[indexBefore]; @@ -105,7 +105,7 @@ EventBaton.prototype.releaseBaton = function(name, func, context) { if (!found) { console.log('did not find that function', func, context, name, arguments); console.log(this.eventMap); - throw new Error('cant releasebaton if yu dont have it'); + throw new Error('cant releasebaton if yu don\'t have it'); } this.eventMap[name] = newListeners; }; diff --git a/src/js/views/builderViews.js b/src/js/views/builderViews.js index bdf41b0e..bc8cc01d 100644 --- a/src/js/views/builderViews.js +++ b/src/js/views/builderViews.js @@ -334,7 +334,7 @@ var MultiViewBuilder = ContainedBase.extend({ this.addChildViewObj(newView); }.bind(this)) .fail(function() { - // they dont want to add the view apparently, so just return + // they don't want to add the view apparently, so just return }) .done(); }, diff --git a/src/js/views/gitDemonstrationView.js b/src/js/views/gitDemonstrationView.js index 498d1901..0c088c26 100644 --- a/src/js/views/gitDemonstrationView.js +++ b/src/js/views/gitDemonstrationView.js @@ -129,9 +129,9 @@ var GitDemonstrationView = ContainedBase.extend({ positive: function() { if (this.demonstrated || !this.hasControl) { - // dont do anything if we are demonstrating, and if + // don't do anything if we are demonstrating, and if // we receive a meta nav event and we aren't listening, - // then dont do anything either + // then don't do anything either return; } this.demonstrated = true; diff --git a/src/js/visuals/index.js b/src/js/visuals/index.js index 70678ff3..804669b5 100644 --- a/src/js/visuals/index.js +++ b/src/js/visuals/index.js @@ -98,7 +98,7 @@ GitVisuals.prototype.resetAll = function() { GitVisuals.prototype.tearDown = function() { this.resetAll(); this.paper.remove(); - // Unregister the refresh tree listener so we dont accumulate + // Unregister the refresh tree listener so we don't accumulate // these over time. However we aren't calling tearDown in // some places... but this is an improvement var Main = require('../app'); @@ -442,7 +442,7 @@ GitVisuals.prototype.fullCalc = function() { }; GitVisuals.prototype.calcTreeCoords = function() { - // this method can only contain things that dont rely on graphics + // this method can only contain things that don't rely on graphics if (!this.rootCommit) { throw new Error('grr, no root commit!'); } diff --git a/src/js/visuals/visBase.js b/src/js/visuals/visBase.js index 7f06e6aa..92eff1b2 100644 --- a/src/js/visuals/visBase.js +++ b/src/js/visuals/visBase.js @@ -41,7 +41,7 @@ var VisBase = Backbone.Model.extend({ } else { this.get(key).stop(); this.get(key).animate(attr[key], speed, easing); - // some keys dont support animating too, so set those instantly here + // some keys don't support animating too, so set those instantly here _.forEach(this.getNonAnimateKeys(), function(nonAnimateKey) { if (attr[key] && attr[key][nonAnimateKey] !== undefined) { this.get(key).attr(nonAnimateKey, attr[key][nonAnimateKey]); diff --git a/src/js/visuals/visBranch.js b/src/js/visuals/visBranch.js index a492edc8..27fadfc4 100644 --- a/src/js/visuals/visBranch.js +++ b/src/js/visuals/visBranch.js @@ -407,7 +407,7 @@ var VisBranch = VisBase.extend({ var textPos = this.getTextPosition(); var name = this.getName(); - // when from a reload, we dont need to generate the text + // when from a reload, we don't need to generate the text var text = paper.text(textPos.x, textPos.y, String(name)); text.attr({ 'font-size': 14, diff --git a/src/js/visuals/visNode.js b/src/js/visuals/visNode.js index 1cb08d86..6d3e5cb9 100644 --- a/src/js/visuals/visNode.js +++ b/src/js/visuals/visNode.js @@ -421,7 +421,7 @@ var VisNode = VisBase.extend({ }); // continuation calculation if ((vx * vx + vy * vy) < 0.1 && Math.abs(y - maxHeight) <= 0.1) { - // dont need to animate anymore, we are on ground + // don't need to animate anymore, we are on ground return false; } // keep animating! diff --git a/src/js/visuals/visTag.js b/src/js/visuals/visTag.js index f7ce663c..f11afe3a 100644 --- a/src/js/visuals/visTag.js +++ b/src/js/visuals/visTag.js @@ -251,7 +251,7 @@ var VisTag = VisBase.extend({ var textPos = this.getTextPosition(); var name = this.getName(); - // when from a reload, we dont need to generate the text + // when from a reload, we don't need to generate the text var text = paper.text(textPos.x, textPos.y, String(name)); text.attr({ 'font-size': 14, diff --git a/src/js/visuals/visualization.js b/src/js/visuals/visualization.js index 7c9ebb97..3ac6b0f4 100644 --- a/src/js/visuals/visualization.js +++ b/src/js/visuals/visualization.js @@ -34,7 +34,7 @@ var Visualization = Backbone.View.extend({ this.paper = paper; var Main = require('../app'); - // if we dont want to receive keyboard input (directly), + // if we don't want to receive keyboard input (directly), // make a new event baton so git engine steals something that no one // is broadcasting to this.eventBaton = (options.noKeyboardInput) ? diff --git a/todo.txt b/todo.txt index 342eebfb..d86f2344 100644 --- a/todo.txt +++ b/todo.txt @@ -77,7 +77,7 @@ Done things: [x] git pull animation [x] use the graph difference algorithm to then implement git push [x] work on git pull --rebase animation, send down the deferred and it should work? -[x] why is rebase -i broken? dont emulate touch events +[x] why is rebase -i broken? don't emulate touch events [x] tree compare test coverage [x] remote branch it is tracking (points to a remote branch model) [x] fix branch -a and branch -r to: show remote branches or all branches From 4c92196559077c8722a4e91cd8066648ec97e6e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Fri, 30 Nov 2018 20:21:13 +0700 Subject: [PATCH 023/359] Remove module object-assign --- package.json | 1 - src/js/app/index.js | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/package.json b/package.json index 85e723ef..aa736793 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,6 @@ "flux": "^2.0.1", "jquery": "~1.7.3", "markdown": "~0.4.0", - "object-assign": "^2.0.0", "q": "~0.8.11", "react": "^0.13.1", "underscore": "~1.4.3" diff --git a/src/js/app/index.js b/src/js/app/index.js index 6c34800d..6544627f 100644 --- a/src/js/app/index.js +++ b/src/js/app/index.js @@ -2,7 +2,6 @@ var Backbone = require('backbone'); var EventEmitter = require('events').EventEmitter; var React = require('react'); -var assign = require('object-assign'); var util = require('../util'); var intl = require('../intl'); var LocaleStore = require('../stores/LocaleStore'); @@ -11,7 +10,7 @@ var LocaleActions = require('../actions/LocaleActions'); /** * Globals */ -var events = assign( +var events = Object.assign( {}, EventEmitter.prototype, { From 41bb6d1bd77cda08a15fb72f347e4b26b92e2b2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Fri, 30 Nov 2018 22:06:42 +0700 Subject: [PATCH 024/359] Fix more typo, `'` and some word --- Gruntfile.js | 4 ++-- __tests__/git.spec.js | 7 +++---- __tests__/treeCompare.spec.js | 4 +--- src/js/app/index.js | 2 +- src/js/git/commands.js | 4 ++-- src/js/git/index.js | 16 ++++++++-------- src/js/intl/index.js | 4 ++-- src/js/intl/strings.js | 2 +- src/js/level/builder.js | 4 ++-- src/js/stores/LevelStore.js | 6 +++--- src/js/util/eventBaton.js | 4 ++-- src/js/views/index.js | 4 ++-- src/js/visuals/index.js | 4 ++-- todo.txt | 8 ++++---- 14 files changed, 35 insertions(+), 38 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 13e7f6b8..4d007c18 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -14,7 +14,7 @@ var indexFile = fs.readFileSync('src/template.index.html').toString(); var indexTemplate = _.template(indexFile); /** - * This is SUPER jank but I cant get the underscore templating to evaluate + * This is SUPER jank but I can't get the underscore templating to evaluate * correctly with custom regexes, so I'm just going to use interpolate * and define the strings here. */ @@ -43,7 +43,7 @@ module.exports = function(grunt) { grunt.log.writeln(compliments[index]); }); - grunt.registerTask('lintStrings', 'Find if an INTL string doesnt exist', function() { + grunt.registerTask('lintStrings', 'Find if an INTL string doesn\'t exist', function() { var child_process = require('child_process'); child_process.exec('node src/js/intl/checkStrings', function(err, output) { grunt.log.writeln(output); diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js index 25f55f96..656d197e 100644 --- a/__tests__/git.spec.js +++ b/__tests__/git.spec.js @@ -128,7 +128,7 @@ describe('Git', function() { ); }); - it('Ammends commits', function() { + it('Amends commits', function() { expectTreeAsync( 'git commit --amend', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%27%22%2C%22id%22%3A%22master%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C1%27%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D' @@ -219,7 +219,7 @@ describe('Git', function() { ); }); - it('doesnt make a tag if ref doesnt resolve', function() { + it('doesn\'t make a tag if ref doesn\'t resolve', function() { expectTreeAsync( 'git tag v1 foo', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' @@ -261,7 +261,7 @@ describe('Git', function() { ); }); - it('can handle slashes and dashes in branch names but doesnt allow o/', function() { + it('can handle slashes and dashes in branch names but doesn\'t allow o/', function() { expectTreeAsync( 'git branch foo/bar; git commit; git checkout foo/bar; gc; go master; git merge foo/bar; go foo/bar; git checkout -b bar-baz; git commit; git branch o/foo', '{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":null},"foo/bar":{"target":"C3","id":"foo/bar","remoteTrackingBranchID":null},"bar-baz":{"target":"C5","id":"bar-baz","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2","C3"],"id":"C4"},"C5":{"parents":["C3"],"id":"C5"}},"tags":{},"HEAD":{"target":"bar-baz","id":"HEAD"}}' @@ -276,4 +276,3 @@ describe('Git', function() { }); }); - diff --git a/__tests__/treeCompare.spec.js b/__tests__/treeCompare.spec.js index 83efa368..052d8df2 100644 --- a/__tests__/treeCompare.spec.js +++ b/__tests__/treeCompare.spec.js @@ -51,7 +51,7 @@ describe('Tree Compare', function() { it('deep compares on origin tree', function() { testMethod( - {}, // checked for all methods so this doesnt matter + {}, // checked for all methods so this doesn't matter // state with originTree '{"branches":{"master":{"target":"C1","id":"master"},"o/master":{"target":"C1","id":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"remoteTrackingBranch":null,"remote":false,"target":"C1","id":"master","type":"branch"}},"commits":{"C0":{"type":"commit","parents":[],"author":"Peter Cottle","createTime":"Wed Jul 24 2013 09:58:50 GMT-0700 (PDT)","commitMessage":"Quick commit. Go Bears!","id":"C0","rootCommit":true},"C1":{"type":"commit","parents":["C0"],"author":"Peter Cottle","createTime":"Wed Jul 24 2013 09:58:50 GMT-0700 (PDT)","commitMessage":"Quick commit. Go Bears!","id":"C1"}},"HEAD":{"target":"master","id":"HEAD","type":"general ref"}}}', { @@ -173,5 +173,3 @@ describe('Tree Compare', function() { ); }); }); - - diff --git a/src/js/app/index.js b/src/js/app/index.js index 6c34800d..9f1880e9 100644 --- a/src/js/app/index.js +++ b/src/js/app/index.js @@ -21,7 +21,7 @@ var events = assign( } } ); -// Allow unlimited listeners, so FF doesnt break +// Allow unlimited listeners, so FF doesn't break events.setMaxListeners(0); var commandUI; var sandbox; diff --git a/src/js/git/commands.js b/src/js/git/commands.js index fb90d208..cdec783b 100644 --- a/src/js/git/commands.js +++ b/src/js/git/commands.js @@ -19,7 +19,7 @@ function isColonRefspec(str) { } var assertIsRef = function(engine, ref) { - engine.resolveID(ref); // will throw giterror if cant resolve + engine.resolveID(ref); // will throw git error if can't resolve }; var validateBranchName = function(engine, name) { @@ -255,7 +255,7 @@ var commandConfig = { // get o/master locally if master is specified destination = engine.origin.refs[source].getPrefixedID(); } else { - // cant be detached + // can't be detached if (engine.getDetachedHead()) { throw new GitError({ msg: intl.todo('Git pull can not be executed in detached HEAD mode if no remote branch specified!') diff --git a/src/js/git/index.js b/src/js/git/index.js index e38b9934..2825a96a 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -41,7 +41,7 @@ function GitEngine(options) { this.eventBaton = options.eventBaton; this.eventBaton.stealBaton('processGitCommand', this.dispatch, this); - // poor man's dependency injection. we cant reassign + // poor man's dependency injection. we can't reassign // the module variable because its get clobbered :P this.animationFactory = (options.animationFactory) ? options.animationFactory : AnimationFactory; @@ -1018,12 +1018,12 @@ GitEngine.prototype.getTargetGraphDifference = function( _.each(here.parents, pushParent); } - // filter because we werent doing graph search + // filter because we weren't doing graph search var differenceUnique = Graph.getUniqueObjects(difference); /** * Ok now we have to determine the order in which to make these commits. * We used to just sort by depth because we were lazy but that is incorrect - * since it doesnt represent the actual dependency tree of the commits. + * since it doesn't represent the actual dependency tree of the commits. * * So here is what we are going to do -- loop through the differenceUnique * set and find a commit that has _all_ its parents in the targetSet. Then @@ -1112,7 +1112,7 @@ GitEngine.prototype.push = function(options) { ); if (!commitsToMake.length) { if (!options.force) { - // We are already up to date, and we cant be deleting + // We are already up to date, and we can't be deleting // either since we don't have --force throw new GitError({ msg: intl.str('git-error-origin-fetch-uptodate') @@ -1767,7 +1767,7 @@ GitEngine.prototype.syncRemoteBranchFills = function() { } var originBranch = this.origin.refs[branch.getBaseID()]; if (!originBranch.get('visBranch')) { - // testing mode doesnt get this + // testing mode doesn't get this return; } var originFill = originBranch.get('visBranch').get('fill'); @@ -2099,7 +2099,7 @@ GitEngine.prototype.hgRebase = function(destination, base) { }); chain = chain.then(function() { - // now we just moved a bunch of commits, but we havent updated the + // now we just moved a bunch of commits, but we haven't updated the // dangling guys. lets do that and then prune var anyChange = this.updateCommitParentsForHgRebase(masterSet); if (!anyChange) { @@ -2801,7 +2801,7 @@ GitEngine.prototype.getCommonAncestor = function(ancestor, cousin, dontThrow) { } queue = queue.concat(here.get('parents')); } - throw new Error('something has gone very wrong... two nodes arent connected!'); + throw new Error('something has gone very wrong... two nodes aren\'t connected!'); }; GitEngine.prototype.isUpstreamOf = function(child, ancestor) { @@ -2913,7 +2913,7 @@ var Branch = Ref.extend({ getBaseID: function() { if (!this.getIsRemote()) { - throw new Error('im not remote so cant get base'); + throw new Error('im not remote so can\'t get base'); } return this.get('id').replace(ORIGIN_PREFIX, ''); }, diff --git a/src/js/intl/index.js b/src/js/intl/index.js index 9a1e315c..57fbabed 100644 --- a/src/js/intl/index.js +++ b/src/js/intl/index.js @@ -57,7 +57,7 @@ var str = exports.str = function(key, params) { var getIntlKey = exports.getIntlKey = function(obj, key, overrideLocale) { if (!obj || !obj[key]) { - throw new Error('that key ' + key + 'doesnt exist in this blob' + obj); + throw new Error('that key ' + key + 'doesn\'t exist in this blob' + obj); } if (!obj[key][getDefaultLocale()]) { console.warn( @@ -98,7 +98,7 @@ exports.getStartDialog = function(level) { var startDialog = getIntlKey(level, 'startDialog'); if (startDialog) { return startDialog; } - // this level translation isnt supported yet, so lets add + // this level translation isn't supported yet, so lets add // an alert to the front and give the english version. var errorAlert = { type: 'ModalAlert', diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js index a96261b8..34306127 100755 --- a/src/js/intl/strings.js +++ b/src/js/intl/strings.js @@ -960,7 +960,7 @@ exports.strings = { }, /////////////////////////////////////////////////////////////////////////// 'level-no-id': { - '__desc__': 'When you say an id but that level doesnt exist', + '__desc__': 'When you say an id but that level doesn\'t exist', 'en_US': 'A level for that id "{id}" was not found! Opening up a level selection view', 'de_DE': 'Konnte keinen Level mit der ID "{id}" finden! Öffne einen Level-Auswahldialog', 'zh_CN': '没找到 id 为 "{id}" 的关卡!打开关卡选择框', diff --git a/src/js/level/builder.js b/src/js/level/builder.js index bcb3d552..e823d239 100644 --- a/src/js/level/builder.js +++ b/src/js/level/builder.js @@ -68,7 +68,7 @@ var LevelBuilder = Level.extend({ this.definedGoal = true; } - // we wont be using this stuff, and it is deleted to ensure we overwrite all functions that + // we won't be using this stuff, and it is deleted to ensure we overwrite all functions that // include that functionality delete this.treeCompare; delete this.solved; @@ -335,7 +335,7 @@ var LevelBuilder = Level.extend({ .then(function() { // oh boy this is complex var whenEditedDialog = Q.defer(); - // the undefined here is the command that doesnt need resolving just yet... + // the undefined here is the command that doesn't need resolving just yet... this.editDialog(undefined, whenEditedDialog); return whenEditedDialog.promise; }.bind(this)) diff --git a/src/js/stores/LevelStore.js b/src/js/stores/LevelStore.js index dccf6d84..edacc524 100644 --- a/src/js/stores/LevelStore.js +++ b/src/js/stores/LevelStore.js @@ -109,11 +109,11 @@ AppConstants.StoreSubscribePrototype, getNextLevel: function(id) { if (!_levelMap[id]) { - console.warn('that level doesnt exist!!!'); + console.warn('that level doesn\'t exist!!!'); return null; } - // meh, this method could be better. It's a tradeoff between + // meh, this method could be better. It's a trade-off between // having the sequence structure be really simple JSON // and having no connectivity information between levels, which means // you have to build that up yourself on every query @@ -138,7 +138,7 @@ AppConstants.StoreSubscribePrototype, isLevelSolved: function(levelID) { if (!_levelMap[levelID]) { - throw new Error('that level doesnt exist!'); + throw new Error('that level doesn\'t exist!'); } return !!_solvedMap[levelID]; }, diff --git a/src/js/util/eventBaton.js b/src/js/util/eventBaton.js index fcfe4479..278a1475 100644 --- a/src/js/util/eventBaton.js +++ b/src/js/util/eventBaton.js @@ -27,7 +27,7 @@ EventBaton.prototype.sliceOffArgs = function(num, args) { }; EventBaton.prototype.trigger = function(name) { - // arguments is weird and doesnt do slice right + // arguments is weird and doesn't do slice right var argsToApply = this.sliceOffArgs(1, arguments); var listeners = this.eventMap[name]; @@ -105,7 +105,7 @@ EventBaton.prototype.releaseBaton = function(name, func, context) { if (!found) { console.log('did not find that function', func, context, name, arguments); console.log(this.eventMap); - throw new Error('cant releasebaton if yu don\'t have it'); + throw new Error('can\'t releasebaton if you don\'t have it'); } this.eventMap[name] = newListeners; }; diff --git a/src/js/views/index.js b/src/js/views/index.js index c44320fa..b98d034a 100644 --- a/src/js/views/index.js +++ b/src/js/views/index.js @@ -168,7 +168,7 @@ var LeftRightView = PositiveNegativeBase.extend({ }; this.render(); - // For some weird reason backbone events arent working anymore so + // For some weird reason backbone events aren't working anymore so // im going to just wire this up manually this.$('div.right').click(this.positive.bind(this)); this.$('div.left').click(this.negative.bind(this)); @@ -208,7 +208,7 @@ var ModalView = Backbone.View.extend({ // add ourselves to the DOM this.$el.html(this.template({})); $('body').append(this.el); - // this doesnt necessarily show us though... + // this doesn't necessarily show us though... }, stealKeyboard: function() { diff --git a/src/js/visuals/index.js b/src/js/visuals/index.js index 804669b5..604afef6 100644 --- a/src/js/visuals/index.js +++ b/src/js/visuals/index.js @@ -359,7 +359,7 @@ GitVisuals.prototype.animateAllFromAttrToAttr = function(fromSnapshot, toSnapsho } if (!fromSnapshot[id] || !toSnapshot[id]) { - // its actually ok it doesnt exist yet + // its actually ok it doesn't exist yet return; } obj.animateFromAttrToAttr(fromSnapshot[id], toSnapshot[id]); @@ -477,7 +477,7 @@ GitVisuals.prototype.getCommitUpstreamBranches = function(commit) { GitVisuals.prototype.getBlendedHuesForCommit = function(commit) { var branches = this.upstreamBranchSet[commit.get('id')]; if (!branches) { - throw new Error('that commit doesnt have upstream branches!'); + throw new Error('that commit doesn\'t have upstream branches!'); } return this.blendHuesFromBranchStack(branches); diff --git a/todo.txt b/todo.txt index d86f2344..d586514b 100644 --- a/todo.txt +++ b/todo.txt @@ -40,19 +40,19 @@ Done things: (place to merge). o/master gets updated regardless [x] ok say I have branch banana and its one commit ahead of master. if I git pull origin master while checked out on banana, it fetches those commits - (doesnt update origin/master) and then merges them into banana. + (doesn't update origin/master) and then merges them into banana. [x] and then "git pull origin banana:origin/banana" works because it goes into the remote branch and then merges the fetch HEAD with current location [x] oh boy heres another data point. git fetch banana:banana will actually fast-forward banana to what remote has, but not update o/banana. weirdly it - doesnt let you do this if you are checked out on banana + doesn't let you do this if you are checked out on banana [x] furthermore, if banana has commits and its not a FF, it will reject the command. wth?? [x] test is failing because we create banana when we should only really be creating o/banana [x] work on TABBED levels layout [x] EASY -- make colors the same between remote branches and their remote counterparts [x] fix undo not syncing the remote tracking [x] get clone as a before command working in demonstration views (related to test infra as well) -[x] importTreeNow fails if origin isnt updated +[x] importTreeNow fails if origin isn't updated [x] set checkout -b branch __remoteBranch to track the remote branch [x] test coverage for hg!!! (in progress) [x] tree pruning @@ -123,7 +123,7 @@ Done things: [x] what if they just type "levels" ? [x] hookup for when solving happens [x] levels dropdown selection? -[x] git demonstration view -- shouldnt be too bad. LOL WHAT A FUCKING JOKE like 4 hours +[x] git demonstration view -- shouldn't be too bad. LOL WHAT A FUCKING JOKE like 4 hours [x] gotoSandbox command [x] "next level?" dialog after beating level [x] keyboard input for confirm / cancel From 052aa1e299852df4404a1cfb7fd1d11752037d96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sat, 1 Dec 2018 06:07:06 +0700 Subject: [PATCH 025/359] change '_.extend' to 'Object.assign' --- src/js/git/index.js | 12 ++++++------ src/js/graph/index.js | 8 ++++---- src/js/graph/treeCompare.js | 6 +++--- src/js/level/builder.js | 2 +- src/js/level/index.js | 4 ++-- src/js/sandbox/commands.js | 2 +- src/js/views/builderViews.js | 2 +- src/js/views/gitDemonstrationView.js | 2 +- src/js/views/index.js | 4 ++-- src/js/views/multiView.js | 2 +- src/js/visuals/tree.js | 4 ++-- src/js/visuals/visBase.js | 4 ++-- src/js/visuals/visualization.js | 2 +- 13 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/js/git/index.js b/src/js/git/index.js index 2825a96a..7754f2ae 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -518,7 +518,7 @@ GitEngine.prototype.getOrMakeRecursive = function( if (type == 'HEAD') { var headJSON = tree.HEAD; - var HEAD = new Ref(_.extend( + var HEAD = new Ref(Object.assign( tree.HEAD, { target: this.getOrMakeRecursive(tree, createdSoFar, headJSON.target) @@ -531,7 +531,7 @@ GitEngine.prototype.getOrMakeRecursive = function( if (type == 'branch') { var branchJSON = tree.branches[objID]; - var branch = new Branch(_.extend( + var branch = new Branch(Object.assign( tree.branches[objID], { target: this.getOrMakeRecursive(tree, createdSoFar, branchJSON.target) @@ -544,7 +544,7 @@ GitEngine.prototype.getOrMakeRecursive = function( if (type == 'tag') { var tagJSON = tree.tags[objID]; - var tag = new Tag(_.extend( + var tag = new Tag(Object.assign( tree.tags[objID], { target: this.getOrMakeRecursive(tree, createdSoFar, tagJSON.target) @@ -563,7 +563,7 @@ GitEngine.prototype.getOrMakeRecursive = function( parentObjs.push(this.getOrMakeRecursive(tree, createdSoFar, parentID)); }, this); - var commit = new Commit(_.extend( + var commit = new Commit(Object.assign( commitJSON, { parents: parentObjs, @@ -846,7 +846,7 @@ GitEngine.prototype.makeCommit = function(parents, id, options) { id = this.getUniqueID(); } - var commit = new Commit(_.extend({ + var commit = new Commit(Object.assign({ parents: parents, id: id, gitVisuals: this.gitVisuals @@ -1284,7 +1284,7 @@ GitEngine.prototype.fetchCore = function(sourceDestPairs, options) { this.origin, pair.destination, pair.source, - _.extend( + Object.assign( {}, options, {dontThrowOnNoFetch: true} diff --git a/src/js/graph/index.js b/src/js/graph/index.js index 49285de0..ed2c0745 100644 --- a/src/js/graph/index.js +++ b/src/js/graph/index.js @@ -44,7 +44,7 @@ var Graph = { if (type == 'HEAD') { var headJSON = tree.HEAD; - var HEAD = new Ref(_.extend( + var HEAD = new Ref(Object.assign( tree.HEAD, { target: this.getOrMakeRecursive(tree, createdSoFar, headJSON.target) @@ -57,7 +57,7 @@ var Graph = { if (type == 'branch') { var branchJSON = tree.branches[objID]; - var branch = new Branch(_.extend( + var branch = new Branch(Object.assign( tree.branches[objID], { target: this.getOrMakeRecursive(tree, createdSoFar, branchJSON.target) @@ -70,7 +70,7 @@ var Graph = { if (type == 'tag') { var tagJSON = tree.tags[objID]; - var tag = new Tag(_.extend( + var tag = new Tag(Object.assign( tree.tags[objID], { target: this.getOrMakeRecursive(tree, createdSoFar, tagJSON.target) @@ -89,7 +89,7 @@ var Graph = { parentObjs.push(this.getOrMakeRecursive(tree, createdSoFar, parentID)); }, this); - var commit = new Commit(_.extend( + var commit = new Commit(Object.assign( commitJSON, { parents: parentObjs, diff --git a/src/js/graph/treeCompare.js b/src/js/graph/treeCompare.js index 132782bd..75835ab6 100644 --- a/src/js/graph/treeCompare.js +++ b/src/js/graph/treeCompare.js @@ -92,7 +92,7 @@ TreeCompare.compareAllBranchesWithinTrees = function(treeA, treeB) { treeA = this.convertTreeSafe(treeA); treeB = this.convertTreeSafe(treeB); - var allBranches = _.extend( + var allBranches = Object.assign( {}, treeA.branches, treeB.branches @@ -140,7 +140,7 @@ TreeCompare.compareAllBranchesWithinTreesHashAgnostic = function(treeA, treeB) { treeB = this.convertTreeSafe(treeB); this.reduceTreeFields([treeA, treeB]); - var allBranches = _.extend( + var allBranches = Object.assign( {}, treeA.branches, treeB.branches @@ -270,7 +270,7 @@ TreeCompare.getRecurseCompareHashAgnostic = function(treeA, treeB) { // some buildup functions var getStrippedCommitCopy = function(commit) { if (!commit) { return {}; } - return _.extend( + return Object.assign( {}, commit, { diff --git a/src/js/level/builder.js b/src/js/level/builder.js index e823d239..a5a848a6 100644 --- a/src/js/level/builder.js +++ b/src/js/level/builder.js @@ -360,7 +360,7 @@ var LevelBuilder = Level.extend({ }, getExportObj: function() { - var compiledLevel = _.extend( + var compiledLevel = Object.assign( {}, this.level ); diff --git a/src/js/level/index.js b/src/js/level/index.js index 62b6a364..e2801d6e 100644 --- a/src/js/level/index.js +++ b/src/js/level/index.js @@ -70,7 +70,7 @@ var Level = Sandbox.extend({ // if there is a multiview in the beginning, open that // and let it resolve our deferred if (this.level.startDialog && !this.testOption('noIntroDialog')) { - new MultiView(_.extend( + new MultiView(Object.assign( {}, intl.getStartDialog(this.level), { deferred: deferred } @@ -99,7 +99,7 @@ var Level = Sandbox.extend({ var dialog = $.extend({}, intl.getStartDialog(levelObj)); // grab the last slide only dialog.childViews = dialog.childViews.slice(-1); - new MultiView(_.extend( + new MultiView(Object.assign( dialog, { deferred: deferred } )); diff --git a/src/js/sandbox/commands.js b/src/js/sandbox/commands.js index 6da2b6a6..83a741b0 100644 --- a/src/js/sandbox/commands.js +++ b/src/js/sandbox/commands.js @@ -134,7 +134,7 @@ var getAllCommands = function() { 'mobileAlert' ]; - var allCommands = _.extend( + var allCommands = Object.assign( {}, require('../level').regexMap, regexMap diff --git a/src/js/views/builderViews.js b/src/js/views/builderViews.js index bc8cc01d..9d2ba96f 100644 --- a/src/js/views/builderViews.js +++ b/src/js/views/builderViews.js @@ -179,7 +179,7 @@ var DemonstrationBuilder = ContainedBase.extend({ this.deferred = options.deferred || Q.defer(); if (options.fromObj) { var toEdit = options.fromObj.options; - options = _.extend( + options = Object.assign( {}, options, toEdit, diff --git a/src/js/views/gitDemonstrationView.js b/src/js/views/gitDemonstrationView.js index 0c088c26..f0fa0810 100644 --- a/src/js/views/gitDemonstrationView.js +++ b/src/js/views/gitDemonstrationView.js @@ -25,7 +25,7 @@ var GitDemonstrationView = ContainedBase.extend({ initialize: function(options) { options = options || {}; this.options = options; - this.JSON = _.extend( + this.JSON = Object.assign( { beforeMarkdowns: [ '## Git Commits', diff --git a/src/js/views/index.js b/src/js/views/index.js index b98d034a..7182d2a0 100644 --- a/src/js/views/index.js +++ b/src/js/views/index.js @@ -372,7 +372,7 @@ var ConfirmCancelTerminal = Backbone.View.extend({ options = options || {}; this.deferred = options.deferred || Q.defer(); - this.modalAlert = new ModalAlert(_.extend( + this.modalAlert = new ModalAlert(Object.assign( {}, { markdown: '#you sure?' }, options @@ -470,7 +470,7 @@ var NextLevelConfirm = ConfirmCancelTerminal.extend({ '

'; } - options = _.extend( + options = Object.assign( {}, options, { diff --git a/src/js/views/multiView.js b/src/js/views/multiView.js index 79ec192b..faffa3d0 100644 --- a/src/js/views/multiView.js +++ b/src/js/views/multiView.js @@ -159,7 +159,7 @@ var MultiView = Backbone.View.extend({ if (!this.typeToConstructor[type]) { throw new Error('no constructor for type "' + type + '"'); } - var view = new this.typeToConstructor[type](_.extend( + var view = new this.typeToConstructor[type](Object.assign( {}, viewJSON.options, { wait: true } diff --git a/src/js/visuals/tree.js b/src/js/visuals/tree.js index e5952228..5d9b92dd 100644 --- a/src/js/visuals/tree.js +++ b/src/js/visuals/tree.js @@ -13,7 +13,7 @@ var VisBase = Backbone.Model.extend({ animateAttrKeys: function(keys, attrObj, speed, easing) { // either we animate a specific subset of keys or all // possible things we could animate - keys = _.extend( + keys = Object.assign( {}, { include: ['circle', 'arrow', 'rect', 'path', 'text'], @@ -26,7 +26,7 @@ var VisBase = Backbone.Model.extend({ // safely insert this attribute into all the keys we want _.each(keys.include, function(key) { - attr[key] = _.extend( + attr[key] = Object.assign( {}, attr[key], attrObj diff --git a/src/js/visuals/visBase.js b/src/js/visuals/visBase.js index 92eff1b2..5196a575 100644 --- a/src/js/visuals/visBase.js +++ b/src/js/visuals/visBase.js @@ -58,7 +58,7 @@ var VisBase = Backbone.Model.extend({ animateAttrKeys: function(keys, attrObj, speed, easing) { // either we animate a specific subset of keys or all // possible things we could animate - keys = _.extend( + keys = Object.assign( {}, { include: ['circle', 'arrow', 'rect', 'path', 'text'], @@ -71,7 +71,7 @@ var VisBase = Backbone.Model.extend({ // safely insert this attribute into all the keys we want _.each(keys.include, function(key) { - attr[key] = _.extend( + attr[key] = Object.assign( {}, attr[key], attrObj diff --git a/src/js/visuals/visualization.js b/src/js/visuals/visualization.js index 3ac6b0f4..5cf27cb4 100644 --- a/src/js/visuals/visualization.js +++ b/src/js/visuals/visualization.js @@ -104,7 +104,7 @@ var Visualization = Backbone.View.extend({ makeOrigin: function(options) { // oh god, here we go. We basically do a bizarre form of composition here, // where this visualization actually contains another one of itself. - this.originVis = new Visualization(_.extend( + this.originVis = new Visualization(Object.assign( {}, // copy all of our options over, except... this.options, From 489a4b9095bd96d5ef98746a99f73a56a454f16f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sat, 1 Dec 2018 06:37:25 +0700 Subject: [PATCH 026/359] change '_.clone(..args)' to 'Object.assign({}, ..args)' --- src/js/git/index.js | 2 +- src/js/graph/treeCompare.js | 4 ++-- src/js/intl/index.js | 5 +++-- src/js/views/gitDemonstrationView.js | 3 +-- src/js/views/index.js | 8 ++++---- src/js/views/levelDropdownView.js | 3 +-- src/js/views/multiView.js | 3 +-- src/js/visuals/visualization.js | 3 +-- 8 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/js/git/index.js b/src/js/git/index.js index 7754f2ae..2e163168 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -726,7 +726,7 @@ GitEngine.prototype.makeTag = function(id, target) { }; GitEngine.prototype.getHead = function() { - return _.clone(this.HEAD); + return Object.assign({}, this.HEAD); }; GitEngine.prototype.getTags = function() { diff --git a/src/js/graph/treeCompare.js b/src/js/graph/treeCompare.js index 75835ab6..823076b0 100644 --- a/src/js/graph/treeCompare.js +++ b/src/js/graph/treeCompare.js @@ -165,8 +165,8 @@ TreeCompare.compareBranchesWithinTreesHashAgnostic = function(treeA, treeB, bran } // don't mess up the rest of comparison - branchA = _.clone(branchA); - branchB = _.clone(branchB); + branchA = Object.assign({}, branchA); + branchB = Object.assign({}, branchB); branchA.target = this.getBaseRef(branchA.target); branchB.target = this.getBaseRef(branchB.target); diff --git a/src/js/intl/index.js b/src/js/intl/index.js index 57fbabed..bab78fe5 100644 --- a/src/js/intl/index.js +++ b/src/js/intl/index.js @@ -11,7 +11,7 @@ var fallbackMap = { // lets change underscores template settings so it interpolates // things like "{branchName} does not exist". -var templateSettings = _.clone(_.templateSettings); +var templateSettings = Object.assign({}, _.templateSettings); templateSettings.interpolate = /\{(.+?)\}/g; var template = exports.template = function(str, params) { return _.template(str, params, templateSettings); @@ -106,7 +106,8 @@ exports.getStartDialog = function(level) { markdown: str('error-untranslated') } }; - var startCopy = _.clone( + var startCopy = Object.assign( + {}, level.startDialog[getDefaultLocale()] || level.startDialog ); startCopy.childViews.unshift(errorAlert); diff --git a/src/js/views/gitDemonstrationView.js b/src/js/views/gitDemonstrationView.js index f0fa0810..e769bd78 100644 --- a/src/js/views/gitDemonstrationView.js +++ b/src/js/views/gitDemonstrationView.js @@ -55,7 +55,7 @@ var GitDemonstrationView = ContainedBase.extend({ this.render(); this.checkScroll(); - this.navEvents = _.clone(Backbone.Events); + this.navEvents = Object.assign({}, Backbone.Events); this.navEvents.on('positive', this.positive, this); this.navEvents.on('negative', this.negative, this); this.keyboardListener = new KeyboardListener({ @@ -244,4 +244,3 @@ var GitDemonstrationView = ContainedBase.extend({ }); exports.GitDemonstrationView = GitDemonstrationView; - diff --git a/src/js/views/index.js b/src/js/views/index.js index 7182d2a0..6f09413b 100644 --- a/src/js/views/index.js +++ b/src/js/views/index.js @@ -86,7 +86,7 @@ var GeneralButton = ContainedBase.extend({ initialize: function(options) { options = options || {}; - this.navEvents = options.navEvents || _.clone(Backbone.Events); + this.navEvents = options.navEvents || Object.assign({}, Backbone.Events); this.destination = options.destination; if (!this.destination) { this.container = new ModalTerminal(); @@ -160,7 +160,7 @@ var LeftRightView = PositiveNegativeBase.extend({ // events system to add support for git demonstration view taking control of the // click events this.pipeEvents = options.events; - this.navEvents = _.clone(Backbone.Events); + this.navEvents = Object.assign({}, Backbone.Events); this.JSON = { showLeft: (options.showLeft === undefined) ? true : options.showLeft, @@ -305,7 +305,7 @@ var ModalTerminal = ContainedBase.extend({ initialize: function(options) { options = options || {}; - this.navEvents = options.events || _.clone(Backbone.Events); + this.navEvents = options.events || Object.assign({}, Backbone.Events); this.container = new ModalView(); this.JSON = { @@ -395,7 +395,7 @@ var ConfirmCancelTerminal = Backbone.View.extend({ }.bind(this)); // also setup keyboard - this.navEvents = _.clone(Backbone.Events); + this.navEvents = Object.assign({}, Backbone.Events); this.navEvents.on('positive', this.positive, this); this.navEvents.on('negative', this.negative, this); this.keyboardListener = new KeyboardListener({ diff --git a/src/js/views/levelDropdownView.js b/src/js/views/levelDropdownView.js index 79858ed0..31c29024 100644 --- a/src/js/views/levelDropdownView.js +++ b/src/js/views/levelDropdownView.js @@ -40,7 +40,7 @@ var LevelDropdownView = ContainedBase.extend({ }] }; - this.navEvents = _.clone(Backbone.Events); + this.navEvents = Object.assign({}, Backbone.Events); this.navEvents.on('clickedID', _.debounce( this.loadLevelID.bind(this), 300, @@ -444,4 +444,3 @@ var SeriesView = BaseView.extend({ }); exports.LevelDropdownView = LevelDropdownView; - diff --git a/src/js/views/multiView.js b/src/js/views/multiView.js index faffa3d0..d85bafb9 100644 --- a/src/js/views/multiView.js +++ b/src/js/views/multiView.js @@ -48,7 +48,7 @@ var MultiView = Backbone.View.extend({ this.childViews = []; this.currentIndex = 0; - this.navEvents = _.clone(Backbone.Events); + this.navEvents = Object.assign({}, Backbone.Events); this.navEvents.on('negative', this.getNegFunc(), this); this.navEvents.on('positive', this.getPosFunc(), this); this.navEvents.on('quit', this.finish, this); @@ -192,4 +192,3 @@ var MultiView = Backbone.View.extend({ }); exports.MultiView = MultiView; - diff --git a/src/js/visuals/visualization.js b/src/js/visuals/visualization.js index 5cf27cb4..739af574 100644 --- a/src/js/visuals/visualization.js +++ b/src/js/visuals/visualization.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var Backbone = require('backbone'); var Collections = require('../models/collections'); @@ -13,7 +12,7 @@ var Visualization = Backbone.View.extend({ initialize: function(options) { options = options || {}; this.options = options; - this.customEvents = _.clone(Backbone.Events); + this.customEvents = Object.assign({}, Backbone.Events); this.containerElement = options.containerElement; var _this = this; From 0134bf9870546b30dbedab4ccff114fd0e94897b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sat, 1 Dec 2018 08:05:27 +0700 Subject: [PATCH 027/359] Replace some '_.each' with 'Array.prototype.forEach' --- Gruntfile.js | 5 +-- src/js/commands/index.js | 4 +- src/js/git/commands.js | 3 +- src/js/git/index.js | 94 +++++++++++++++++++--------------------- 4 files changed, 50 insertions(+), 56 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 4d007c18..ab271d4a 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -62,7 +62,7 @@ module.exports = function(grunt) { hashedMinFile = 'bundle.js'; } var jsRegex = /bundle\.min\.\w+\.js/; - _.each(buildFiles, function(jsFile) { + buildFiles.forEach(function(jsFile) { if (jsRegex.test(jsFile)) { if (hashedMinFile) { throw new Error('more than one hashed file: ' + jsFile + hashedMinFile); @@ -76,7 +76,7 @@ module.exports = function(grunt) { var styleRegex = /main\.\w+\.css/; var hashedStyleFile; - _.each(buildFiles, function(styleFile) { + buildFiles.forEach(function(styleFile) { if (styleRegex.test(styleFile)) { if (hashedStyleFile) { throw new Error('more than one hashed style: ' + styleFile + hashedStyleFile); @@ -253,4 +253,3 @@ module.exports = function(grunt) { grunt.registerTask('test', ['jasmine_node']); grunt.registerTask('casperTest', ['shell:casperTest']); }; - diff --git a/src/js/commands/index.js b/src/js/commands/index.js index 2f896e1c..64706d34 100644 --- a/src/js/commands/index.js +++ b/src/js/commands/index.js @@ -34,7 +34,7 @@ var commands = { if (result.multiDelegate) { // we need to do multiple delegations with // a different command at each step - _.each(result.multiDelegate, function(delConfig) { + result.multiDelegate.forEach(function(delConfig) { // copy command, and then set opts commandObj.setOptionsMap(delConfig.options || {}); commandObj.setGeneralArgs(delConfig.args || []); @@ -70,7 +70,7 @@ var commands = { var displayName = config.displayName || name; var thisMap = {}; // start all options off as disabled - _.each(config.options, function(option) { + (config.options || []).forEach(function(option) { thisMap[option] = false; }); optionMap[vcs][displayName] = thisMap; diff --git a/src/js/git/commands.js b/src/js/git/commands.js index cdec783b..949f47ae 100644 --- a/src/js/git/commands.js +++ b/src/js/git/commands.js @@ -431,7 +431,7 @@ var commandConfig = { names = names.concat(generalArgs); command.validateArgBounds(names, 1, Number.MAX_VALUE, '-d'); - _.each(names, function(name) { + names.forEach(function(name) { engine.validateAndDeleteBranch(name); }); return; @@ -856,4 +856,3 @@ var instantCommands = [ exports.commandConfig = commandConfig; exports.instantCommands = instantCommands; - diff --git a/src/js/git/index.js b/src/js/git/index.js index 2e163168..e38fe572 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -170,7 +170,7 @@ GitEngine.prototype.exportTreeForBranch = function(branchName) { // now loop through and delete commits var commitsToLoop = tree.commits; tree.commits = {}; - _.each(commitsToLoop, function(commit, id) { + commitsToLoop.forEach(function(commit, id) { if (set[id]) { // if included in target branch tree.commits[id] = commit; @@ -179,7 +179,7 @@ GitEngine.prototype.exportTreeForBranch = function(branchName) { var branchesToLoop = tree.branches; tree.branches = {}; - _.each(branchesToLoop, function(branch, id) { + branchesToLoop.forEach(function(branch, id) { if (id === branchName) { tree.branches[id] = branch; } @@ -200,30 +200,28 @@ GitEngine.prototype.exportTree = function() { HEAD: null }; - _.each(this.branchCollection.toJSON(), function(branch) { + this.branchCollection.toJSON().forEach(function(branch) { branch.target = branch.target.get('id'); delete branch.visBranch; totalExport.branches[branch.id] = branch; }); - _.each(this.commitCollection.toJSON(), function(commit) { + this.commitCollection.toJSON().forEach(function(commit) { // clear out the fields that reference objects and create circular structure - _.each(Commit.prototype.constants.circularFields, function(field) { + Commit.prototype.constants.circularFields.forEach(function(field) { delete commit[field]; - }, this); + }); // convert parents - var parents = []; - _.each(commit.parents, function(par) { - parents.push(par.get('id')); + commit.parents = (commit.parents || []).map(function(par) { + return par.get('id'); }); - commit.parents = parents; totalExport.commits[commit.id] = commit; }, this); - _.each(this.tagCollection.toJSON(), function(tag) { + this.tagCollection.toJSON().forEach(function(tag) { delete tag.visTag; tag.target = tag.target.get('id'); @@ -558,9 +556,8 @@ GitEngine.prototype.getOrMakeRecursive = function( // for commits, we need to grab all the parents var commitJSON = tree.commits[objID]; - var parentObjs = []; - _.each(commitJSON.parents, function(parentID) { - parentObjs.push(this.getOrMakeRecursive(tree, createdSoFar, parentID)); + var parentObjs = commitJSON.parents.map(function(parentID) { + return this.getOrMakeRecursive(tree, createdSoFar, parentID); }, this); var commit = new Commit(Object.assign( @@ -774,17 +771,16 @@ GitEngine.prototype.printBranchesWithout = function(without) { var commitToBranches = this.getUpstreamBranchSet(); var commitID = this.getCommitFromRef(without).get('id'); - var toPrint = []; - _.each(commitToBranches[commitID], function(branchJSON) { + var toPrint = commitToBranches[commitID].map(function (branchJSON) { branchJSON.selected = this.HEAD.get('target').get('id') == branchJSON.id; - toPrint.push(branchJSON); + return branchJSON; }, this); this.printBranches(toPrint); }; GitEngine.prototype.printBranches = function(branches) { var result = ''; - _.each(branches, function(branch) { + branches.forEach(function (branch) { result += (branch.selected ? '* ' : '') + branch.id + '\n'; }); throw new CommandResult({ @@ -794,7 +790,7 @@ GitEngine.prototype.printBranches = function(branches) { GitEngine.prototype.printTags = function(tags) { var result = ''; - _.each(tags, function(tag) { + tags.forEach(function (tag) { result += tag.id + '\n'; }); throw new CommandResult({ @@ -895,11 +891,11 @@ GitEngine.prototype.revert = function(whichCommits) { }.bind(this); // set up the promise chain - _.each(toRevert, function(commit) { + toRevert.forEach(function (commit) { chain = chain.then(function() { return chainStep(commit); }); - }, this); + }); // done! update our location chain = chain.then(function() { @@ -934,7 +930,7 @@ GitEngine.prototype.setupCherrypickChain = function(toCherrypick) { ); }.bind(this); - _.each(toCherrypick, function(arg) { + toCherrypick.forEach(function (arg) { chain = chain.then(function() { return chainStep(arg); }); @@ -1015,7 +1011,7 @@ GitEngine.prototype.getTargetGraphDifference = function( while (toExplore.length) { var here = toExplore.pop(); difference.push(here); - _.each(here.parents, pushParent); + here.parents.forEach(pushParent); } // filter because we weren't doing graph search @@ -1160,7 +1156,7 @@ GitEngine.prototype.push = function(options) { var deferred = Q.defer(); var chain = deferred.promise; - _.each(commitsToMake, function(commitJSON) { + commitsToMake.forEach(function(commitJSON) { chain = chain.then(function() { return this.animationFactory.playHighlightPromiseAnimation( this.refs[commitJSON.id], @@ -1267,7 +1263,7 @@ GitEngine.prototype.fetchCore = function(sourceDestPairs, options) { // first check if our local remote branch is upstream of the origin branch set. // this check essentially pretends the local remote branch is in origin and // could be fast forwarded (basic sanity check) - _.each(sourceDestPairs, function(pair) { + sourceDestPairs.forEach(function (pair) { this.checkUpstreamOfSource( this, this.origin, @@ -1278,7 +1274,7 @@ GitEngine.prototype.fetchCore = function(sourceDestPairs, options) { // then we get the difference in commits between these two graphs var commitsToMake = []; - _.each(sourceDestPairs, function(pair) { + sourceDestPairs.forEach(function (pair) { commitsToMake = commitsToMake.concat(this.getTargetGraphDifference( this, this.origin, @@ -1341,7 +1337,7 @@ GitEngine.prototype.fetchCore = function(sourceDestPairs, options) { } var originBranchSet = this.origin.getUpstreamBranchSet(); - _.each(commitsToMake, function(commitJSON) { + commitsToMake.forEach(function (commitJSON) { // technically we could grab the wrong one here // but this works for now var originBranch = originBranchSet[commitJSON.id][0].obj; @@ -1364,7 +1360,7 @@ GitEngine.prototype.fetchCore = function(sourceDestPairs, options) { chain = chain.then(function() { // update all the destinations - _.each(sourceDestPairs, function(pair) { + sourceDestPairs.forEach(function (pair) { var ours = this.refs[pair.destination]; var theirCommitID = this.origin.getCommitFromRef(pair.source).get('id'); // by definition we just made the commit with this id, @@ -1736,8 +1732,8 @@ GitEngine.prototype.updateBranchesFromSet = function(commitSet) { var branchesToUpdate = {}; // now loop over the set we got passed in and find which branches // that means (aka intersection) - _.each(commitSet, function(val, id) { - _.each(upstreamSet[id], function(branchJSON) { + commitSet.forEach(function (val, id) { + upstreamSet[id].forEach(function (branchJSON) { branchesToUpdate[branchJSON.id] = true; }); }, this); @@ -1777,7 +1773,7 @@ GitEngine.prototype.syncRemoteBranchFills = function() { GitEngine.prototype.updateBranchesForHg = function(branchList) { var hasUpdated = false; - _.each(branchList, function(branchID) { + branchList.forEach(function (branchID) { // ok now just check if this branch has a more recent commit available. // that mapping is easy because we always do rebase alt id -- // theres no way to have C3' and C3''' but no C3''. so just @@ -1846,7 +1842,7 @@ GitEngine.prototype.pruneTree = function() { this.command.addWarning(intl.str('hg-prune-tree')); } - _.each(toDelete, function(commit) { + toDelete.forEach(function (commit) { commit.removeFromParents(); this.commitCollection.remove(commit); @@ -1877,7 +1873,7 @@ GitEngine.prototype.getUpstreamCollectionSet = function(collection) { var inArray = function(arr, id) { var found = false; - _.each(arr, function(wrapper) { + arr.forEach(function (wrapper) { if (wrapper.id == id) { found = true; } @@ -1902,7 +1898,7 @@ GitEngine.prototype.getUpstreamCollectionSet = function(collection) { collection.each(function(ref) { var set = bfsSearch(ref.get('target')); - _.each(set, function(id) { + set.forEach(function (id) { commitToSet[id] = commitToSet[id] || []; // only add it if it's not there, so hue blending is ok @@ -2156,7 +2152,7 @@ GitEngine.prototype.rebase = function(targetSource, currentLocation, options) { GitEngine.prototype.getUpstreamDiffSetFromSet = function(stopSet, location) { var set = {}; - _.each(this.getUpstreamDiffFromSet(stopSet, location), function(commit) { + this.getUpstreamDiffFromSet(stopSet, location).forEach(function (commit) { set[commit.get('id')] = true; }); return set; @@ -2189,7 +2185,7 @@ GitEngine.prototype.getInteractiveRebaseCommits = function(targetSource, current // throw out merge's real fast and see if we have anything to do var toRebase = []; - _.each(toRebaseRough, function(commit) { + toRebaseRough.forEach(function (commit) { if (commit.get('parents').length == 1) { toRebase.push(commit); } @@ -2211,7 +2207,7 @@ GitEngine.prototype.rebaseInteractiveTest = function(targetSource, currentLocati var toRebase = this.getInteractiveRebaseCommits(targetSource, currentLocation); var rebaseMap = {}; - _.each(toRebase, function(commit) { + toRebase.forEach(function (commit) { var id = commit.get('id'); rebaseMap[id] = commit; }); @@ -2228,7 +2224,7 @@ GitEngine.prototype.rebaseInteractiveTest = function(targetSource, currentLocati // Verify each chosen commit exists in the list of commits given to the user var extraCommits = []; rebaseOrder = []; - _.each(idsToRebase, function(id) { + idsToRebase.forEach(function (id) { if (id in rebaseMap) { rebaseOrder.push(rebaseMap[id]); } else { @@ -2281,13 +2277,13 @@ GitEngine.prototype.rebaseInteractive = function(targetSource, currentLocation, var initialCommitOrdering; if (options.initialCommitOrdering && options.initialCommitOrdering.length > 0) { var rebaseMap = {}; - _.each(toRebase, function(commit) { + toRebase.forEach(function (commit) { rebaseMap[commit.get('id')] = true; }); // Verify each chosen commit exists in the list of commits given to the user initialCommitOrdering = []; - _.each(options.initialCommitOrdering[0].split(','), function(id) { + options.initialCommitOrdering[0].split(',').forEach(function (id) { if (!rebaseMap[id]) { throw new GitError({ msg: intl.todo('Hey those commits don\'t exist in the set!') @@ -2406,7 +2402,7 @@ GitEngine.prototype.rebaseFinish = function( }.bind(this); // set up the promise chain - _.each(toRebase, function(commit) { + toRebase.forEach(function (commit) { chain = chain.then(function() { return chainStep(commit); }); @@ -2561,7 +2557,7 @@ GitEngine.prototype.describe = function(ref) { // ok we need to BFS from start upwards until we hit a tag. but // first we need to get a reverse mapping from tag to commit var tagMap = {}; - _.each(this.tagCollection.toJSON(), function(tag) { + this.tagCollection.toJSON().forEach(function (tag) { tagMap[tag.target.get('id')] = tag.id; }); @@ -2733,7 +2729,7 @@ GitEngine.prototype.status = function() { lines.push(intl.str('git-status-readytocommit')); var msg = ''; - _.each(lines, function(line) { + lines.forEach(function (line) { msg += '# ' + line + '\n'; }); @@ -2776,7 +2772,7 @@ GitEngine.prototype.log = function(ref, omitSet) { // now go through and collect logs var bigLogStr = ''; - _.each(toDump, function(c) { + toDump.forEach(function (c) { bigLogStr += c.getLogEntry(); }, this); @@ -2831,7 +2827,7 @@ GitEngine.prototype.getDownstreamSet = function(ancestor) { var here = queue.pop(); var children = here.get('children'); - _.each(children, addToExplored); + children.forEach(addToExplored); } return exploredSet; }; @@ -3009,7 +3005,7 @@ var Commit = Backbone.Model.extend({ }, removeFromParents: function() { - _.each(this.get('parents'), function(parent) { + this.get('parents').forEach(function (parent) { parent.removeChild(this); }, this); }, @@ -3052,11 +3048,11 @@ var Commit = Backbone.Model.extend({ removeChild: function(childToRemove) { var newChildren = []; - _.each(this.get('children'), function(child) { + this.get('children').forEach(function (child) { if (child !== childToRemove) { newChildren.push(child); } - }, this); + }); this.set('children', newChildren); }, @@ -3069,7 +3065,7 @@ var Commit = Backbone.Model.extend({ this.validateAtInit(); this.addNodeToVisuals(); - _.each(this.get('parents'), function(parent) { + (this.get('parents') || []).forEach(function (parent) { parent.get('children').push(this); this.addEdgeToVisuals(parent); }, this); From 7af2db3da50391d12e7a6f00cb55ccf61306b270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sat, 1 Dec 2018 08:20:42 +0700 Subject: [PATCH 028/359] Replace '_.map' to 'Array.prototype.map' --- src/js/git/commands.js | 2 +- src/js/git/index.js | 12 ++++++------ src/js/models/commandModel.js | 2 +- src/js/views/gitDemonstrationView.js | 4 ++-- src/js/views/levelDropdownView.js | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/js/git/commands.js b/src/js/git/commands.js index 949f47ae..0b8528eb 100644 --- a/src/js/git/commands.js +++ b/src/js/git/commands.js @@ -190,7 +190,7 @@ var commandConfig = { var set = Graph.getUpstreamSet(engine, 'HEAD'); // first resolve all the refs (as an error check) - var toCherrypick = _.map(generalArgs, function(arg) { + var toCherrypick = generalArgs.map(function (arg) { var commit = engine.getCommitFromRef(arg); // and check that its not upstream if (set[commit.get('id')]) { diff --git a/src/js/git/index.js b/src/js/git/index.js index e38fe572..b6874e8f 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -857,7 +857,7 @@ GitEngine.prototype.makeCommit = function(parents, id, options) { GitEngine.prototype.revert = function(whichCommits) { // resolve the commits we will rebase - var toRevert = _.map(whichCommits, function(stringRef) { + var toRevert = whichCommits.map(function(stringRef) { return this.getCommitFromRef(stringRef); }, this); @@ -1138,7 +1138,7 @@ GitEngine.prototype.push = function(options) { var makeCommit = function(id, parentIDs) { // need to get the parents first. since we order by depth, we know // the dependencies are there already - var parents = _.map(parentIDs, function(parentID) { + var parents = parentIDs.map(function(parentID) { return this.origin.refs[parentID]; }, this); return this.origin.makeCommit(parents, id); @@ -1246,7 +1246,7 @@ GitEngine.prototype.fetch = function(options) { } // get all remote branches and specify the dest / source pairs var allBranchesOnRemote = this.origin.branchCollection.toArray(); - var sourceDestPairs = _.map(allBranchesOnRemote, function(branch) { + var sourceDestPairs = allBranchesOnRemote.map(function(branch) { var branchName = branch.get('id'); didMakeBranch = didMakeBranch || this.makeRemoteBranchIfNeeded(branchName); @@ -1312,7 +1312,7 @@ GitEngine.prototype.fetchCore = function(sourceDestPairs, options) { var makeCommit = function(id, parentIDs) { // need to get the parents first. since we order by depth, we know // the dependencies are there already - var parents = _.map(parentIDs, function(parentID) { + var parents = parentIDs.map(function(parentID) { return this.refs[parentID]; }, this); return this.makeCommit(parents, id); @@ -1738,7 +1738,7 @@ GitEngine.prototype.updateBranchesFromSet = function(commitSet) { }); }, this); - var branchList = _.map(branchesToUpdate, function(val, id) { + var branchList = branchesToUpdate.map(function(val, id) { return id; }); return this.updateBranchesForHg(branchList); @@ -2340,7 +2340,7 @@ GitEngine.prototype.filterRebaseCommits = function( GitEngine.prototype.getRebasePreserveMergesParents = function(oldCommit) { var oldParents = oldCommit.get('parents'); - return _.map(oldParents, function(parent) { + return oldParents.map(function(parent) { var oldID = parent.get('id'); var newID = this.getMostRecentBumpedID(oldID); return this.refs[newID]; diff --git a/src/js/models/commandModel.js b/src/js/models/commandModel.js index a8264ba6..f8932e10 100644 --- a/src/js/models/commandModel.js +++ b/src/js/models/commandModel.js @@ -78,7 +78,7 @@ var Command = Backbone.Model.extend({ var generalArgs = this.getGeneralArgs(); var options = this.getOptionsMap(); - generalArgs = _.map(generalArgs, function(arg) { + generalArgs = generalArgs.map(function(arg) { return this.replaceDotWithHead(arg); }, this); var newMap = {}; diff --git a/src/js/views/gitDemonstrationView.js b/src/js/views/gitDemonstrationView.js index e769bd78..96460200 100644 --- a/src/js/views/gitDemonstrationView.js +++ b/src/js/views/gitDemonstrationView.js @@ -83,8 +83,8 @@ var GitDemonstrationView = ContainedBase.extend({ }, checkScroll: function() { - var children = this.$('div.demonstrationText').children(); - var heights = _.map(children, function(child) { return child.clientHeight; }); + var children = this.$('div.demonstrationText').children().toArray(); + var heights = children.map(function(child) { return child.clientHeight; }); var totalHeight = _.reduce(heights, function(a, b) { return a + b; }); if (totalHeight < this.$('div.demonstrationText').height()) { this.$('div.demonstrationText').addClass('noLongText'); diff --git a/src/js/views/levelDropdownView.js b/src/js/views/levelDropdownView.js index 31c29024..74fd809f 100644 --- a/src/js/views/levelDropdownView.js +++ b/src/js/views/levelDropdownView.js @@ -211,7 +211,7 @@ var LevelDropdownView = ContainedBase.extend({ }, getTabIndex: function() { - var ids = _.map(this.JSON.tabs, function(tab) { + var ids = this.JSON.tabs.map(function(tab) { return tab.id; }); return ids.indexOf(this.JSON.selectedTab); From e324e51587263c88fdaf0bbfd38f1735ef11d455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sat, 1 Dec 2018 08:22:40 +0700 Subject: [PATCH 029/359] Replace '_.reduce' to 'Array.prototype.reduce' --- src/js/views/gitDemonstrationView.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/views/gitDemonstrationView.js b/src/js/views/gitDemonstrationView.js index 96460200..13b0469f 100644 --- a/src/js/views/gitDemonstrationView.js +++ b/src/js/views/gitDemonstrationView.js @@ -85,7 +85,7 @@ var GitDemonstrationView = ContainedBase.extend({ checkScroll: function() { var children = this.$('div.demonstrationText').children().toArray(); var heights = children.map(function(child) { return child.clientHeight; }); - var totalHeight = _.reduce(heights, function(a, b) { return a + b; }); + var totalHeight = heights.reduce(function(a, b) { return a + b; }); if (totalHeight < this.$('div.demonstrationText').height()) { this.$('div.demonstrationText').addClass('noLongText'); } From dddf063146890ef4e0a898cd00426fd61f82e62a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sat, 1 Dec 2018 08:27:01 +0700 Subject: [PATCH 030/359] Replace '_.filter' to 'Array.prototype.filter' --- src/js/git/index.js | 10 +++++----- src/js/views/levelDropdownView.js | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/js/git/index.js b/src/js/git/index.js index b6874e8f..1b3299fc 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -755,14 +755,14 @@ GitEngine.prototype.getBranches = function() { GitEngine.prototype.getRemoteBranches = function() { var all = this.getBranches(); - return _.filter(all, function(branchJSON) { + return all.filter(function(branchJSON) { return branchJSON.remote === true; }); }; GitEngine.prototype.getLocalBranches = function() { var all = this.getBranches(); - return _.filter(all, function(branchJSON) { + return all.filter(function(branchJSON) { return branchJSON.remote === false; }); }; @@ -1131,7 +1131,7 @@ GitEngine.prototype.push = function(options) { // and remote master might be commits C2, C3, and C4, but the remote // might already have those commits. In this case, we don't need to // make them, so filter these out - commitsToMake = _.filter(commitsToMake, function(commitJSON) { + commitsToMake = commitsToMake.filter(function(commitJSON) { return !this.origin.refs[commitJSON.id]; }, this); @@ -1305,7 +1305,7 @@ GitEngine.prototype.fetchCore = function(sourceDestPairs, options) { // and remote master might be commits C2, C3, and C4, but we // might already have those commits. In this case, we don't need to // make them, so filter these out - commitsToMake = _.filter(commitsToMake, function(commitJSON) { + commitsToMake = commitsToMake.filter(function(commitJSON) { return !this.refs[commitJSON.id]; }, this); @@ -2315,7 +2315,7 @@ GitEngine.prototype.filterRebaseCommits = function( var uniqueIDs = {}; // resolve the commits we will rebase - return _.filter(toRebaseRough, function(commit) { + return toRebaseRough.filter(function(commit) { // no merge commits, unless we preserve if (commit.get('parents').length !== 1 && !options.preserveMerges) { return false; diff --git a/src/js/views/levelDropdownView.js b/src/js/views/levelDropdownView.js index 74fd809f..cfbfec3d 100644 --- a/src/js/views/levelDropdownView.js +++ b/src/js/views/levelDropdownView.js @@ -235,7 +235,7 @@ var LevelDropdownView = ContainedBase.extend({ }, getSequencesOnTab: function() { - return _.filter(this.sequences, function(sequenceName) { + return this.sequences.filter(function(sequenceName) { var tab = LEVELS.getTabForSequence(sequenceName); return tab === this.JSON.selectedTab; }, this); From ce61c97cf0e0309fbed2cccfcdb7545cad76a2ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sat, 1 Dec 2018 08:29:11 +0700 Subject: [PATCH 031/359] Replace '_.keys' to 'Object.prototype.keys' --- src/js/stores/LevelStore.js | 2 +- src/js/views/builderViews.js | 3 +-- src/js/views/rebaseView.js | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/js/stores/LevelStore.js b/src/js/stores/LevelStore.js index edacc524..3b160c3e 100644 --- a/src/js/stores/LevelStore.js +++ b/src/js/stores/LevelStore.js @@ -89,7 +89,7 @@ AppConstants.StoreSubscribePrototype, }, getSequences: function() { - return _.keys(levelSequences); + return Object.keys(levelSequences); }, getLevelsInSequence: function(sequenceName) { diff --git a/src/js/views/builderViews.js b/src/js/views/builderViews.js index 9d2ba96f..89a6f8b9 100644 --- a/src/js/views/builderViews.js +++ b/src/js/views/builderViews.js @@ -295,7 +295,7 @@ var MultiViewBuilder = ContainedBase.extend({ this.JSON = { views: this.getChildViews(), - supportedViews: _.keys(this.typeToConstructor) + supportedViews: Object.keys(this.typeToConstructor) }; this.container = new ModalTerminal({ @@ -416,4 +416,3 @@ exports.DemonstrationBuilder = DemonstrationBuilder; exports.TextGrabber = TextGrabber; exports.MultiViewBuilder = MultiViewBuilder; exports.MarkdownPresenter = MarkdownPresenter; - diff --git a/src/js/views/rebaseView.js b/src/js/views/rebaseView.js index 49403561..accae218 100644 --- a/src/js/views/rebaseView.js +++ b/src/js/views/rebaseView.js @@ -78,7 +78,7 @@ var InteractiveRebaseView = ContainedBase.extend({ render: function() { var json = { - num: _.keys(this.rebaseMap).length, + num: Object.keys(this.rebaseMap).length, solutionOrder: this.options.initialCommitOrdering }; From e17d974b55984e87c0cba5b24267d612f5db8d91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sat, 1 Dec 2018 08:40:56 +0700 Subject: [PATCH 032/359] Use 'util/escapeString' instead of _.escape --- src/js/git/commands.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/git/commands.js b/src/js/git/commands.js index 0b8528eb..88bf2bb5 100644 --- a/src/js/git/commands.js +++ b/src/js/git/commands.js @@ -1,3 +1,4 @@ +var escapeString = require('../util/escapeString'); var _ = require('underscore'); var intl = require('../intl'); @@ -830,7 +831,7 @@ var instantCommands = [ intl.str('git-version'), '
', intl.str('git-usage'), - _.escape(intl.str('git-usage-command')), + escapeString(intl.str('git-usage-command')), '
', intl.str('git-supported-commands'), '
' From d87fd095c083033d2cce7467ec5900318f4d6f1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sat, 1 Dec 2018 08:51:03 +0700 Subject: [PATCH 033/359] Use 'Object.values' and 'Object.keys' to get list 'keys' and 'values' --- src/js/git/index.js | 4 +--- src/js/models/commandModel.js | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/js/git/index.js b/src/js/git/index.js index 1b3299fc..d92567d7 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -2090,9 +2090,7 @@ GitEngine.prototype.hgRebase = function(destination, base) { }); }); - var branchList = _.map(branchMap, function(val, id) { - return id; - }); + var branchList = Object.keys(branchMap); chain = chain.then(function() { // now we just moved a bunch of commits, but we haven't updated the diff --git a/src/js/models/commandModel.js b/src/js/models/commandModel.js index f8932e10..07f02c87 100644 --- a/src/js/models/commandModel.js +++ b/src/js/models/commandModel.js @@ -83,7 +83,7 @@ var Command = Backbone.Model.extend({ }, this); var newMap = {}; _.each(options, function(args, key) { - newMap[key] = _.map(args, function(arg) { + newMap[key] = Object.values(args).map(function (arg) { return this.replaceDotWithHead(arg); }, this); }, this); From bd8009386de0cb04763619cb1bb45e036be8c1fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sat, 1 Dec 2018 11:28:04 +0700 Subject: [PATCH 034/359] Use 'Array.prototype.forEach' instead of '_.each' and '_.forEach' --- src/js/git/index.js | 12 +++++------- src/js/graph/index.js | 6 +++--- src/js/graph/treeCompare.js | 16 ++++++++-------- src/js/level/parseWaterfall.js | 9 ++++----- src/js/models/commandModel.js | 2 +- src/js/sandbox/commands.js | 4 ++-- src/js/stores/LevelStore.js | 4 ++-- src/js/views/commandViews.js | 3 +-- src/js/views/gitDemonstrationView.js | 2 +- src/js/views/levelDropdownView.js | 8 ++++---- src/js/views/multiView.js | 4 ++-- src/js/views/rebaseView.js | 4 ++-- src/js/visuals/index.js | 26 +++++++++++++------------- src/js/visuals/tree.js | 7 +++---- src/js/visuals/visBase.js | 11 +++++------ src/js/visuals/visBranch.js | 11 +++++------ src/js/visuals/visEdge.js | 2 +- src/js/visuals/visNode.js | 16 ++++++++-------- src/js/visuals/visTag.js | 9 ++++----- 19 files changed, 74 insertions(+), 82 deletions(-) diff --git a/src/js/git/index.js b/src/js/git/index.js index d92567d7..abbf4408 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -1551,11 +1551,9 @@ GitEngine.prototype.fakeTeamwork = function(numToMake, branch) { var deferred = Q.defer(); var chain = deferred.promise; - _.each(_.range(numToMake), function(i) { - chain = chain.then(function() { - return chainStep(); - }); - }); + for(var i = 0; i < numToMake; i++) { + chain = chain.then(chainStep); + } this.animationQueue.thenFinish(chain, deferred); }; @@ -2074,7 +2072,7 @@ GitEngine.prototype.hgRebase = function(destination, base) { var masterSet = {}; masterSet[baseCommit.get('id')] = true; - _.each([upstream, downstream].concat(moreSets), function(set) { + [upstream, downstream].concat(moreSets).forEach(function(set) { _.each(set, function(val, id) { masterSet[id] = true; }); @@ -2085,7 +2083,7 @@ GitEngine.prototype.hgRebase = function(destination, base) { var upstreamSet = this.getUpstreamBranchSet(); _.each(masterSet, function(val, commitID) { // now loop over that commits branches - _.each(upstreamSet[commitID], function(branchJSON) { + upstreamSet[commitID].forEach(function(branchJSON) { branchMap[branchJSON.id] = true; }); }); diff --git a/src/js/graph/index.js b/src/js/graph/index.js index ed2c0745..584f788d 100644 --- a/src/js/graph/index.js +++ b/src/js/graph/index.js @@ -85,7 +85,7 @@ var Graph = { var commitJSON = tree.commits[objID]; var parentObjs = []; - _.each(commitJSON.parents, function(parentID) { + commitJSON.parents.forEach(function(parentID) { parentObjs.push(this.getOrMakeRecursive(tree, createdSoFar, parentID)); }, this); @@ -143,7 +143,7 @@ var Graph = { var here = queue.pop(); var rents = here.get('parents'); - _.each(rents, addToExplored); + (rents || []).forEach(addToExplored); } return exploredSet; }, @@ -151,7 +151,7 @@ var Graph = { getUniqueObjects: function(objects) { var unique = {}; var result = []; - _.forEach(objects, function(object) { + objects.forEach(function(object) { if (unique[object.id]) { return; } diff --git a/src/js/graph/treeCompare.js b/src/js/graph/treeCompare.js index 823076b0..6318a3ec 100644 --- a/src/js/graph/treeCompare.js +++ b/src/js/graph/treeCompare.js @@ -115,7 +115,7 @@ TreeCompare.compareAllTagsWithinTrees = function(treeA, treeB) { TreeCompare.compareBranchesWithinTrees = function(treeA, treeB, branches) { var result = true; - _.each(branches, function(branchName) { + branches.forEach(function(branchName) { result = result && this.compareBranchWithinTrees(treeA, treeB, branchName); }, this); @@ -176,7 +176,7 @@ TreeCompare.compareBranchesWithinTreesHashAgnostic = function(treeA, treeB, bran var recurseCompare = this.getRecurseCompareHashAgnostic(treeA, treeB); var result = true; - _.each(branches, function(branchName) { + branches.forEach(function(branchName) { var branchA = treeA.branches[branchName]; var branchB = treeB.branches[branchName]; @@ -217,7 +217,7 @@ TreeCompare.evalAssertsOnBranch = function(tree, branchName, asserts) { } var result = true; - _.each(asserts, function(assert) { + asserts.forEach(function(assert) { try { result = result && assert(data); } catch (err) { @@ -305,7 +305,7 @@ TreeCompare.getRecurseCompare = function(treeA, treeB, options) { // so the index lookup is valid. for merge commits this will duplicate some of the // checking (because we aren't doing graph search) but it's not a huge deal var maxNumParents = Math.max(commitA.parents.length, commitB.parents.length); - _.each(_.range(maxNumParents), function(index) { + for (var index = 0; index < maxNumParents; index++) { var pAid = commitA.parents[index]; var pBid = commitB.parents[index]; @@ -315,7 +315,7 @@ TreeCompare.getRecurseCompare = function(treeA, treeB, options) { var childB = treeB.commits[pBid]; result = result && recurseCompare(childA, childB); - }, this); + } // if each of our children recursively are equal, we are good return result; }; @@ -377,7 +377,7 @@ TreeCompare.reduceTreeFields = function(trees) { tags: {} }; - _.each(trees, function(tree) { + trees.forEach(function(tree) { _.each(treeDefaults, function(val, key) { if (tree[key] === undefined) { tree[key] = val; @@ -391,7 +391,7 @@ TreeCompare.reduceTreeFields = function(trees) { _.each(objects, function(obj, objKey) { // our blank slate to copy over var blank = {}; - _.each(saveFields, function(field) { + saveFields.forEach(function(field) { if (obj[field] !== undefined) { blank[field] = obj[field]; } else if (defaults[field] !== undefined) { @@ -410,7 +410,7 @@ TreeCompare.reduceTreeFields = function(trees) { }); }; - _.each(trees, function(tree) { + trees.forEach(function(tree) { saveOnly(tree, 'commits', commitSaveFields, commitSortFields); saveOnly(tree, 'branches', branchSaveFields); saveOnly(tree, 'tags', tagSaveFields); diff --git a/src/js/level/parseWaterfall.js b/src/js/level/parseWaterfall.js index 4a711f4f..d84fde97 100644 --- a/src/js/level/parseWaterfall.js +++ b/src/js/level/parseWaterfall.js @@ -68,7 +68,7 @@ ParseWaterfall.prototype.addLast = function(which, value) { }; ParseWaterfall.prototype.expandAllShortcuts = function(commandStr) { - _.each(this.shortcutWaterfall, function(shortcutMap) { + this.shortcutWaterfall.forEach(function(shortcutMap) { commandStr = this.expandShortcut(commandStr, shortcutMap); }, this); return commandStr; @@ -87,13 +87,13 @@ ParseWaterfall.prototype.expandShortcut = function(commandStr, shortcutMap) { }; ParseWaterfall.prototype.processAllInstants = function(commandStr) { - _.each(this.instantWaterfall, function(instantCommands) { + this.instantWaterfall.forEach(function(instantCommands) { this.processInstant(commandStr, instantCommands); }, this); }; ParseWaterfall.prototype.processInstant = function(commandStr, instantCommands) { - _.each(instantCommands, function(tuple) { + instantCommands.forEach(function(tuple) { var regex = tuple[0]; var results = regex.exec(commandStr); if (results) { @@ -109,7 +109,7 @@ ParseWaterfall.prototype.parseAll = function(commandStr) { } var toReturn = false; - _.each(this.parseWaterfall, function(parseFunc) { + this.parseWaterfall.forEach(function(parseFunc) { var results = parseFunc(commandStr); if (results) { toReturn = results; @@ -120,4 +120,3 @@ ParseWaterfall.prototype.parseAll = function(commandStr) { }; exports.ParseWaterfall = ParseWaterfall; - diff --git a/src/js/models/commandModel.js b/src/js/models/commandModel.js index 07f02c87..b8a9569f 100644 --- a/src/js/models/commandModel.js +++ b/src/js/models/commandModel.js @@ -93,7 +93,7 @@ var Command = Backbone.Model.extend({ deleteOptions: function(options) { var map = this.getOptionsMap(); - _.each(options, function(option) { + options.forEach(function(option) { delete map[option]; }, this); this.setOptionsMap(map); diff --git a/src/js/sandbox/commands.js b/src/js/sandbox/commands.js index 83a741b0..8e3f57b1 100644 --- a/src/js/sandbox/commands.js +++ b/src/js/sandbox/commands.js @@ -98,7 +98,7 @@ var instantCommands = [ intl.str('show-all-commands'), '
' ]; - _.each(allCommands, function(regex, command) { + allCommands.forEach(function(regex, command) { lines.push(command); }); @@ -144,7 +144,7 @@ var getAllCommands = function() { allCommands[vcs + ' ' + method] = regex; }); }); - _.each(toDelete, function(key) { + toDelete.forEach(function(key) { delete allCommands[key]; }); diff --git a/src/js/stores/LevelStore.js b/src/js/stores/LevelStore.js index 3b160c3e..9f951b06 100644 --- a/src/js/stores/LevelStore.js +++ b/src/js/stores/LevelStore.js @@ -41,7 +41,7 @@ var validateLevel = function(level) { 'solutionCommand' ]; - _.each(requiredFields, function(field) { + requiredFields.forEach(function(field) { if (level[field] === undefined) { console.log(level); throw new Error('I need this field for a level: ' + field); @@ -59,7 +59,7 @@ _.each(levelSequences, function(levels, levelSequenceName) { } // for this particular sequence... - _.each(levels, function(level, index) { + levels.forEach(function(level, index) { validateLevel(level); var id = levelSequenceName + String(index + 1); diff --git a/src/js/views/commandViews.js b/src/js/views/commandViews.js index 63ebef01..8dfa71ef 100644 --- a/src/js/views/commandViews.js +++ b/src/js/views/commandViews.js @@ -173,7 +173,7 @@ var CommandPromptView = Backbone.View.extend({ which.reverse(); var str = ''; - _.each(which, function(text) { + which.forEach(function(text) { str += text + ';'; }, this); @@ -202,4 +202,3 @@ var CommandPromptView = Backbone.View.extend({ }); exports.CommandPromptView = CommandPromptView; - diff --git a/src/js/views/gitDemonstrationView.js b/src/js/views/gitDemonstrationView.js index 13b0469f..fc1da36d 100644 --- a/src/js/views/gitDemonstrationView.js +++ b/src/js/views/gitDemonstrationView.js @@ -168,7 +168,7 @@ var GitDemonstrationView = ContainedBase.extend({ var chainDeferred = Q.defer(); var chainPromise = chainDeferred.promise; - _.each(commands, function(command, index) { + commands.forEach(function(command, index) { chainPromise = chainPromise.then(function() { var myDefer = Q.defer(); this.mainVis.gitEngine.dispatch(command, myDefer); diff --git a/src/js/views/levelDropdownView.js b/src/js/views/levelDropdownView.js index cfbfec3d..faf95b33 100644 --- a/src/js/views/levelDropdownView.js +++ b/src/js/views/levelDropdownView.js @@ -292,7 +292,7 @@ var LevelDropdownView = ContainedBase.extend({ $(selector).toggleClass('selected', value); // also go find the series and update the about - _.each(this.seriesViews, function(view) { + this.seriesViews.forEach(function(view) { if (view.levelIDs.indexOf(id) === -1) { return; } @@ -343,14 +343,14 @@ var LevelDropdownView = ContainedBase.extend({ }, updateSolvedStatus: function() { - _.each(this.seriesViews, function(view) { + this.seriesViews.forEach(function(view) { view.updateSolvedStatus(); }, this); }, buildSequences: function() { this.seriesViews = []; - _.each(this.getSequencesOnTab(), function(sequenceName) { + this.getSequencesOnTab().forEach(function(sequenceName) { this.seriesViews.push(new SeriesView({ destination: this.$el, name: sequenceName, @@ -377,7 +377,7 @@ var SeriesView = BaseView.extend({ this.levelIDs = []; var firstLevelInfo = null; - _.each(this.levels, function(level) { + this.levels.forEach(function(level) { if (firstLevelInfo === null) { firstLevelInfo = this.formatLevelAbout(level.id); } diff --git a/src/js/views/multiView.js b/src/js/views/multiView.js index d85bafb9..9a3981ae 100644 --- a/src/js/views/multiView.js +++ b/src/js/views/multiView.js @@ -142,7 +142,7 @@ var MultiView = Backbone.View.extend({ // other views will take if they need to this.keyboardListener.mute(); - _.each(this.childViews, function(childView) { + this.childViews.forEach(function(childView) { childView.die(); }); @@ -183,7 +183,7 @@ var MultiView = Backbone.View.extend({ render: function() { // go through each and render... show the first - _.each(this.childViewJSONs, function(childViewJSON, index) { + this.childViewJSONs.forEach(function(childViewJSON, index) { var childView = this.createChildView(childViewJSON); this.childViews.push(childView); this.addNavToView(childView, index); diff --git a/src/js/views/rebaseView.js b/src/js/views/rebaseView.js index accae218..b79e0b64 100644 --- a/src/js/views/rebaseView.js +++ b/src/js/views/rebaseView.js @@ -19,7 +19,7 @@ var InteractiveRebaseView = ContainedBase.extend({ this.rebaseEntries = new RebaseEntryCollection(); options.toRebase.reverse(); - _.each(options.toRebase, function(commit) { + options.toRebase.forEach(function(commit) { var id = commit.get('id'); this.rebaseMap[id] = commit; @@ -63,7 +63,7 @@ var InteractiveRebaseView = ContainedBase.extend({ // now get the real array var toRebase = []; - _.each(uiOrder, function(id) { + uiOrder.forEach(function(id) { // the model pick check if (this.entryObjMap[id].get('pick')) { toRebase.unshift(this.rebaseMap[id]); diff --git a/src/js/visuals/index.js b/src/js/visuals/index.js index 604afef6..08fe4db6 100644 --- a/src/js/visuals/index.js +++ b/src/js/visuals/index.js @@ -58,7 +58,7 @@ GitVisuals.prototype.defer = function(action) { }; GitVisuals.prototype.deferFlush = function() { - _.each(this.deferred, function(action) { + this.deferred.forEach(function(action) { action(); }, this); this.deferred = []; @@ -68,17 +68,17 @@ GitVisuals.prototype.resetAll = function() { // make sure to copy these collections because we remove // items in place and underscore is too dumb to detect length change var edges = this.visEdgeCollection.toArray(); - _.each(edges, function(visEdge) { + edges.forEach(function(visEdge) { visEdge.remove(); }, this); var branches = this.visBranchCollection.toArray(); - _.each(branches, function(visBranch) { + branches.forEach(function(visBranch) { visBranch.remove(); }, this); var tags = this.visTagCollection.toArray(); - _.each(tags, function(visTag) { + tags.forEach(function(visTag) { visTag.remove(); }, this); @@ -332,7 +332,7 @@ GitVisuals.prototype.explodeNodes = function(speed) { // are called unnecessarily when they have almost // zero speed. would be interesting to see performance differences var keepGoing = []; - _.each(funcs, function(func) { + funcs.forEach(function(func) { if (func()) { keepGoing.push(func); } @@ -485,7 +485,7 @@ GitVisuals.prototype.getBlendedHuesForCommit = function(commit) { GitVisuals.prototype.blendHuesFromBranchStack = function(branchStackArray) { var hueStrings = []; - _.each(branchStackArray, function(branchWrapper) { + branchStackArray.forEach(function(branchWrapper) { var fill = branchWrapper.obj.get('visBranch').get('fill'); if (fill.slice(0,3) !== 'hsb') { @@ -525,7 +525,7 @@ GitVisuals.prototype.getCommitUpstreamStatus = function(commit) { GitVisuals.prototype.calcTagStacks = function() { var tags = this.gitEngine.getTags(); var map = {}; - _.each(tags, function(tag) { + tags.forEach(function(tag) { var thisId = tag.target.get('id'); map[thisId] = map[thisId] || []; @@ -542,7 +542,7 @@ GitVisuals.prototype.calcTagStacks = function() { GitVisuals.prototype.calcBranchStacks = function() { var branches = this.gitEngine.getBranches(); var map = {}; - _.each(branches, function(branch) { + branches.forEach(function(branch) { var thisId = branch.target.get('id'); map[thisId] = map[thisId] || []; @@ -572,7 +572,7 @@ GitVisuals.prototype.calcWidth = function() { GitVisuals.prototype.maxWidthRecursive = function(commit) { var childrenTotalWidth = 0; - _.each(commit.get('children'), function(child) { + commit.get('children').forEach(function(child) { // only include this if we are the "main" parent of // this child if (child.isMainParent(commit)) { @@ -601,14 +601,14 @@ GitVisuals.prototype.assignBoundsRecursive = function(commit, min, max) { // basic box-flex model var totalFlex = 0; var children = commit.get('children'); - _.each(children, function(child) { + children.forEach(function(child) { if (child.isMainParent(commit)) { totalFlex += child.get('visNode').getMaxWidthScaled(); } }, this); var prevBound = min; - _.each(children, function(child, index) { + children.forEach(function(child, index) { if (!child.isMainParent(commit)) { return; } @@ -777,7 +777,7 @@ GitVisuals.prototype.calcDepthRecursive = function(commit, depth) { var children = commit.get('children'); var maxDepth = depth; - _.each(children, function(child) { + children.forEach(function(child) { var d = this.calcDepthRecursive(child, depth + 1); maxDepth = Math.max(d, maxDepth); }, this); @@ -924,7 +924,7 @@ function blendHueStrings(hueStrings) { var totalBright = 0; var length = hueStrings.length; - _.each(hueStrings, function(hueString) { + hueStrings.forEach(function(hueString) { var exploded = hueString.split('(')[1]; exploded = exploded.split(')')[0]; exploded = exploded.split(','); diff --git a/src/js/visuals/tree.js b/src/js/visuals/tree.js index 5d9b92dd..42de848c 100644 --- a/src/js/visuals/tree.js +++ b/src/js/visuals/tree.js @@ -3,7 +3,7 @@ var Backbone = require('backbone'); var VisBase = Backbone.Model.extend({ removeKeys: function(keys) { - _.each(keys, function(key) { + keys.forEach(function(key) { if (this.get(key)) { this.get(key).remove(); } @@ -25,7 +25,7 @@ var VisBase = Backbone.Model.extend({ var attr = this.getAttributes(); // safely insert this attribute into all the keys we want - _.each(keys.include, function(key) { + keys.include.forEach(function(key) { attr[key] = Object.assign( {}, attr[key], @@ -33,7 +33,7 @@ var VisBase = Backbone.Model.extend({ ); }); - _.each(keys.exclude, function(key) { + keys.exclude.forEach(function(key) { delete attr[key]; }); @@ -42,4 +42,3 @@ var VisBase = Backbone.Model.extend({ }); exports.VisBase = VisBase; - diff --git a/src/js/visuals/visBase.js b/src/js/visuals/visBase.js index 5196a575..bc4ace2a 100644 --- a/src/js/visuals/visBase.js +++ b/src/js/visuals/visBase.js @@ -3,7 +3,7 @@ var Backbone = require('backbone'); var VisBase = Backbone.Model.extend({ removeKeys: function(keys) { - _.each(keys, function(key) { + keys.forEach(function(key) { if (this.get(key)) { this.get(key).remove(); } @@ -35,14 +35,14 @@ var VisBase = Backbone.Model.extend({ }, setAttrBase: function(keys, attr, instant, speed, easing) { - _.each(keys, function(key) { + keys.forEach(function(key) { if (instant) { this.get(key).attr(attr[key]); } else { this.get(key).stop(); this.get(key).animate(attr[key], speed, easing); // some keys don't support animating too, so set those instantly here - _.forEach(this.getNonAnimateKeys(), function(nonAnimateKey) { + this.getNonAnimateKeys().forEach(function(nonAnimateKey) { if (attr[key] && attr[key][nonAnimateKey] !== undefined) { this.get(key).attr(nonAnimateKey, attr[key][nonAnimateKey]); } @@ -70,7 +70,7 @@ var VisBase = Backbone.Model.extend({ var attr = this.getAttributes(); // safely insert this attribute into all the keys we want - _.each(keys.include, function(key) { + keys.include.forEach(function(key) { attr[key] = Object.assign( {}, attr[key], @@ -78,7 +78,7 @@ var VisBase = Backbone.Model.extend({ ); }); - _.each(keys.exclude, function(key) { + keys.exclude.forEach(function(key) { delete attr[key]; }); @@ -87,4 +87,3 @@ var VisBase = Backbone.Model.extend({ }); exports.VisBase = VisBase; - diff --git a/src/js/visuals/visBranch.js b/src/js/visuals/visBranch.js index 27fadfc4..73a55305 100644 --- a/src/js/visuals/visBranch.js +++ b/src/js/visuals/visBranch.js @@ -167,7 +167,7 @@ var VisBranch = VisBase.extend({ var myArray = this.getBranchStackArray(); var index = -1; - _.each(myArray, function(branch, i) { + myArray.forEach(function(branch, i) { if (branch.obj == this.get('branch')) { index = i; } @@ -279,7 +279,7 @@ var VisBranch = VisBase.extend({ arrowInnerLow, arrowStartLow ]; - _.each(coords, function(pos) { + coords.forEach(function(pos) { pathStr += 'L' + toStringCoords(pos) + ' '; }, this); pathStr += 'z'; @@ -309,7 +309,7 @@ var VisBranch = VisBase.extend({ } var maxWidth = 0; - _.each(this.getBranchStackArray(), function(branch) { + this.getBranchStackArray().forEach(function(branch) { maxWidth = Math.max(maxWidth, getTextWidth( branch.obj.get('visBranch') )); @@ -432,7 +432,7 @@ var VisBranch = VisBase.extend({ // set CSS var keys = ['text', 'rect', 'arrow']; - _.each(keys, function(key) { + keys.forEach(function(key) { $(this.get(key).node).css(attr.css); }, this); @@ -451,7 +451,7 @@ var VisBranch = VisBase.extend({ this.get('arrow') ]; - _.each(objs, function(rObj) { + objs.forEach(function(rObj) { rObj.click(this.onClick.bind(this)); }, this); }, @@ -577,4 +577,3 @@ var VisBranchCollection = Backbone.Collection.extend({ exports.VisBranchCollection = VisBranchCollection; exports.VisBranch = VisBranch; exports.randomHueString = randomHueString; - diff --git a/src/js/visuals/visEdge.js b/src/js/visuals/visEdge.js index b47ef8de..cf1d7cea 100644 --- a/src/js/visuals/visEdge.js +++ b/src/js/visuals/visEdge.js @@ -15,7 +15,7 @@ var VisEdge = VisBase.extend({ validateAtInit: function() { var required = ['tail', 'head']; - _.each(required, function(key) { + required.forEach(function(key) { if (!this.get(key)) { throw new Error(key + ' is required!'); } diff --git a/src/js/visuals/visNode.js b/src/js/visuals/visNode.js index 6d3e5cb9..5b42138b 100644 --- a/src/js/visuals/visNode.js +++ b/src/js/visuals/visNode.js @@ -261,33 +261,33 @@ var VisNode = VisBase.extend({ }, setOutgoingEdgesOpacity: function(opacity) { - _.each(this.get('outgoingEdges'), function(edge) { + this.get('outgoingEdges').forEach(function(edge) { edge.setOpacity(opacity); }); }, animateOutgoingEdgesToAttr: function(snapShot, speed, easing) { - _.each(this.get('outgoingEdges'), function(edge) { + this.get('outgoingEdges').forEach(function(edge) { var attr = snapShot[edge.getID()]; edge.animateToAttr(attr); }, this); }, animateOutgoingEdges: function(speed, easing) { - _.each(this.get('outgoingEdges'), function(edge) { + this.get('outgoingEdges').forEach(function(edge) { edge.animateUpdatedPath(speed, easing); }, this); }, animateOutgoingEdgesFromSnapshot: function(snapshot, speed, easing) { - _.each(this.get('outgoingEdges'), function(edge) { + this.get('outgoingEdges').forEach(function(edge) { var attr = snapshot[edge.getID()]; edge.animateToAttr(attr, speed, easing); }, this); }, setOutgoingEdgesBirthPosition: function(parentCoords) { - _.each(this.get('outgoingEdges'), function(edge) { + this.get('outgoingEdges').forEach(function(edge) { var headPos = edge.get('head').getScreenCoords(); var path = edge.genSmoothBezierPathStringFromCoords(parentCoords, headPos); edge.get('path').stop(); @@ -334,7 +334,7 @@ var VisNode = VisBase.extend({ } var commandStr = 'git checkout ' + this.get('commit').get('id'); var Main = require('../app'); - _.each([this.get('circle'), this.get('text')], function(rObj) { + [this.get('circle'), this.get('text')].forEach(function(rObj) { rObj.click(function() { Main.getEventBaton().trigger('commandSubmitted', commandStr); }); @@ -347,7 +347,7 @@ var VisNode = VisBase.extend({ // set the opacity on my stuff var keys = ['circle', 'text']; - _.each(keys, function(key) { + keys.forEach(function(key) { this.get(key).attr({ opacity: opacity }); @@ -371,7 +371,7 @@ var VisNode = VisBase.extend({ }, removeAllEdges: function() { - _.each(this.get('outgoingEdges'), function(edge) { + this.get('outgoingEdges').forEach(function(edge) { edge.remove(); }, this); }, diff --git a/src/js/visuals/visTag.js b/src/js/visuals/visTag.js index f11afe3a..3c22d47c 100644 --- a/src/js/visuals/visTag.js +++ b/src/js/visuals/visTag.js @@ -95,7 +95,7 @@ var VisTag = VisBase.extend({ var myArray = this.getTagStackArray(); var index = -1; - _.each(myArray, function(Tag, i) { + myArray.forEach(function(Tag, i) { if (Tag.obj == this.get('tag')) { index = i; } @@ -175,7 +175,7 @@ var VisTag = VisBase.extend({ var textNode = this.get('text').node; var maxWidth = 0; - _.each(this.getTagStackArray(), function(Tag) { + this.getTagStackArray().forEach(function(Tag) { maxWidth = Math.max(maxWidth, getTextWidth( Tag.obj.get('visTag') )); @@ -271,7 +271,7 @@ var VisTag = VisBase.extend({ // set CSS var keys = ['text', 'rect']; - _.each(keys, function(key) { + keys.forEach(function(key) { $(this.get(key).node).css(attr.css); }, this); @@ -289,7 +289,7 @@ var VisTag = VisBase.extend({ this.get('text') ]; - _.each(objs, function(rObj) { + objs.forEach(function(rObj) { rObj.click(this.onClick.bind(this)); }, this); }, @@ -405,4 +405,3 @@ var VisTagCollection = Backbone.Collection.extend({ exports.VisTagCollection = VisTagCollection; exports.VisTag = VisTag; exports.randomHueString = randomHueString; - From 96ddb5041a87cd5791fa762d259df117b5007275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sat, 1 Dec 2018 12:33:23 +0700 Subject: [PATCH 035/359] Use 'Object.values' and 'Object.keys' instead of '_.each(object)' --- src/js/commands/index.js | 13 +++++++++---- src/js/git/commands.js | 5 +++-- src/js/git/index.js | 21 +++++++++++---------- src/js/graph/treeCompare.js | 19 +++++++++++-------- src/js/level/index.js | 5 +++-- src/js/level/parseWaterfall.js | 6 ++++-- src/js/models/commandModel.js | 6 ++++-- src/js/sandbox/commands.js | 7 +++++-- src/js/stores/LevelStore.js | 3 ++- 9 files changed, 52 insertions(+), 33 deletions(-) diff --git a/src/js/commands/index.js b/src/js/commands/index.js index 64706d34..710c5ab3 100644 --- a/src/js/commands/index.js +++ b/src/js/commands/index.js @@ -102,8 +102,10 @@ var commands = { }, loop: function(callback, context) { - _.each(commandConfigs, function(commandConfig, vcs) { - _.each(commandConfig, function(config, name) { + Object.keys(commandConfigs).forEach(function(vcs) { + var commandConfig = commandConfigs[vcs]; + Object.keys(commandConfig).forEach(function(name) { + var config = commandConfig[name]; callback(config, name, vcs); }); }); @@ -116,8 +118,11 @@ var parse = function(str) { var options; // see if we support this particular command - _.each(commands.getRegexMap(), function (map, thisVCS) { - _.each(map, function(regex, thisMethod) { + var regexMap = commands.getRegexMap(); + Object.keys(regexMap).forEach(function (thisVCS) { + var map = regexMap[thisVCS]; + Object.keys(map).forEach(function(thisMethod) { + var regex = map[thisMethod]; if (regex.exec(str)) { vcs = thisVCS; method = thisMethod; diff --git a/src/js/git/commands.js b/src/js/git/commands.js index 88bf2bb5..a34cbfaf 100644 --- a/src/js/git/commands.js +++ b/src/js/git/commands.js @@ -839,9 +839,10 @@ var instantCommands = [ var commands = require('../commands').commands.getOptionMap()['git']; // build up a nice display of what we support - _.each(commands, function(commandOptions, command) { + Object.keys(commands).forEach(function(command) { + var commandOptions = commands[command]; lines.push('git ' + command); - _.each(commandOptions, function(vals, optionName) { + Object.keys(commandOptions).forEach(function(optionName) { lines.push('\t ' + optionName); }, this); }, this); diff --git a/src/js/git/index.js b/src/js/git/index.js index abbf4408..e3f8b8dd 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -280,18 +280,18 @@ GitEngine.prototype.instantiateFromTree = function(tree) { // now we do the loading part var createdSoFar = {}; - _.each(tree.commits, function(commitJSON) { + Object.values(tree.commits).forEach(function(commitJSON) { var commit = this.getOrMakeRecursive(tree, createdSoFar, commitJSON.id, this.gitVisuals); this.commitCollection.add(commit); }, this); - _.each(tree.branches, function(branchJSON) { + Object.values(tree.branches).forEach(function(branchJSON) { var branch = this.getOrMakeRecursive(tree, createdSoFar, branchJSON.id, this.gitVisuals); this.branchCollection.add(branch, {silent: true}); }, this); - _.each(tree.tags, function(tagJSON) { + Object.values(tree.tags || {}).forEach(function(tagJSON) { var tag = this.getOrMakeRecursive(tree, createdSoFar, tagJSON.id, this.gitVisuals); this.tagCollection.add(tag, {silent: true}); @@ -360,7 +360,8 @@ GitEngine.prototype.makeOrigin = function(treeString) { var originTree = JSON.parse(unescape(treeString)); // make an origin branch for each branch mentioned in the tree if its // not made already... - _.each(originTree.branches, function(branchJSON, branchName) { + Object.keys(originTree.branches).forEach(function(branchName) { + var branchJSON = originTree.branches[branchName]; if (this.refs[ORIGIN_PREFIX + branchName]) { // we already have this branch return; @@ -1802,7 +1803,7 @@ GitEngine.prototype.updateBranchesForHg = function(branchList) { GitEngine.prototype.updateCommitParentsForHgRebase = function(commitSet) { var anyChange = false; - _.each(commitSet, function(val, commitID) { + Object.keys(commitSet).forEach(function(commitID) { var commit = this.refs[commitID]; var thisUpdated = commit.checkForUpdatedParent(this); anyChange = anyChange || thisUpdated; @@ -1819,7 +1820,7 @@ GitEngine.prototype.pruneTree = function() { var set = this.getUpstreamBranchSet(); // don't prune commits that HEAD depends on var headSet = Graph.getUpstreamSet(this, 'HEAD'); - _.each(headSet, function(val, commitID) { + Object.keys(headSet).forEach(function(commitID) { set[commitID] = true; }); @@ -2066,14 +2067,14 @@ GitEngine.prototype.hgRebase = function(destination, base) { // and NOWWWwwww get all the descendants of this set var moreSets = []; - _.each(upstream, function(val, id) { + Object.keys(upstream).forEach(function(id) { moreSets.push(this.getDownstreamSet(id)); }, this); var masterSet = {}; masterSet[baseCommit.get('id')] = true; [upstream, downstream].concat(moreSets).forEach(function(set) { - _.each(set, function(val, id) { + Object.keys(set).forEach(function(id) { masterSet[id] = true; }); }); @@ -2081,7 +2082,7 @@ GitEngine.prototype.hgRebase = function(destination, base) { // we also need the branches POINTING to master set var branchMap = {}; var upstreamSet = this.getUpstreamBranchSet(); - _.each(masterSet, function(val, commitID) { + Object.keys(masterSet).forEach(function(commitID) { // now loop over that commits branches upstreamSet[commitID].forEach(function(branchJSON) { branchMap[branchJSON.id] = true; @@ -2305,7 +2306,7 @@ GitEngine.prototype.filterRebaseCommits = function( options ) { var changesAlreadyMade = {}; - _.each(stopSet, function(val, key) { + Object.keys(stopSet).forEach(function(key) { changesAlreadyMade[this.scrapeBaseID(key)] = true; }, this); var uniqueIDs = {}; diff --git a/src/js/graph/treeCompare.js b/src/js/graph/treeCompare.js index 6318a3ec..9b37bc60 100644 --- a/src/js/graph/treeCompare.js +++ b/src/js/graph/treeCompare.js @@ -145,8 +145,7 @@ TreeCompare.compareAllBranchesWithinTreesHashAgnostic = function(treeA, treeB) { treeA.branches, treeB.branches ); - var branchNames = []; - _.each(allBranches, function(obj, name) { branchNames.push(name); }); + var branchNames = Object.keys(allBranches || {}); return this.compareBranchesWithinTreesHashAgnostic(treeA, treeB, branchNames); }; @@ -188,7 +187,8 @@ TreeCompare.compareBranchesWithinTreesHashAgnostic = function(treeA, treeB, bran TreeCompare.evalAsserts = function(tree, assertsPerBranch) { var result = true; - _.each(assertsPerBranch, function(asserts, branchName) { + Object.keys(assertsPerBranch).forEach(function(branchName) { + var asserts = assertsPerBranch[branchName]; result = result && this.evalAssertsOnBranch(tree, branchName, asserts); }, this); return result; @@ -327,9 +327,10 @@ TreeCompare.lowercaseTree = function(tree) { tree.HEAD.target = tree.HEAD.target.toLocaleLowerCase(); } - var branches = tree.branches; + var branches = tree.branches || {}; tree.branches = {}; - _.each(branches, function(obj, name) { + Object.keys(branches).forEach(function(name) { + var obj = branches[name]; obj.id = obj.id.toLocaleLowerCase(); tree.branches[name.toLocaleLowerCase()] = obj; }); @@ -378,7 +379,8 @@ TreeCompare.reduceTreeFields = function(trees) { }; trees.forEach(function(tree) { - _.each(treeDefaults, function(val, key) { + Object.keys(treeDefaults).forEach(function(key) { + var val = treeDefaults[key]; if (tree[key] === undefined) { tree[key] = val; } @@ -388,7 +390,8 @@ TreeCompare.reduceTreeFields = function(trees) { // this function saves only the specified fields of a tree var saveOnly = function(tree, treeKey, saveFields, sortFields) { var objects = tree[treeKey]; - _.each(objects, function(obj, objKey) { + Object.keys(objects).forEach(function(objKey) { + var obj = objects[objKey]; // our blank slate to copy over var blank = {}; saveFields.forEach(function(field) { @@ -399,7 +402,7 @@ TreeCompare.reduceTreeFields = function(trees) { } }); - _.each(sortFields, function(field) { + Object.values(sortFields || {}).forEach(function(field) { // also sort some fields if (obj[field]) { obj[field].sort(); diff --git a/src/js/level/index.js b/src/js/level/index.js index e2801d6e..d8737456 100644 --- a/src/js/level/index.js +++ b/src/js/level/index.js @@ -406,8 +406,9 @@ var Level = Sandbox.extend({ } var matched = false; - _.each(Commands.commands.getCommandsThatCount(), function(map) { - _.each(map, function(regex) { + var commandsThatCount = Commands.commands.getCommandsThatCount(); + Object.values(commandsThatCount).forEach(function(map) { + Object.values(map).forEach(function(regex) { matched = matched || regex.test(command.get('rawStr')); }); }); diff --git a/src/js/level/parseWaterfall.js b/src/js/level/parseWaterfall.js index d84fde97..b457893d 100644 --- a/src/js/level/parseWaterfall.js +++ b/src/js/level/parseWaterfall.js @@ -75,8 +75,10 @@ ParseWaterfall.prototype.expandAllShortcuts = function(commandStr) { }; ParseWaterfall.prototype.expandShortcut = function(commandStr, shortcutMap) { - _.each(shortcutMap, function(map, vcs) { - _.each(map, function(regex, method) { + Object.keys(shortcutMap).forEach(function(vcs) { + var map = shortcutMap[vcs]; + Object.keys(map).forEach(function(method) { + var regex = map[method]; var results = regex.exec(commandStr); if (results) { commandStr = vcs + ' ' + method + ' ' + commandStr.slice(results[0].length); diff --git a/src/js/models/commandModel.js b/src/js/models/commandModel.js index b8a9569f..7e011896 100644 --- a/src/js/models/commandModel.js +++ b/src/js/models/commandModel.js @@ -82,7 +82,8 @@ var Command = Backbone.Model.extend({ return this.replaceDotWithHead(arg); }, this); var newMap = {}; - _.each(options, function(args, key) { + Object.keys(options).forEach(function(key) { + var args = options[key]; newMap[key] = Object.values(args).map(function (arg) { return this.replaceDotWithHead(arg); }, this); @@ -273,7 +274,8 @@ var Command = Backbone.Model.extend({ return false; } - _.each(results.toSet, function(obj, key) { + Object.keys(results.toSet).forEach(function(key) { + var obj = results.toSet[key]; // data comes back from the parsing functions like // options (etc) that need to be set this.set(key, obj); diff --git a/src/js/sandbox/commands.js b/src/js/sandbox/commands.js index 8e3f57b1..27151ee2 100644 --- a/src/js/sandbox/commands.js +++ b/src/js/sandbox/commands.js @@ -139,8 +139,11 @@ var getAllCommands = function() { require('../level').regexMap, regexMap ); - _.each(Commands.commands.getRegexMap(), function(map, vcs) { - _.each(map, function(regex, method) { + var mRegexMap = Commands.commands.getRegexMap(); + Object.keys(mRegexMap).forEach(function(vcs) { + var map = mRegexMap[vcs]; + Object.keys(map).forEach(function(method) { + var regex = map[method]; allCommands[vcs + ' ' + method] = regex; }); }); diff --git a/src/js/stores/LevelStore.js b/src/js/stores/LevelStore.js index 9f951b06..c5e1a7ba 100644 --- a/src/js/stores/LevelStore.js +++ b/src/js/stores/LevelStore.js @@ -52,7 +52,8 @@ var validateLevel = function(level) { /** * Unpack the level sequences. */ -_.each(levelSequences, function(levels, levelSequenceName) { +Object.keys(levelSequences).forEach(function(levelSequenceName) { + var levels = levelSequences[levelSequenceName]; _sequences.push(levelSequenceName); if (!levels || !levels.length) { throw new Error('no empty sequences allowed'); From 9365454cf36f8f1e9be43839afada0c03b60a592 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sat, 1 Dec 2018 12:51:15 +0700 Subject: [PATCH 036/359] Use 'Array.prototype.includes' instead of '_.include' --- src/js/visuals/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/visuals/index.js b/src/js/visuals/index.js index 08fe4db6..80d2d806 100644 --- a/src/js/visuals/index.js +++ b/src/js/visuals/index.js @@ -354,7 +354,7 @@ GitVisuals.prototype.explodeNodes = function(speed) { GitVisuals.prototype.animateAllFromAttrToAttr = function(fromSnapshot, toSnapshot, idsToOmit) { var animate = function(obj) { var id = obj.getID(); - if (_.include(idsToOmit, id)) { + if (idsToOmit.includes(id)) { return; } From 27ef578b2ebc83865f0a4282616869b937da534d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sat, 1 Dec 2018 13:04:24 +0700 Subject: [PATCH 037/359] Remove 16 underscore requires --- src/js/commands/index.js | 1 - src/js/git/commands.js | 1 - src/js/git/index.js | 1 - src/js/graph/index.js | 2 -- src/js/level/builder.js | 1 - src/js/level/index.js | 1 - src/js/level/parseWaterfall.js | 2 -- src/js/models/commandModel.js | 1 - src/js/sandbox/commands.js | 1 - src/js/views/commandViews.js | 1 - src/js/visuals/tree.js | 1 - src/js/visuals/visBase.js | 1 - src/js/visuals/visBranch.js | 1 - src/js/visuals/visEdge.js | 1 - src/js/visuals/visNode.js | 1 - src/js/visuals/visTag.js | 1 - 16 files changed, 18 deletions(-) diff --git a/src/js/commands/index.js b/src/js/commands/index.js index 710c5ab3..95011224 100644 --- a/src/js/commands/index.js +++ b/src/js/commands/index.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var intl = require('../intl'); var Errors = require('../util/errors'); diff --git a/src/js/git/commands.js b/src/js/git/commands.js index a34cbfaf..4c083d5e 100644 --- a/src/js/git/commands.js +++ b/src/js/git/commands.js @@ -1,5 +1,4 @@ var escapeString = require('../util/escapeString'); -var _ = require('underscore'); var intl = require('../intl'); var Graph = require('../graph'); diff --git a/src/js/git/index.js b/src/js/git/index.js index e3f8b8dd..d03a2075 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var Backbone = require('backbone'); var Q = require('q'); diff --git a/src/js/graph/index.js b/src/js/graph/index.js index 584f788d..2eaf6cab 100644 --- a/src/js/graph/index.js +++ b/src/js/graph/index.js @@ -1,5 +1,3 @@ -var _ = require('underscore'); - function invariant(truthy, reason) { if (!truthy) { throw new Error(reason); diff --git a/src/js/level/builder.js b/src/js/level/builder.js index a5a848a6..63ebdef9 100644 --- a/src/js/level/builder.js +++ b/src/js/level/builder.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var Backbone = require('backbone'); var Q = require('q'); diff --git a/src/js/level/index.js b/src/js/level/index.js index d8737456..4bac1b5b 100644 --- a/src/js/level/index.js +++ b/src/js/level/index.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var Q = require('q'); var util = require('../util'); diff --git a/src/js/level/parseWaterfall.js b/src/js/level/parseWaterfall.js index b457893d..b58e7e00 100644 --- a/src/js/level/parseWaterfall.js +++ b/src/js/level/parseWaterfall.js @@ -1,5 +1,3 @@ -var _ = require('underscore'); - var GitCommands = require('../git/commands'); var Commands = require('../commands'); var SandboxCommands = require('../sandbox/commands'); diff --git a/src/js/models/commandModel.js b/src/js/models/commandModel.js index 7e011896..76e94d61 100644 --- a/src/js/models/commandModel.js +++ b/src/js/models/commandModel.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var Backbone = require('backbone'); var Errors = require('../util/errors'); diff --git a/src/js/sandbox/commands.js b/src/js/sandbox/commands.js index 27151ee2..8b913564 100644 --- a/src/js/sandbox/commands.js +++ b/src/js/sandbox/commands.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var util = require('../util'); var constants = require('../util/constants'); diff --git a/src/js/views/commandViews.js b/src/js/views/commandViews.js index 8dfa71ef..b47d4bfa 100644 --- a/src/js/views/commandViews.js +++ b/src/js/views/commandViews.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var Backbone = require('backbone'); var Main = require('../app'); diff --git a/src/js/visuals/tree.js b/src/js/visuals/tree.js index 42de848c..ad270a60 100644 --- a/src/js/visuals/tree.js +++ b/src/js/visuals/tree.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var Backbone = require('backbone'); var VisBase = Backbone.Model.extend({ diff --git a/src/js/visuals/visBase.js b/src/js/visuals/visBase.js index bc4ace2a..fb6a68a1 100644 --- a/src/js/visuals/visBase.js +++ b/src/js/visuals/visBase.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var Backbone = require('backbone'); var VisBase = Backbone.Model.extend({ diff --git a/src/js/visuals/visBranch.js b/src/js/visuals/visBranch.js index 73a55305..ddac02f4 100644 --- a/src/js/visuals/visBranch.js +++ b/src/js/visuals/visBranch.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var Backbone = require('backbone'); var GRAPHICS = require('../util/constants').GRAPHICS; diff --git a/src/js/visuals/visEdge.js b/src/js/visuals/visEdge.js index cf1d7cea..355efcf4 100644 --- a/src/js/visuals/visEdge.js +++ b/src/js/visuals/visEdge.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var Backbone = require('backbone'); var GRAPHICS = require('../util/constants').GRAPHICS; diff --git a/src/js/visuals/visNode.js b/src/js/visuals/visNode.js index 5b42138b..f9952d29 100644 --- a/src/js/visuals/visNode.js +++ b/src/js/visuals/visNode.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var Backbone = require('backbone'); var GRAPHICS = require('../util/constants').GRAPHICS; diff --git a/src/js/visuals/visTag.js b/src/js/visuals/visTag.js index 3c22d47c..d07f7435 100644 --- a/src/js/visuals/visTag.js +++ b/src/js/visuals/visTag.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var Backbone = require('backbone'); var GRAPHICS = require('../util/constants').GRAPHICS; From d088643f2e09f2e57f4184f104f5442cd777d1e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sat, 1 Dec 2018 23:11:29 +0700 Subject: [PATCH 038/359] Fix space-group in --- src/js/commands/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/js/commands/index.js b/src/js/commands/index.js index 2f896e1c..4ad8128f 100644 --- a/src/js/commands/index.js +++ b/src/js/commands/index.js @@ -123,11 +123,11 @@ var parse = function(str) { method = thisMethod; // every valid regex has to have the parts of // - // because there are always two spaces + // because there are always two space-groups // before our "stuff" we can simply - // split on spaces and grab everything after + // split on space-groups and grab everything after // the second: - options = str.split(' ').slice(2).join(' '); + options = str.match(/('.*?'|".*?"|\S+)/g).slice(2).join(' '); } }); }); From d8c2aed4bc6f2603f7b6effec6827d55dd4cab0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sat, 1 Dec 2018 23:43:31 +0700 Subject: [PATCH 039/359] No join, no split --- src/js/commands/index.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/js/commands/index.js b/src/js/commands/index.js index 4ad8128f..133dbe78 100644 --- a/src/js/commands/index.js +++ b/src/js/commands/index.js @@ -127,7 +127,7 @@ var parse = function(str) { // before our "stuff" we can simply // split on space-groups and grab everything after // the second: - options = str.match(/('.*?'|".*?"|\S+)/g).slice(2).join(' '); + options = str.match(/('.*?'|".*?"|\S+)/g).slice(2); } }); }); @@ -170,11 +170,8 @@ function CommandOptionParser(vcs, method, options) { } CommandOptionParser.prototype.explodeAndSet = function() { - // TODO -- this is ugly - // split on spaces, except when inside quotes - var exploded = this.rawOptions.match(/('.*?'|".*?"|\S+)/g) || []; - for (var i = 0; i < exploded.length; i++) { - var part = exploded[i]; + for (var i = 0; i < this.rawOptions.length; i++) { + var part = this.rawOptions[i]; if (part.slice(0,1) == '-') { // it's an option, check supportedMap @@ -187,7 +184,7 @@ CommandOptionParser.prototype.explodeAndSet = function() { }); } - var next = exploded[i + 1]; + var next = this.rawOptions[i + 1]; var optionArgs = []; if (next && next.slice(0,1) !== '-') { // only store the next argument as this From 283c88cac2a64fc94f4f992d621e2644ddc759e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sun, 2 Dec 2018 13:20:02 +0700 Subject: [PATCH 040/359] Fixed scroll 125% or higher --- src/style/main.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/style/main.css b/src/style/main.css index 15a23383..b1096873 100644 --- a/src/style/main.css +++ b/src/style/main.css @@ -253,7 +253,7 @@ body.hgMode .visBackgroundColor { #interfaceWrapper { min-width: 600px; - min-height: 600px; + min-height: 400px; } div.canvasTerminalHolder > div.terminal-window-holder > div.wrapper { @@ -1256,4 +1256,3 @@ div.gitDemonstrationView { border-top-color: #9bcbeb; background: #9bcbeb; } - From c9cb6c016f443fa035575ea68b9294d622f53cc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sun, 2 Dec 2018 13:22:17 +0700 Subject: [PATCH 041/359] Fixed don't show all of #commandLineBar --- src/style/main.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/style/main.css b/src/style/main.css index b1096873..f166455e 100644 --- a/src/style/main.css +++ b/src/style/main.css @@ -562,6 +562,7 @@ p.commandLine span.prompt { margin: 10px; border-radius: 5px; box-shadow: 1px 0px 15px rgba(100, 100, 100, 1); + overflow: auto; } #commandLineHistory #terminal.scrolling { From b40dde0196587076d2495223c6cc4e48d5f9a107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sun, 2 Dec 2018 13:30:35 +0700 Subject: [PATCH 042/359] Avoid display 900px in small screen --- src/style/main.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/style/main.css b/src/style/main.css index f166455e..93c884c3 100644 --- a/src/style/main.css +++ b/src/style/main.css @@ -826,6 +826,7 @@ div.modalView.box.inFront.show { .modalView .terminal-window-holder { border-radius: 5px; max-width: 900px; + width: 90%; } .modalView .terminal-window { From 57f84f0a361337fca4b21d6bb8022c34f2e6d0b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sun, 2 Dec 2018 20:20:33 +0700 Subject: [PATCH 043/359] remove forgot in 'no more native' a9dd27c --- Gruntfile.js | 7 +------ package.json | 3 +-- src/js/constants/AppStyles.js | 16 ---------------- src/js/constants/Routes.js | 19 ------------------- 4 files changed, 2 insertions(+), 43 deletions(-) delete mode 100644 src/js/constants/AppStyles.js delete mode 100644 src/js/constants/Routes.js diff --git a/Gruntfile.js b/Gruntfile.js index ab271d4a..c3db7ecf 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -109,14 +109,9 @@ module.exports = function(grunt) { 'Gruntfile.js', '__tests__/*.spec.js', 'src/js/**/*.js', - 'src/js/**/**/*.js', - 'src/levels/**/*.js' + 'src/js/**/**/*.js' ], options: { - ignores: [ - 'src/js/**/*.ios.js', - 'src/js/native_react_views/*.js' - ], curly: true, // sometimes triple equality is just redundant and unnecessary eqeqeq: false, diff --git a/package.json b/package.json index aa736793..0d640ce2 100644 --- a/package.json +++ b/package.json @@ -24,8 +24,7 @@ "grunt-react": "^0.12.1", "grunt-shell-spawn": "~0.3.0", "jasmine-node": "~1.12.0", - "prompt": "^1.0.0", - "react-tools": "^0.13.1" + "prompt": "^1.0.0" }, "dependencies": { "backbone": "~1.1.2", diff --git a/src/js/constants/AppStyles.js b/src/js/constants/AppStyles.js deleted file mode 100644 index 2d1ef06c..00000000 --- a/src/js/constants/AppStyles.js +++ /dev/null @@ -1,16 +0,0 @@ -var AppStyles = { - blueBackground: '#5cbcfc', - terminalBackground: '#424242', - terminalText: 'rgb(238, 238, 238)', - terminalHeader: '#EFEDEE', - terminalBorder: '#303030', - terminalFontFamily: 'Courier', -}; - -AppStyles.terminalTextStyle = { - color: AppStyles.terminalText, - fontFamily: AppStyles.terminalFontFamily, - fontWeight: 'bold', -}; - -module.exports = AppStyles; diff --git a/src/js/constants/Routes.js b/src/js/constants/Routes.js deleted file mode 100644 index d9af3475..00000000 --- a/src/js/constants/Routes.js +++ /dev/null @@ -1,19 +0,0 @@ -var assign = require('object-assign'); -var keyMirror = require('../util/keyMirror'); - -module.exports = keyMirror({ - NUX: null, - LOADING: null, - SEQUENCE_SELECT: null, - LEVEL_SELECT: null, -}); - -module.exports.getRouteWithParams = function(id, params) { - return assign({id: id}, params); -}; - -module.exports.getRouteForID = function(id) { - return { - id: id, - }; -}; From 0c05bf09a91dc7b035033bf2eab3dd63be9216c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Mon, 3 Dec 2018 09:03:39 +0700 Subject: [PATCH 044/359] Restore `src/levels` in `Gruntfile.js` --- Gruntfile.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Gruntfile.js b/Gruntfile.js index c3db7ecf..d144f722 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -109,7 +109,8 @@ module.exports = function(grunt) { 'Gruntfile.js', '__tests__/*.spec.js', 'src/js/**/*.js', - 'src/js/**/**/*.js' + 'src/js/**/**/*.js', + 'src/levels/**/*.js' ], options: { curly: true, From 4acbfde071e6a33b99b0beb686665a74a954d265 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Mon, 3 Dec 2018 09:26:40 +0700 Subject: [PATCH 045/359] Add some info about this repository --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 0d640ce2..51dd2d61 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,9 @@ { "name": "LearnGitBranching", "version": "0.8.0", + "description": "An interactive git visualization to challenge and educate!", + "homepage": "https://learngitbranching.js.org", + "author": "Peter Cottle ", "license": "MIT", "scripts": { "test": "grunt test" From b884b0e398ac4b81e8dc622a2d42c0c56ef3fcd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Tue, 4 Dec 2018 16:51:11 +0700 Subject: [PATCH 046/359] Change npm to yarn --- .travis.yml | 15 ++- npm-shrinkwrap.json | 264 -------------------------------------------- 2 files changed, 13 insertions(+), 266 deletions(-) delete mode 100644 npm-shrinkwrap.json diff --git a/.travis.yml b/.travis.yml index 89b60a3b..4412d1ed 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,15 @@ +sudo: false language: node_js node_js: - - "4.1" - - "5.3" + - "10" + - "8" + - "7" +before_install: + - curl -o- -L https://yarnpkg.com/install.sh | bash + - export PATH="$HOME/.yarn/bin:$PATH" +cache: + yarn: true + directories: + - "node_modules" +script: + - yarn test diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json deleted file mode 100644 index 007fdc21..00000000 --- a/npm-shrinkwrap.json +++ /dev/null @@ -1,264 +0,0 @@ -{ - "name": "LearnGitBranching", - "version": "0.8.0", - "dependencies": { - "backbone": { - "version": "1.1.2", - "from": "backbone@*", - "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.1.2.tgz", - "dependencies": { - "underscore": { - "version": "1.8.3", - "from": "underscore@>=1.5.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz" - } - } - }, - "events": { - "version": "1.0.2", - "from": "events@*", - "resolved": "https://registry.npmjs.org/events/-/events-1.0.2.tgz" - }, - "flux": { - "version": "2.0.1", - "from": "flux@*", - "resolved": "https://registry.npmjs.org/flux/-/flux-2.0.1.tgz" - }, - "jquery": { - "version": "1.7.3", - "from": "jquery@~1.7.3", - "dependencies": { - "jsdom": { - "version": "0.2.19", - "from": "jsdom@~0.2.14", - "dependencies": { - "request": { - "version": "2.30.0", - "from": "request@2.x", - "dependencies": { - "qs": { - "version": "0.6.6", - "from": "qs@~0.6.0" - }, - "json-stringify-safe": { - "version": "5.0.0", - "from": "json-stringify-safe@~5.0.0" - }, - "forever-agent": { - "version": "0.5.0", - "from": "forever-agent@~0.5.0" - }, - "node-uuid": { - "version": "1.4.1", - "from": "node-uuid@~1.4.0" - }, - "mime": { - "version": "1.2.11", - "from": "mime@~1.2.9" - }, - "tough-cookie": { - "version": "0.9.15", - "from": "tough-cookie@~0.9.15", - "dependencies": { - "punycode": { - "version": "1.2.3", - "from": "punycode@>=0.2.0" - } - } - }, - "form-data": { - "version": "0.1.2", - "from": "form-data@~0.1.0", - "dependencies": { - "combined-stream": { - "version": "0.0.4", - "from": "combined-stream@~0.0.4", - "dependencies": { - "delayed-stream": { - "version": "0.0.5", - "from": "delayed-stream@0.0.5" - } - } - }, - "async": { - "version": "0.2.9", - "from": "async@~0.2.9" - } - } - }, - "tunnel-agent": { - "version": "0.3.0", - "from": "tunnel-agent@~0.3.0" - }, - "http-signature": { - "version": "0.10.0", - "from": "http-signature@~0.10.0", - "dependencies": { - "assert-plus": { - "version": "0.1.2", - "from": "assert-plus@0.1.2" - }, - "asn1": { - "version": "0.1.11", - "from": "asn1@0.1.11" - }, - "ctype": { - "version": "0.5.2", - "from": "ctype@0.5.2" - } - } - }, - "oauth-sign": { - "version": "0.3.0", - "from": "oauth-sign@~0.3.0" - }, - "hawk": { - "version": "1.0.0", - "from": "hawk@~1.0.0", - "dependencies": { - "hoek": { - "version": "0.9.1", - "from": "hoek@0.9.x" - }, - "boom": { - "version": "0.4.2", - "from": "boom@0.4.x" - }, - "cryptiles": { - "version": "0.2.2", - "from": "cryptiles@0.2.x" - }, - "sntp": { - "version": "0.2.4", - "from": "sntp@0.2.x" - } - } - }, - "aws-sign2": { - "version": "0.5.0", - "from": "aws-sign2@~0.5.0" - } - } - }, - "cssom": { - "version": "0.2.5", - "from": "cssom@0.2.x" - }, - "cssstyle": { - "version": "0.2.9", - "from": "cssstyle@>=0.2.3", - "dependencies": { - "cssom": { - "version": "0.3.0", - "from": "cssom@0.3.x" - } - } - }, - "contextify": { - "version": "0.1.6", - "from": "contextify@0.1.x", - "dependencies": { - "bindings": { - "version": "1.1.1", - "from": "bindings@*" - } - } - } - } - }, - "htmlparser": { - "version": "1.7.6", - "from": "htmlparser@1.7.6" - }, - "xmlhttprequest": { - "version": "1.4.2", - "from": "xmlhttprequest@~1.4.2" - }, - "location": { - "version": "0.0.1", - "from": "location@0.0.1" - }, - "navigator": { - "version": "1.0.1", - "from": "navigator@~1.0.1" - } - } - }, - "markdown": { - "version": "0.4.0", - "from": "markdown@~0.4.0", - "dependencies": { - "nopt": { - "version": "1.0.10", - "from": "nopt@1", - "dependencies": { - "abbrev": { - "version": "1.0.4", - "from": "abbrev@1" - } - } - } - } - }, - "object-assign": { - "version": "2.0.0", - "from": "object-assign@*", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.0.0.tgz" - }, - "q": { - "version": "0.8.12", - "from": "q@~0.8.11" - }, - "react": { - "version": "0.13.1", - "from": "react@*", - "resolved": "https://registry.npmjs.org/react/-/react-0.13.1.tgz", - "dependencies": { - "envify": { - "version": "3.4.0", - "from": "envify@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/envify/-/envify-3.4.0.tgz", - "dependencies": { - "through": { - "version": "2.3.6", - "from": "through@>=2.3.4 <2.4.0", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.6.tgz" - }, - "jstransform": { - "version": "10.1.0", - "from": "jstransform@>=10.0.1 <11.0.0", - "resolved": "https://registry.npmjs.org/jstransform/-/jstransform-10.1.0.tgz", - "dependencies": { - "base62": { - "version": "0.1.1", - "from": "base62@0.1.1", - "resolved": "https://registry.npmjs.org/base62/-/base62-0.1.1.tgz" - }, - "esprima-fb": { - "version": "13001.1001.0-dev-harmony-fb", - "from": "esprima-fb@13001.1001.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-13001.1001.0-dev-harmony-fb.tgz" - }, - "source-map": { - "version": "0.1.31", - "from": "source-map@0.1.31", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.31.tgz", - "dependencies": { - "amdefine": { - "version": "0.1.0", - "from": "amdefine@>=0.0.4" - } - } - } - } - } - } - } - } - }, - "underscore": { - "version": "1.4.4", - "from": "underscore@~1.4.3" - } - } -} From e7b7a8db2da538f911c5b3f4f0cbc69490c7f252 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Wed, 5 Dec 2018 08:01:28 +0700 Subject: [PATCH 047/359] Remove module unuse --- package.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/package.json b/package.json index 51dd2d61..8f1b0254 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,6 @@ "browserify": "^13.0.0", "grunt": "~0.4.2", "grunt-browserify": "^4.0.1", - "grunt-cli": "~0.1.11", "grunt-contrib-clean": "~0.5.0", "grunt-contrib-jshint": "~0.7.2", "grunt-contrib-uglify": "~0.2.7", @@ -31,9 +30,7 @@ }, "dependencies": { "backbone": "~1.1.2", - "events": "^1.0.2", "flux": "^2.0.1", - "jquery": "~1.7.3", "markdown": "~0.4.0", "q": "~0.8.11", "react": "^0.13.1", From 6a067eb9418733fa6ea59797e70a38337a682944 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Wed, 5 Dec 2018 08:02:06 +0700 Subject: [PATCH 048/359] Add yarn.lock --- yarn.lock | 4347 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 4347 insertions(+) create mode 100644 yarn.lock diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..3c158e95 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4347 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +JSONStream@^1.0.3: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== + +acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.6.2.tgz#b7d7ceca6f22e6417af933a62cad4de01048d5d2" + integrity sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg== + dependencies: + acorn "^6.0.2" + acorn-dynamic-import "^4.0.0" + acorn-walk "^6.1.0" + xtend "^4.0.1" + +acorn-walk@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" + integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + +acorn@^4.0.3: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= + +acorn@^5.2.1: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@^6.0.2: + version "6.0.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754" + integrity sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg== + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.2: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +"argparse@~ 0.1.11": + version "0.1.16" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-0.1.16.tgz#cfd01e0fbba3d6caed049fbd758d40f65196f57c" + integrity sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw= + dependencies: + underscore "~1.7.0" + underscore.string "~2.4.0" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-map@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +assert@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + dependencies: + util "0.10.3" + +assert@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.3.0.tgz#03939a622582a812cc202320a0b9a56c9b815849" + integrity sha1-A5OaYiWCqBLMICMgoLmlbJuBWEk= + dependencies: + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types@0.9.6: + version "0.9.6" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" + integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk= + +astw@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/astw/-/astw-2.2.0.tgz#7bd41784d32493987aeb239b6b4e1c57a873b917" + integrity sha1-e9QXhNMkk5h66yOba04cV6hzuRc= + dependencies: + acorn "^4.0.3" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + integrity sha1-GdOGodntxufByF04iu28xW0zYC0= + +async@^0.9.0, async@~0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= + +async@~0.1.22: + version "0.1.22" + resolved "https://registry.yarnpkg.com/async/-/async-0.1.22.tgz#0fc1aaa088a0e3ef0ebe2d8831bab0dcf8845061" + integrity sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE= + +async@~0.2.6: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= + +async@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" + integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k= + +async@~1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +backbone@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.1.2.tgz#c2c04c66bf87268fb82c177acebeff7d37ba6f2d" + integrity sha1-wsBMZr+HJo+4LBd6zr7/fTe6by0= + dependencies: + underscore ">=1.5.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base62@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/base62/-/base62-0.1.1.tgz#7b4174c2f94449753b11c2651c083da841a7b084" + integrity sha1-e0F0wvlESXU7EcJlHAg9qEGnsIQ= + +base62@^1.1.0: + version "1.2.8" + resolved "https://registry.yarnpkg.com/base62/-/base62-1.2.8.tgz#1264cb0fb848d875792877479dbe8bae6bae3428" + integrity sha512-V6YHUbjLxN1ymqNLb1DPHoU1CpfdL7d2YTIp5W3U4hhoG4hhxNmsFDs66M9EXxBiSEke5Bt5dwdfMwwZF70iLA== + +base64-js@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" + integrity sha1-EQHpVE9KdrG8OybUUsqW16NeeXg= + +base64-js@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +binary-extensions@^1.0.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" + integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +brace-expansion@^1.0.0, brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-pack@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-5.0.1.tgz#4197719b20c6e0aaa09451c5111e53efb6fbc18d" + integrity sha1-QZdxmyDG4KqglFHFER5T77b7wY0= + dependencies: + JSONStream "^1.0.3" + combine-source-map "~0.6.1" + defined "^1.0.0" + through2 "^1.0.0" + umd "^3.0.0" + +browser-pack@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.1.0.tgz#c34ba10d0b9ce162b5af227c7131c92c2ecd5774" + integrity sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA== + dependencies: + JSONStream "^1.0.3" + combine-source-map "~0.8.0" + defined "^1.0.0" + safe-buffer "^5.1.1" + through2 "^2.0.0" + umd "^3.0.0" + +browser-resolve@^1.11.0, browser-resolve@^1.7.0, browser-resolve@^1.7.1: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@~0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" + integrity sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0= + dependencies: + pako "~0.2.0" + +browserify-zlib@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserify@^11.0.1: + version "11.2.0" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-11.2.0.tgz#a11bb9dd209d79572b813f7eeeaf828a5f5c0e4e" + integrity sha1-oRu53SCdeVcrgT9+7q+Cil9cDk4= + dependencies: + JSONStream "^1.0.3" + assert "~1.3.0" + browser-pack "^5.0.0" + browser-resolve "^1.7.1" + browserify-zlib "~0.1.2" + buffer "^3.0.0" + builtins "~0.0.3" + commondir "0.0.1" + concat-stream "~1.4.1" + console-browserify "^1.1.0" + constants-browserify "~0.0.1" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^1.3.7" + domain-browser "~1.1.0" + duplexer2 "~0.0.2" + events "~1.0.0" + glob "^4.0.5" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "~0.0.0" + inherits "~2.0.1" + insert-module-globals "^6.4.1" + isarray "0.0.1" + labeled-stream-splicer "^1.0.0" + module-deps "^3.7.11" + os-browserify "~0.1.1" + parents "^1.0.1" + path-browserify "~0.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^1.1.1" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum "^1.0.0" + shell-quote "~0.0.1" + stream-browserify "^2.0.0" + stream-http "^1.2.0" + string_decoder "~0.10.0" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^1.0.0" + timers-browserify "^1.0.1" + tty-browserify "~0.0.0" + url "~0.10.1" + util "~0.10.1" + vm-browserify "~0.0.1" + xtend "^4.0.0" + +browserify@^13.0.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-13.3.0.tgz#b5a9c9020243f0c70e4675bec8223bc627e415ce" + integrity sha1-tanJAgJD8McORnW+yCI7xifkFc4= + dependencies: + JSONStream "^1.0.3" + assert "^1.4.0" + browser-pack "^6.0.1" + browser-resolve "^1.11.0" + browserify-zlib "~0.1.2" + buffer "^4.1.0" + cached-path-relative "^1.0.0" + concat-stream "~1.5.1" + console-browserify "^1.1.0" + constants-browserify "~1.0.0" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^2.0.0" + domain-browser "~1.1.0" + duplexer2 "~0.1.2" + events "~1.1.0" + glob "^7.1.0" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "~0.0.0" + inherits "~2.0.1" + insert-module-globals "^7.0.0" + labeled-stream-splicer "^2.0.0" + module-deps "^4.0.8" + os-browserify "~0.1.1" + parents "^1.0.1" + path-browserify "~0.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^2.0.0" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum "^1.0.0" + shell-quote "^1.6.1" + stream-browserify "^2.0.0" + stream-http "^2.0.0" + string_decoder "~0.10.0" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^2.0.0" + timers-browserify "^1.0.1" + tty-browserify "~0.0.0" + url "~0.11.0" + util "~0.10.1" + vm-browserify "~0.0.1" + xtend "^4.0.0" + +browserify@^16.1.0: + version "16.2.3" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.2.3.tgz#7ee6e654ba4f92bce6ab3599c3485b1cc7a0ad0b" + integrity sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ== + dependencies: + JSONStream "^1.0.3" + assert "^1.4.0" + browser-pack "^6.0.1" + browser-resolve "^1.11.0" + browserify-zlib "~0.2.0" + buffer "^5.0.2" + cached-path-relative "^1.0.0" + concat-stream "^1.6.0" + console-browserify "^1.1.0" + constants-browserify "~1.0.0" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^2.0.0" + domain-browser "^1.2.0" + duplexer2 "~0.1.2" + events "^2.0.0" + glob "^7.1.0" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "^1.0.0" + inherits "~2.0.1" + insert-module-globals "^7.0.0" + labeled-stream-splicer "^2.0.0" + mkdirp "^0.5.0" + module-deps "^6.0.0" + os-browserify "~0.3.0" + parents "^1.0.1" + path-browserify "~0.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^2.0.0" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum "^1.0.0" + shell-quote "^1.6.1" + stream-browserify "^2.0.0" + stream-http "^2.0.0" + string_decoder "^1.1.1" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^2.0.0" + timers-browserify "^1.0.1" + tty-browserify "0.0.1" + url "~0.11.0" + util "~0.10.1" + vm-browserify "^1.0.0" + xtend "^4.0.0" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^3.0.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb" + integrity sha1-pyyTb3e5a/UvX357RnGAYoVR3vs= + dependencies: + base64-js "0.0.8" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@^4.1.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@^5.0.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" + integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + +builtin-status-codes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-1.0.0.tgz#30637ee262978ac07174e16d7f82f0ad06e085ad" + integrity sha1-MGN+4mKXisBxdOFtf4LwrQbgha0= + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +builtins@~0.0.3: + version "0.0.7" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-0.0.7.tgz#355219cd6cf18dbe7c01cc7fd2dce765cfdc549a" + integrity sha1-NVIZzWzxjb58Acx/0tznZc/cVJo= + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cached-path-relative@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" + integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg== + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +chalk@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chokidar@^1.0.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cli@0.4.x: + version "0.4.5" + resolved "https://registry.yarnpkg.com/cli/-/cli-0.4.5.tgz#78f9485cd161b566e9a6c72d7170c4270e81db61" + integrity sha1-ePlIXNFhtWbppsctcXDEJw6B22E= + dependencies: + glob ">= 3.1.4" + +cli@0.6.x: + version "0.6.6" + resolved "https://registry.yarnpkg.com/cli/-/cli-0.6.6.tgz#02ad44a380abf27adac5e6f0cdd7b043d74c53e3" + integrity sha1-Aq1Eo4Cr8nraxebwzdewQ9dMU+M= + dependencies: + exit "0.1.2" + glob "~ 3.2.1" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +coffee-script@>=1.0.1: + version "1.12.7" + resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53" + integrity sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw== + +coffee-script@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.3.3.tgz#150d6b4cb522894369efed6a2101c20bc7f4a4f4" + integrity sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ= + +coffeescript@~1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-1.10.0.tgz#e7aa8301917ef621b35d8a39f348dcdd1db7e33e" + integrity sha1-56qDAZF+9iGzXYo580jc3R234z4= + +coffeescript@~1.12.7: + version "1.12.7" + resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-1.12.7.tgz#e57ee4c4867cf7f606bfc4a0f2d550c0981ddd27" + integrity sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +colors@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= + +colors@^1.1.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" + integrity sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ== + +colors@~0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" + integrity sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w= + +colors@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= + +combine-source-map@^0.8.0, combine-source-map@~0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" + integrity sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos= + dependencies: + convert-source-map "~1.1.0" + inline-source-map "~0.6.0" + lodash.memoize "~3.0.3" + source-map "~0.5.3" + +combine-source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.6.1.tgz#9b4a09c316033d768e0f11e029fa2730e079ad96" + integrity sha1-m0oJwxYDPXaODxHgKfonMOB5rZY= + dependencies: + convert-source-map "~1.1.0" + inline-source-map "~0.5.0" + lodash.memoize "~3.0.3" + source-map "~0.4.2" + +commander@^2.5.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + +commondir@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-0.0.1.tgz#89f00fdcd51b519c578733fec563e6a6da7f5be2" + integrity sha1-ifAP3NUbUZxXhzP+xWPmptp/W+I= + +commoner@^0.10.0, commoner@^0.10.1: + version "0.10.8" + resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5" + integrity sha1-NPw2cs0kOT6LtH5wyqApOBH08sU= + dependencies: + commander "^2.5.0" + detective "^4.3.1" + glob "^5.0.15" + graceful-fs "^4.1.2" + iconv-lite "^0.4.5" + mkdirp "^0.5.0" + private "^0.1.6" + q "^1.1.2" + recast "^0.11.17" + +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concat-stream@~1.4.1, concat-stream@~1.4.5: + version "1.4.11" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.4.11.tgz#1dc9f666f2621da9c618b1e7f8f3b2ff70b5f76f" + integrity sha512-X3JMh8+4je3U1cQpG87+f9lXHDrqcb2MVLg9L7o8b1UZ0DzhRrUpdn65ttzu10PpJPPI3MQNkis+oha6TSA9Mw== + dependencies: + inherits "~2.0.1" + readable-stream "~1.1.9" + typedarray "~0.0.5" + +concat-stream@~1.5.0, concat-stream@~1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" + integrity sha1-cIl4Yk2FavQaWnQd790mHadSwmY= + dependencies: + inherits "~2.0.1" + readable-stream "~2.0.0" + typedarray "~0.0.5" + +console-browserify@0.1.x: + version "0.1.6" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-0.1.6.tgz#d128a3c0bb88350eb5626c6e7c71a6f0fd48983c" + integrity sha1-0SijwLuINQ61YmxufHGm8P1ImDw= + +console-browserify@1.1.x, console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +constants-browserify@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-0.0.1.tgz#92577db527ba6c4cf0a4568d84bc031f441e21f2" + integrity sha1-kld9tSe6bEzwpFaNhLwDH0QeIfI= + +constants-browserify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +convert-source-map@~1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" + integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA= + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +crypto-browserify@^3.0.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +cycle@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI= + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= + +dateformat@1.0.2-1.2.3: + version "1.0.2-1.2.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.2-1.2.3.tgz#b0220c02de98617433b72851cf47de3df2cdbee9" + integrity sha1-sCIMAt6YYXQztyhRz0fePfLNvuk= + +dateformat@~1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" + integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + +debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decamelize@^1.0.0, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-equal@~0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d" + integrity sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +deps-sort@^1.3.7: + version "1.3.9" + resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-1.3.9.tgz#29dfff53e17b36aecae7530adbbbf622c2ed1a71" + integrity sha1-Kd//U+F7Nq7K51MK27v2IsLtGnE= + dependencies: + JSONStream "^1.0.3" + shasum "^1.0.0" + subarg "^1.0.0" + through2 "^1.0.0" + +deps-sort@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5" + integrity sha1-CRckkC6EZYJg65EHSMzNGvbiH7U= + dependencies: + JSONStream "^1.0.3" + shasum "^1.0.0" + subarg "^1.0.0" + through2 "^2.0.0" + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detective@^4.0.0, detective@^4.3.1: + version "4.7.1" + resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e" + integrity sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig== + dependencies: + acorn "^5.2.1" + defined "^1.0.0" + +detective@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.1.0.tgz#7a20d89236d7b331ccea65832e7123b5551bb7cb" + integrity sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ== + dependencies: + acorn-node "^1.3.0" + defined "^1.0.0" + minimist "^1.1.1" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dom-serializer@0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + integrity sha1-BzxpdUbOB4DOI75KKOKT5AvDDII= + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +domain-browser@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domain-browser@~1.1.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" + integrity sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw= + +domelementtype@1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.2.1.tgz#578558ef23befac043a1abb0db07635509393479" + integrity sha512-SQVCLFS2E7G5CRCMdn6K9bIhRj1bS6QBWZfF0TUPh4V/BbqrQ619IdSS3/izn0FZ+9l+uODzaZjb08fjOfablA== + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs= + +domhandler@2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" + integrity sha1-LeWaCCLVAn+r/28DLCsloqir5zg= + dependencies: + domelementtype "1" + +domutils@1.5: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +duplexer2@0.0.2, duplexer2@~0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds= + dependencies: + readable-stream "~1.1.9" + +duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" + +elliptic@^6.0.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" + integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + dependencies: + iconv-lite "~0.4.13" + +entities@1.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" + integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY= + +entities@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +envify@^3.0.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/envify/-/envify-3.4.1.tgz#d7122329e8df1688ba771b12501917c9ce5cbce8" + integrity sha1-1xIjKejfFoi6dxsSUBkXyc5cvOg= + dependencies: + jstransform "^11.0.3" + through "~2.3.4" + +error-ex@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +esprima-fb@13001.1001.0-dev-harmony-fb: + version "13001.1001.0-dev-harmony-fb" + resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-13001.1001.0-dev-harmony-fb.tgz#633acdb40d9bd4db8a1c1d68c06a942959fad2b0" + integrity sha1-YzrNtA2b1NuKHB1owGqUKVn60rA= + +esprima-fb@^15001.1.0-dev-harmony-fb: + version "15001.1.0-dev-harmony-fb" + resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz#30a947303c6b8d5e955bee2b99b1d233206a6901" + integrity sha1-MKlHMDxrjV6VW+4rmbHSMyBqaQE= + +esprima@^2.6.0: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= + +"esprima@~ 1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" + integrity sha1-n1V+CPw7TSbs6d00+Pv0drYlha0= + +esprima@~3.1.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +eventemitter2@~0.4.13: + version "0.4.14" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab" + integrity sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas= + +events@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-2.1.0.tgz#2a9a1e18e6106e0e812aa9ebd4a819b3c29c0ba5" + integrity sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg== + +events@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/events/-/events-1.0.2.tgz#75849dcfe93d10fb057c30055afdbd51d06a8e24" + integrity sha1-dYSdz+k9EPsFfDAFWv29UdBqjiQ= + +events@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exit@0.1.2, exit@0.1.x, exit@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + dependencies: + fill-range "^2.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +eyes@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= + +fbemitter@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-2.1.1.tgz#523e14fdaf5248805bb02f62efc33be703f51865" + integrity sha1-Uj4U/a9SSIBbsC9i78M75wP1GGU= + dependencies: + fbjs "^0.8.4" + +fbjs@0.1.0-alpha.7: + version "0.1.0-alpha.7" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.1.0-alpha.7.tgz#ad4308b8f232fb3c73603349ea725d1e9c39323c" + integrity sha1-rUMIuPIy+zxzYDNJ6nJdHpw5Mjw= + dependencies: + core-js "^1.0.0" + promise "^7.0.3" + whatwg-fetch "^0.9.0" + +fbjs@^0.8.4: + version "0.8.17" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" + integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + +fileset@~0.1.5: + version "0.1.8" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-0.1.8.tgz#506b91a9396eaa7e32fb42a84077c7a0c736b741" + integrity sha1-UGuRqTluqn4y+0KoQHfHoMc2t0E= + dependencies: + glob "3.x" + minimatch "0.x" + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +findup-sync@~0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.1.3.tgz#7f3e7a97b82392c653bf06589bd85190e93c3683" + integrity sha1-fz56l7gjksZTvwZYm9hRkOk8NoM= + dependencies: + glob "~3.2.9" + lodash "~2.4.1" + +findup-sync@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" + integrity sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY= + dependencies: + glob "~5.0.0" + +flux@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/flux/-/flux-2.1.1.tgz#2c6ac652d4337488968489c6586f3aff26a38ea4" + integrity sha1-LGrGUtQzdIiWhInGWG86/yajjqQ= + dependencies: + fbemitter "^2.0.0" + fbjs "0.1.0-alpha.7" + immutable "^3.7.4" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + dependencies: + minipass "^2.2.1" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@~0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.3.4.tgz#5f94bdda0afe53bc710969bcd6f282548d60c279" + integrity sha1-X5S92gr+U7xxCWm81vKCVI1gwnk= + dependencies: + fileset "~0.1.5" + minimatch "~0.2.9" + +gaze@~1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== + dependencies: + globule "^1.0.0" + +get-assigned-identifiers@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" + integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getobject@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/getobject/-/getobject-0.1.0.tgz#047a449789fa160d018f5486ed91320b6ec7885c" + integrity sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw= + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + +glob@3.x, "glob@~ 3.2.1", glob@~3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" + integrity sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0= + dependencies: + inherits "2" + minimatch "0.3" + +"glob@>= 3.1.4", glob@^7.0.5, glob@^7.1.0, glob@~7.1.1: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^4.0.5: + version "4.5.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + integrity sha1-xstz0yJsHv7wTePFbQEvAzd+4V8= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "^2.0.1" + once "^1.3.0" + +glob@^5.0.15, glob@^5.0.5, glob@~5.0.0: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@~3.1.21: + version "3.1.21" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" + integrity sha1-0p4KBV3qUTj00H7UDomC6DwgZs0= + dependencies: + graceful-fs "~1.2.0" + inherits "1" + minimatch "~0.2.11" + +glob@~7.0.0: + version "7.0.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" + integrity sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo= + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globule@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== + dependencies: + glob "~7.1.1" + lodash "~4.17.10" + minimatch "~3.0.2" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + +graceful-fs@~1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" + integrity sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q= + +growl@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.7.0.tgz#de2d66136d002e112ba70f3f10c31cf7c350b2da" + integrity sha1-3i1mE20ALhErpw8/EMMc98NQsto= + +grunt-browserify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/grunt-browserify/-/grunt-browserify-4.0.1.tgz#f5ced9026958a800f2e8898e1a4df1e525ff69ff" + integrity sha1-9c7ZAmlYqADy6ImOGk3x5SX/af8= + dependencies: + async "^0.9.0" + browserify "^11.0.1" + glob "^5.0.5" + lodash "^3.8.0" + resolve "^1.1.6" + watchify "^3.3.1" + +grunt-cli@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.2.0.tgz#562b119ebb069ddb464ace2845501be97b35b6a8" + integrity sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg= + dependencies: + findup-sync "~0.3.0" + grunt-known-options "~1.1.0" + nopt "~3.0.6" + resolve "~1.1.0" + +grunt-contrib-clean@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/grunt-contrib-clean/-/grunt-contrib-clean-0.5.0.tgz#f53dfdee0849b1c7b40e9ebbba69f48c4c6079c5" + integrity sha1-9T397ghJsce0Dp67umn0jExgecU= + dependencies: + rimraf "~2.2.1" + +grunt-contrib-jshint@0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/grunt-contrib-jshint/-/grunt-contrib-jshint-0.11.0.tgz#2ba17953d30471c3ba58792a5aa92e447059de45" + integrity sha1-K6F5U9MEccO6WHkqWqkuRHBZ3kU= + dependencies: + hooker "~0.2.3" + jshint "~2.6.0" + +grunt-contrib-jshint@~0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/grunt-contrib-jshint/-/grunt-contrib-jshint-0.7.2.tgz#29859ddcf42e7f6c54c43fe75da3c4bd90384a8e" + integrity sha1-KYWd3PQuf2xUxD/nXaPEvZA4So4= + dependencies: + jshint "~2.3.0" + +grunt-contrib-uglify@~0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/grunt-contrib-uglify/-/grunt-contrib-uglify-0.2.7.tgz#e6bda51e0c40a1459f6cead423c65efd725a1bf7" + integrity sha1-5r2lHgxAoUWfbOrUI8Ze/XJaG/c= + dependencies: + grunt-lib-contrib "~0.6.1" + uglify-js "~2.4.0" + +grunt-env@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/grunt-env/-/grunt-env-0.4.4.tgz#3b38843a8d737177ddc9f893879fb69ce1a0bc2f" + integrity sha1-OziEOo1zcXfdyfiTh5+2nOGgvC8= + dependencies: + ini "~1.3.0" + lodash "~2.4.1" + +grunt-hash@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/grunt-hash/-/grunt-hash-0.5.0.tgz#98781d799f74b29538692f58c61d50648c1bd29e" + integrity sha1-mHgdeZ90spU4aS9Yxh1QZIwb0p4= + +grunt-jasmine-node@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/grunt-jasmine-node/-/grunt-jasmine-node-0.1.0.tgz#063b80c5d73ae4e9640d4ad47263f94d98092eaa" + integrity sha1-BjuAxdc65OlkDUrUcmP5TZgJLqo= + dependencies: + jasmine-node ">=1.4.0" + +grunt-jsxhint@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/grunt-jsxhint/-/grunt-jsxhint-0.5.0.tgz#f2c701b0cafc7b34d37d1f46f1e374e8114926b6" + integrity sha1-8scBsMr8ezTTfR9G8eN06BFJJrY= + dependencies: + grunt-contrib-jshint "0.11.0" + jshint "~2.6.0" + proxyquire "~1.3.1" + rewire "~2.1.5" + +grunt-known-options@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.1.tgz#6cc088107bd0219dc5d3e57d91923f469059804d" + integrity sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ== + +grunt-legacy-log-utils@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz#c0706b9dd9064e116f36f23fe4e6b048672c0f7e" + integrity sha1-wHBrndkGThFvNvI/5OawSGcsD34= + dependencies: + colors "~0.6.2" + lodash "~2.4.1" + underscore.string "~2.3.3" + +grunt-legacy-log-utils@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz#d2f442c7c0150065d9004b08fd7410d37519194e" + integrity sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA== + dependencies: + chalk "~2.4.1" + lodash "~4.17.10" + +grunt-legacy-log@~0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz#ec29426e803021af59029f87d2f9cd7335a05531" + integrity sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE= + dependencies: + colors "~0.6.2" + grunt-legacy-log-utils "~0.1.1" + hooker "~0.2.3" + lodash "~2.4.1" + underscore.string "~2.3.3" + +grunt-legacy-log@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz#c8cd2c6c81a4465b9bbf2d874d963fef7a59ffb9" + integrity sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw== + dependencies: + colors "~1.1.2" + grunt-legacy-log-utils "~2.0.0" + hooker "~0.2.3" + lodash "~4.17.5" + +grunt-legacy-util@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz#93324884dbf7e37a9ff7c026dff451d94a9e554b" + integrity sha1-kzJIhNv343qf98Am3/RR2UqeVUs= + dependencies: + async "~0.1.22" + exit "~0.1.1" + getobject "~0.1.0" + hooker "~0.2.3" + lodash "~0.9.2" + underscore.string "~2.2.1" + which "~1.0.5" + +grunt-legacy-util@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz#e10624e7c86034e5b870c8a8616743f0a0845e42" + integrity sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A== + dependencies: + async "~1.5.2" + exit "~0.1.1" + getobject "~0.1.0" + hooker "~0.2.3" + lodash "~4.17.10" + underscore.string "~3.3.4" + which "~1.3.0" + +grunt-lib-contrib@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/grunt-lib-contrib/-/grunt-lib-contrib-0.6.1.tgz#3f56adb7da06e814795ee2415b0ebe5fb8903ebb" + integrity sha1-P1att9oG6BR5XuJBWw6+X7iQPrs= + dependencies: + zlib-browserify "0.0.1" + +grunt-react@^0.12.1: + version "0.12.3" + resolved "https://registry.yarnpkg.com/grunt-react/-/grunt-react-0.12.3.tgz#4c53590127e4a5235c04d1227f3910903af48c16" + integrity sha1-TFNZASfkpSNcBNEifzkQkDr0jBY= + dependencies: + react-tools "^0.13.0" + through "~2.3.6" + +grunt-shell-spawn@~0.3.0: + version "0.3.10" + resolved "https://registry.yarnpkg.com/grunt-shell-spawn/-/grunt-shell-spawn-0.3.10.tgz#81bb8d457ec47d3182a87d6308ef845ddfb9488f" + integrity sha1-gbuNRX7EfTGCqH1jCO+EXd+5SI8= + dependencies: + grunt ">=0.4.x" + sync-exec "~0.6.2" + +grunt@>=0.4.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.0.3.tgz#b3c99260c51d1b42835766e796527b60f7bba374" + integrity sha512-/JzmZNPfKorlCrrmxWqQO4JVodO+DVd5XX4DkocL/1WlLlKVLE9+SdEIempOAxDhWPysLle6afvn/hg7Ck2k9g== + dependencies: + coffeescript "~1.10.0" + dateformat "~1.0.12" + eventemitter2 "~0.4.13" + exit "~0.1.1" + findup-sync "~0.3.0" + glob "~7.0.0" + grunt-cli "~1.2.0" + grunt-known-options "~1.1.0" + grunt-legacy-log "~2.0.0" + grunt-legacy-util "~1.1.1" + iconv-lite "~0.4.13" + js-yaml "~3.5.2" + minimatch "~3.0.2" + mkdirp "~0.5.1" + nopt "~3.0.6" + path-is-absolute "~1.0.0" + rimraf "~2.6.2" + +grunt@~0.4.2: + version "0.4.5" + resolved "https://registry.yarnpkg.com/grunt/-/grunt-0.4.5.tgz#56937cd5194324adff6d207631832a9d6ba4e7f0" + integrity sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A= + dependencies: + async "~0.1.22" + coffee-script "~1.3.3" + colors "~0.6.2" + dateformat "1.0.2-1.2.3" + eventemitter2 "~0.4.13" + exit "~0.1.1" + findup-sync "~0.1.2" + getobject "~0.1.0" + glob "~3.1.21" + grunt-legacy-log "~0.1.0" + grunt-legacy-util "~0.2.0" + hooker "~0.2.3" + iconv-lite "~0.2.11" + js-yaml "~2.0.5" + lodash "~0.9.2" + minimatch "~0.2.12" + nopt "~1.0.10" + rimraf "~2.2.8" + underscore.string "~2.2.1" + which "~1.0.5" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hooker@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/hooker/-/hooker-0.2.3.tgz#b834f723cc4a242aa65963459df6d984c5d3d959" + integrity sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk= + +hosted-git-info@^2.1.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + +htmlescape@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" + integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E= + +htmlparser2@3.8.x: + version "3.8.3" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" + integrity sha1-mWwosZFRaovoZQGn15dX5ccMEGg= + dependencies: + domelementtype "1" + domhandler "2.3" + domutils "1.5" + entities "1.0" + readable-stream "1.1" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +https-browserify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" + integrity sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI= + +i@0.3.x: + version "0.3.6" + resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d" + integrity sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0= + +iconv-lite@^0.4.4, iconv-lite@^0.4.5, iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@~0.2.11: + version "0.2.11" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.2.11.tgz#1ce60a3a57864a292d1321ff4609ca4bb965adc8" + integrity sha1-HOYKOleGSiktEyH/RgnKS7llrcg= + +ieee754@^1.1.4: + version "1.1.12" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + +immutable@^3.7.4: + version "3.8.2" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" + integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" + integrity sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js= + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inline-source-map@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.5.0.tgz#4a4c5dd8e4fb5e9b3cda60c822dfadcaee66e0af" + integrity sha1-Skxd2OT7Xps82mDIIt+tyu5m4K8= + dependencies: + source-map "~0.4.0" + +inline-source-map@~0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" + integrity sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU= + dependencies: + source-map "~0.5.3" + +insert-module-globals@^6.4.1: + version "6.6.3" + resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-6.6.3.tgz#20638e29a30f9ed1ca2e3a825fbc2cba5246ddfc" + integrity sha1-IGOOKaMPntHKLjqCX7wsulJG3fw= + dependencies: + JSONStream "^1.0.3" + combine-source-map "~0.6.1" + concat-stream "~1.4.1" + is-buffer "^1.1.0" + lexical-scope "^1.2.0" + process "~0.11.0" + through2 "^1.0.0" + xtend "^4.0.0" + +insert-module-globals@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.0.tgz#ec87e5b42728479e327bd5c5c71611ddfb4752ba" + integrity sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw== + dependencies: + JSONStream "^1.0.3" + acorn-node "^1.5.2" + combine-source-map "^0.8.0" + concat-stream "^1.6.1" + is-buffer "^1.1.0" + path-is-absolute "^1.0.1" + process "~0.11.0" + through2 "^2.0.0" + undeclared-identifiers "^1.1.2" + xtend "^4.0.0" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.0, is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= + dependencies: + builtin-modules "^1.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^1.0.0" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@0.0.1, isarray@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isarray@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7" + integrity sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +isstream@0.1.x: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +jasmine-growl-reporter@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/jasmine-growl-reporter/-/jasmine-growl-reporter-0.0.3.tgz#b87ae551e359d28ad5217765eaef6c07b763f6c8" + integrity sha1-uHrlUeNZ0orVIXdl6u9sB7dj9sg= + dependencies: + growl "~1.7.0" + +jasmine-growl-reporter@~0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/jasmine-growl-reporter/-/jasmine-growl-reporter-0.2.1.tgz#d5f0a37b92f6a83fd5c6482b809495c90a8b55fe" + integrity sha1-1fCje5L2qD/VxkgrgJSVyQqLVf4= + dependencies: + growl "~1.7.0" + +jasmine-node@>=1.4.0: + version "1.16.2" + resolved "https://registry.yarnpkg.com/jasmine-node/-/jasmine-node-1.16.2.tgz#c9cec44f4bccc3bb9c3eb2c8f877590ce6530f38" + integrity sha512-A4AA2WaikuE7s/NYQCqfYsyCczEgObLgNH7IxRQ2SBshLBZg7vUEiiGX4GPbveW5f06nYmXYlzY4UjnZjXjV9g== + dependencies: + coffeescript "~1.12.7" + gaze "~1.1.2" + jasmine-growl-reporter "~0.2.0" + jasmine-reporters "~1.0.0" + mkdirp "~0.3.5" + requirejs "~2.3.6" + underscore "~1.9.1" + walkdir "~0.0.12" + +jasmine-node@~1.12.0: + version "1.12.1" + resolved "https://registry.yarnpkg.com/jasmine-node/-/jasmine-node-1.12.1.tgz#a7ddd86bb0b4cca06ffa48de28abb4e9192ba47b" + integrity sha1-p93Ya7C0zKBv+kjeKKu06RkrpHs= + dependencies: + coffee-script ">=1.0.1" + gaze "~0.3.2" + jasmine-growl-reporter "~0.0.2" + jasmine-reporters ">=0.2.0" + mkdirp "~0.3.5" + requirejs ">=0.27.1" + underscore ">= 1.3.1" + walkdir ">= 0.0.1" + +jasmine-reporters@>=0.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/jasmine-reporters/-/jasmine-reporters-2.3.2.tgz#898818ffc234eb8b3f635d693de4586f95548d43" + integrity sha512-u/7AT9SkuZsUfFBLLzbErohTGNsEUCKaQbsVYnLFW1gEuL2DzmBL4n8v90uZsqIqlWvWUgian8J6yOt5Fyk/+A== + dependencies: + mkdirp "^0.5.1" + xmldom "^0.1.22" + +jasmine-reporters@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jasmine-reporters/-/jasmine-reporters-1.0.2.tgz#ab613ed5977dc7487e85b3c12f6a8ea8db2ade31" + integrity sha1-q2E+1Zd9x0h+hbPBL2qOqNsq3jE= + dependencies: + mkdirp "~0.3.5" + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@~2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-2.0.5.tgz#a25ae6509999e97df278c6719da11bd0687743a8" + integrity sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g= + dependencies: + argparse "~ 0.1.11" + esprima "~ 1.0.2" + +js-yaml@~3.5.2: + version "3.5.5" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.5.5.tgz#0377c38017cabc7322b0d1fbcd25a491641f2fbe" + integrity sha1-A3fDgBfKvHMisNH7zSWkkWQfL74= + dependencies: + argparse "^1.0.2" + esprima "^2.6.0" + +jshint@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.3.0.tgz#19504455a2c20c46ee183361eb87f3a1c0b7dc47" + integrity sha1-GVBEVaLCDEbuGDNh64fzocC33Ec= + dependencies: + cli "0.4.x" + console-browserify "0.1.x" + minimatch "0.x.x" + shelljs "0.1.x" + underscore "1.4.x" + +jshint@~2.6.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.6.3.tgz#84b470b8e5d5cd7adf0a3bd4975250443c9d311a" + integrity sha1-hLRwuOXVzXrfCjvUl1JQRDydMRo= + dependencies: + cli "0.6.x" + console-browserify "1.1.x" + exit "0.1.x" + htmlparser2 "3.8.x" + minimatch "1.0.x" + shelljs "0.3.x" + strip-json-comments "1.0.x" + underscore "1.6.x" + +json-stable-stringify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" + integrity sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U= + dependencies: + jsonify "~0.0.0" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + +jstransform@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/jstransform/-/jstransform-10.1.0.tgz#b4c49bf63f162c108b0348399a8737c713b0a83a" + integrity sha1-tMSb9j8WLBCLA0g5moc3xxOwqDo= + dependencies: + base62 "0.1.1" + esprima-fb "13001.1001.0-dev-harmony-fb" + source-map "0.1.31" + +jstransform@^11.0.3: + version "11.0.3" + resolved "https://registry.yarnpkg.com/jstransform/-/jstransform-11.0.3.tgz#09a78993e0ae4d4ef4487f6155a91f6190cb4223" + integrity sha1-CaeJk+CuTU70SH9hVakfYZDLQiM= + dependencies: + base62 "^1.1.0" + commoner "^0.10.1" + esprima-fb "^15001.1.0-dev-harmony-fb" + object-assign "^2.0.0" + source-map "^0.4.2" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +labeled-stream-splicer@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz#4615331537784981e8fd264e1f3a434c4e0ddd65" + integrity sha1-RhUzFTd4SYHo/SZOHzpDTE4N3WU= + dependencies: + inherits "^2.0.1" + isarray "~0.0.1" + stream-splicer "^1.1.0" + +labeled-stream-splicer@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz#9cffa32fd99e1612fd1d86a8db962416d5292926" + integrity sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg== + dependencies: + inherits "^2.0.1" + isarray "^2.0.4" + stream-splicer "^2.0.0" + +lexical-scope@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0afaf22df4" + integrity sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ= + dependencies: + astw "^2.0.0" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +lodash.memoize@~3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" + integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8= + +lodash@^3.8.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= + +lodash@~0.9.2: + version "0.9.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-0.9.2.tgz#8f3499c5245d346d682e5b0d3b40767e09f1a92c" + integrity sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw= + +lodash@~2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" + integrity sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4= + +lodash@~4.17.10, lodash@~4.17.5: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +markdown@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/markdown/-/markdown-0.4.0.tgz#a4b545adb6c66494f97168f3290c8d1b073e5b2a" + integrity sha1-pLVFrbbGZJT5cWjzKQyNGwc+Wyo= + dependencies: + nopt "1" + +math-random@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" + integrity sha1-izqsWIuKZuSXXjzepn97sylgH6w= + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +micromatch@^2.1.5: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@0.3: + version "0.3.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" + integrity sha1-J12O2qxPG7MyZHIInnlJyDlGmd0= + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimatch@0.x, minimatch@0.x.x: + version "0.4.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.4.0.tgz#bd2c7d060d2c8c8fd7cde7f1f2ed2d5b270fdb1b" + integrity sha1-vSx9Bg0sjI/Xzefx8u0tWycP2xs= + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimatch@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-1.0.0.tgz#e0dd2120b49e1b724ce8d714c520822a9438576d" + integrity sha1-4N0hILSeG3JM6NcUxSCCKpQ4V20= + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^2.0.1: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + integrity sha1-jQh8OcazjAAbl/ynzm0OHoCvusc= + dependencies: + brace-expansion "^1.0.0" + +minimatch@~0.2.11, minimatch@~0.2.12, minimatch@~0.2.9: + version "0.2.14" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + integrity sha1-x054BXT2PG+aCQ6Q775u9TpqdWo= + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minipass@^2.2.1, minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42" + integrity sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg== + dependencies: + minipass "^2.2.1" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.x.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mkdirp@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" + integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= + +module-deps@^3.7.11: + version "3.9.1" + resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-3.9.1.tgz#ea75caf9199090d25b0d5512b5acacb96e7f87f3" + integrity sha1-6nXK+RmQkNJbDVUStaysuW5/h/M= + dependencies: + JSONStream "^1.0.3" + browser-resolve "^1.7.0" + concat-stream "~1.4.5" + defined "^1.0.0" + detective "^4.0.0" + duplexer2 "0.0.2" + inherits "^2.0.1" + parents "^1.0.0" + readable-stream "^1.1.13" + resolve "^1.1.3" + stream-combiner2 "~1.0.0" + subarg "^1.0.0" + through2 "^1.0.0" + xtend "^4.0.0" + +module-deps@^4.0.8: + version "4.1.1" + resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.1.1.tgz#23215833f1da13fd606ccb8087b44852dcb821fd" + integrity sha1-IyFYM/HaE/1gbMuAh7RIUty4If0= + dependencies: + JSONStream "^1.0.3" + browser-resolve "^1.7.0" + cached-path-relative "^1.0.0" + concat-stream "~1.5.0" + defined "^1.0.0" + detective "^4.0.0" + duplexer2 "^0.1.2" + inherits "^2.0.1" + parents "^1.0.0" + readable-stream "^2.0.2" + resolve "^1.1.3" + stream-combiner2 "^1.1.1" + subarg "^1.0.0" + through2 "^2.0.0" + xtend "^4.0.0" + +module-deps@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.0.tgz#d41a2e790245ce319171e4e7c4d8c73993ba3cd5" + integrity sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA== + dependencies: + JSONStream "^1.0.3" + browser-resolve "^1.7.0" + cached-path-relative "^1.0.0" + concat-stream "~1.6.0" + defined "^1.0.0" + detective "^5.0.2" + duplexer2 "^0.1.2" + inherits "^2.0.1" + parents "^1.0.0" + readable-stream "^2.0.2" + resolve "^1.4.0" + stream-combiner2 "^1.1.1" + subarg "^1.0.0" + through2 "^2.0.0" + xtend "^4.0.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +mute-stream@~0.0.4: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +nan@^2.9.2: + version "2.11.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" + integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +ncp@1.0.x: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ncp/-/ncp-1.0.1.tgz#d15367e5cb87432ba117d2bf80fdf45aecfb4246" + integrity sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY= + +needle@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +nopt@1, nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= + dependencies: + abbrev "1" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +nopt@~3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.0, normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +npm-bundled@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" + integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== + +npm-packlist@^1.1.6: + version "1.1.12" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" + integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +object-assign@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" + integrity sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo= + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.4: + version "1.0.12" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" + integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +os-browserify@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a617d8fe54" + integrity sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ= + +os-browserify@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +outpipe@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2" + integrity sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I= + dependencies: + shell-quote "^1.4.2" + +pako@~0.2.0: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= + +pako@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.7.tgz#2473439021b57f1516c82f58be7275ad8ef1bb27" + integrity sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ== + +parents@^1.0.0, parents@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" + integrity sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E= + dependencies: + path-platform "~0.11.15" + +parse-asn1@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + integrity sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1, path-is-absolute@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-parse@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-platform@~0.11.15: + version "0.11.15" + resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" + integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I= + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkginfo@0.3.x: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" + integrity sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE= + +pkginfo@0.x.x: + version "0.4.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" + integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8= + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + +private@^0.1.6, private@~0.1.5: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + +process@~0.11.0: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +promise@^7.0.3, promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +prompt@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prompt/-/prompt-1.0.0.tgz#8e57123c396ab988897fb327fd3aedc3e735e4fe" + integrity sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4= + dependencies: + colors "^1.1.2" + pkginfo "0.x.x" + read "1.0.x" + revalidator "0.1.x" + utile "0.3.x" + winston "2.1.x" + +proxyquire@~1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-1.3.2.tgz#d6e801ac00b0c05efb20947ba34738b5aa02f48d" + integrity sha1-1ugBrACwwF77IJR7o0c4taoC9I0= + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +q@~0.8.11: + version "0.8.12" + resolved "https://registry.yarnpkg.com/q/-/q-0.8.12.tgz#9162a91e11819c4bcda7da15cf5fefaad0778823" + integrity sha1-kWKpHhGBnEvNp9oVz1/vqtB3iCM= + +querystring-es3@~0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + integrity sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-tools@^0.13.0: + version "0.13.3" + resolved "https://registry.yarnpkg.com/react-tools/-/react-tools-0.13.3.tgz#da6ac7d4d7777a59a5e951cf46e72fd4b6b40a2c" + integrity sha1-2mrH1Nd3elml6VHPRucv1La0Ciw= + dependencies: + commoner "^0.10.0" + jstransform "^10.1.0" + +react@^0.13.1: + version "0.13.3" + resolved "https://registry.yarnpkg.com/react/-/react-0.13.3.tgz#a2dfa85335d7dc02b82b482f089582e64cc13356" + integrity sha1-ot+oUzXX3AK4K0gvCJWC5kzBM1Y= + dependencies: + envify "^3.0.0" + +read-only-stream@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-1.1.1.tgz#5da77c799ed1388d3ef88a18471bb5924f8a0ba1" + integrity sha1-Xad8eZ7ROI0++IoYRxu1kk+KC6E= + dependencies: + readable-stream "^1.0.31" + readable-wrap "^1.0.0" + +read-only-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" + integrity sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A= + dependencies: + readable-stream "^2.0.2" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read@1.0.x: + version "1.0.7" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= + dependencies: + mute-stream "~0.0.4" + +readable-stream@1.1: + version "1.1.13" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" + integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +"readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@^1.0.31, readable-stream@^1.1.13, readable-stream@^1.1.13-1, readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@~1.0.17: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + integrity sha1-j5A0HmilPMySh4jaz80Rs265t44= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readable-wrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/readable-wrap/-/readable-wrap-1.0.0.tgz#3b5a211c631e12303a54991c806c17e7ae206bff" + integrity sha1-O1ohHGMeEjA6VJkcgGwX564ga/8= + dependencies: + readable-stream "^1.1.13-1" + +readdirp@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +recast@^0.11.17: + version "0.11.23" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" + integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM= + dependencies: + ast-types "0.9.6" + esprima "~3.1.0" + private "~0.1.5" + source-map "~0.5.0" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +requirejs@>=0.27.1, requirejs@~2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.6.tgz#e5093d9601c2829251258c0b9445d4d19fa9e7c9" + integrity sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7, resolve@~1.1.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6, resolve@^1.4.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== + dependencies: + path-parse "^1.0.5" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +revalidator@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" + integrity sha1-/s5hv6DBtSoga9axgZgYS91SOjs= + +rewire@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/rewire/-/rewire-2.1.5.tgz#764599179cae5e393839bf3ad6e0be371ee49d81" + integrity sha1-dkWZF5yuXjk4Ob861uC+Nx7knYE= + +rimraf@2.x.x, rimraf@^2.6.1, rimraf@~2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== + dependencies: + glob "^7.0.5" + +rimraf@~2.2.1, rimraf@~2.2.8: + version "2.2.8" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +"semver@2 || 3 || 4 || 5", semver@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shasum@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" + integrity sha1-5wEjENj0F/TetXEhUOVni4euVl8= + dependencies: + json-stable-stringify "~0.0.0" + sha.js "~2.4.4" + +shell-quote@^1.4.2, shell-quote@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + +shell-quote@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-0.0.1.tgz#1a41196f3c0333c482323593d6886ecf153dd986" + integrity sha1-GkEZbzwDM8SCMjWT1ohuzxU92YY= + +shelljs@0.1.x: + version "0.1.4" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.1.4.tgz#dfbbe78d56c3c0168d2fb79e10ecd1dbcb07ec0e" + integrity sha1-37vnjVbDwBaNL7eeEOzR28sH7A4= + +shelljs@0.3.x: + version "0.3.0" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1" + integrity sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E= + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +simple-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" + integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@0.1.31: + version "0.1.31" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.31.tgz#9f704d0d69d9e138a81badf6ebb4fde33d151c61" + integrity sha1-n3BNDWnZ4TioG63267T94z0VHGE= + dependencies: + amdefine ">=0.0.4" + +source-map@0.1.34: + version "0.1.34" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.34.tgz#a7cfe89aec7b1682c3b198d0acfb47d7d090566b" + integrity sha1-p8/omux7FoLDsZjQrPtH19CQVms= + dependencies: + amdefine ">=0.0.4" + +source-map@^0.4.2, source-map@~0.4.0, source-map@~0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.3: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +spdx-correct@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e" + integrity sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2" + integrity sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@^1.0.3: + version "1.1.1" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" + integrity sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw= + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stream-browserify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + integrity sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds= + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-combiner2@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" + integrity sha1-+02KFCDqNidk4hrUeAOXvry0HL4= + dependencies: + duplexer2 "~0.1.0" + readable-stream "^2.0.2" + +stream-combiner2@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.0.2.tgz#ba72a6b50cbfabfa950fc8bc87604bd01eb60671" + integrity sha1-unKmtQy/q/qVD8i8h2BL0B62BnE= + dependencies: + duplexer2 "~0.0.2" + through2 "~0.5.1" + +stream-http@^1.2.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-1.7.1.tgz#d3d2a6e14c36a38b9dafb199aee7bbc570519978" + integrity sha1-09Km4Uw2o4udr7GZrue7xXBRmXg= + dependencies: + builtin-status-codes "^1.0.0" + foreach "^2.0.5" + indexof "0.0.1" + inherits "^2.0.1" + object-keys "^1.0.4" + xtend "^4.0.0" + +stream-http@^2.0.0: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-splicer@^1.1.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-1.3.2.tgz#3c0441be15b9bf4e226275e6dc83964745546661" + integrity sha1-PARBvhW5v04iYnXm3IOWR0VUZmE= + dependencies: + indexof "0.0.1" + inherits "^2.0.1" + isarray "~0.0.1" + readable-stream "^1.1.13-1" + readable-wrap "^1.0.0" + through2 "^1.0.0" + +stream-splicer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83" + integrity sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.2" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~0.10.0, string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E= + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +subarg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + integrity sha1-9izxdYHplrSPyWVpn1TAauJouNI= + dependencies: + minimist "^1.1.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +sync-exec@~0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/sync-exec/-/sync-exec-0.6.2.tgz#717d22cc53f0ce1def5594362f3a89a2ebb91105" + integrity sha1-cX0izFPwzh3vVZQ2LzqJouu5EQU= + +syntax-error@^1.1.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" + integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w== + dependencies: + acorn-node "^1.2.0" + +tar@^4: + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.4" + minizlib "^1.1.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +through2@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-1.1.1.tgz#0847cbc4449f3405574dbdccd9bb841b83ac3545" + integrity sha1-CEfLxESfNAVXTb3M2buEG4OsNUU= + dependencies: + readable-stream ">=1.1.13-1 <1.2.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through2@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" + integrity sha1-390BLrnHAOIyP9M084rGIqs3Lac= + dependencies: + readable-stream "~1.0.17" + xtend "~3.0.0" + +"through@>=2.2.7 <3", through@~2.3.4, through@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +timers-browserify@^1.0.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" + integrity sha1-ycWLV1voQHN1y14kYtrO50NZ9B0= + dependencies: + process "~0.11.0" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +tty-browserify@0.0.1, tty-browserify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + +typedarray@^0.0.6, typedarray@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +ua-parser-js@^0.7.18: + version "0.7.19" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" + integrity sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ== + +uglify-js@~2.4.0: + version "2.4.24" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.4.24.tgz#fad5755c1e1577658bb06ff9ab6e548c95bebd6e" + integrity sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4= + dependencies: + async "~0.2.6" + source-map "0.1.34" + uglify-to-browserify "~1.0.0" + yargs "~3.5.4" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= + +umd@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" + integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== + +undeclared-identifiers@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz#7d850a98887cff4bd0bf64999c014d08ed6d1acc" + integrity sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ== + dependencies: + acorn-node "^1.3.0" + get-assigned-identifiers "^1.2.0" + simple-concat "^1.0.0" + xtend "^4.0.1" + +underscore.string@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.2.1.tgz#d7c0fa2af5d5a1a67f4253daee98132e733f0f19" + integrity sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk= + +underscore.string@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.3.3.tgz#71c08bf6b428b1133f37e78fa3a21c82f7329b0d" + integrity sha1-ccCL9rQosRM/N+ePo6Icgvcymw0= + +underscore.string@~2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.4.0.tgz#8cdd8fbac4e2d2ea1e7e2e8097c42f442280f85b" + integrity sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs= + +underscore.string@~3.3.4: + version "3.3.5" + resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023" + integrity sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg== + dependencies: + sprintf-js "^1.0.3" + util-deprecate "^1.0.2" + +underscore@1.4.x, underscore@~1.4.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" + integrity sha1-YaajIBBiKvoHljvzJSA88SI51gQ= + +underscore@1.6.x: + version "1.6.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" + integrity sha1-izixDKze9jM3uLJOT/htRa6lKag= + +"underscore@>= 1.3.1", underscore@>=1.5.0, underscore@~1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" + integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== + +underscore@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" + integrity sha1-a7rwh3UA02vjTsqlhODbn+8DUgk= + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url@~0.10.1: + version "0.10.3" + resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" + integrity sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +url@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@~0.10.1: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + +utile@0.3.x: + version "0.3.0" + resolved "https://registry.yarnpkg.com/utile/-/utile-0.3.0.tgz#1352c340eb820e4d8ddba039a4fbfaa32ed4ef3a" + integrity sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo= + dependencies: + async "~0.9.0" + deep-equal "~0.2.1" + i "0.3.x" + mkdirp "0.x.x" + ncp "1.0.x" + rimraf "2.x.x" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vm-browserify@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" + integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== + +vm-browserify@~0.0.1: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= + dependencies: + indexof "0.0.1" + +"walkdir@>= 0.0.1", walkdir@~0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.12.tgz#2f24f1ade64aab1e458591d4442c8868356e9281" + integrity sha512-HFhaD4mMWPzFSqhpyDG48KDdrjfn409YQuVW7ckZYhW4sE87mYtWifdB/+73RA7+p4s4K18n5Jfx1kHthE1gBw== + +watchify@^3.3.1: + version "3.11.0" + resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.11.0.tgz#03f1355c643955e7ab8dcbf399f624644221330f" + integrity sha512-7jWG0c3cKKm2hKScnSAMUEUjRJKXUShwMPk0ASVhICycQhwND3IMAdhJYmc1mxxKzBUJTSF5HZizfrKrS6BzkA== + dependencies: + anymatch "^1.3.0" + browserify "^16.1.0" + chokidar "^1.0.0" + defined "^1.0.0" + outpipe "^1.1.0" + through2 "^2.0.0" + xtend "^4.0.0" + +whatwg-fetch@>=0.10.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== + +whatwg-fetch@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-0.9.0.tgz#0e3684c6cb9995b43efc9df03e4c365d95fd9cc0" + integrity sha1-DjaExsuZlbQ+/J3wPkw2XZX9nMA= + +which@~1.0.5: + version "1.0.9" + resolved "https://registry.yarnpkg.com/which/-/which-1.0.9.tgz#460c1da0f810103d0321a9b633af9e575e64486f" + integrity sha1-RgwdoPgQED0DIam2M6+eV15kSG8= + +which@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= + +winston@2.1.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/winston/-/winston-2.1.1.tgz#3c9349d196207fd1bdff9d4bc43ef72510e3a12e" + integrity sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4= + dependencies: + async "~1.0.0" + colors "1.0.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + pkginfo "0.3.x" + stack-trace "0.0.x" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +xmldom@^0.1.22: + version "0.1.27" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" + integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= + +xtend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" + integrity sha1-XM50B7r2Qsunvs2laBEcST9ZZlo= + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + +yargs@~3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.5.4.tgz#d8aff8f665e94c34bd259bdebd1bfaf0ddd35361" + integrity sha1-2K/49mXpTDS9JZvevRv68N3TU2E= + dependencies: + camelcase "^1.0.2" + decamelize "^1.0.0" + window-size "0.1.0" + wordwrap "0.0.2" + +zlib-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/zlib-browserify/-/zlib-browserify-0.0.1.tgz#4fa6a45d00dbc15f318a4afa1d9afc0258e176cc" + integrity sha1-T6akXQDbwV8xikr6HZr8Aljhdsw= From e6d7edd130249bac0b6ebb3d36668224bc7753ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Wed, 5 Dec 2018 12:08:41 +0700 Subject: [PATCH 049/359] Create simple debounce and throttle instead of _. --- src/js/util/debounce.js | 17 +++++++++++++++++ src/js/util/throttle.js | 13 +++++++++++++ src/js/views/builderViews.js | 3 ++- src/js/views/index.js | 6 ++++-- src/js/views/levelDropdownView.js | 3 ++- src/js/views/multiView.js | 6 +++--- src/js/visuals/index.js | 3 ++- 7 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 src/js/util/debounce.js create mode 100644 src/js/util/throttle.js diff --git a/src/js/util/debounce.js b/src/js/util/debounce.js new file mode 100644 index 00000000..0f8bd3b4 --- /dev/null +++ b/src/js/util/debounce.js @@ -0,0 +1,17 @@ +module.exports = function(func, time, immediate) { + var timeout; + return function() { + var later = function() { + timeout = null; + if (!immediate) { + func.apply(this, arguments); + } + }; + var callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, time); + if (callNow) { + func.apply(this, arguments); + } + }; + }; diff --git a/src/js/util/throttle.js b/src/js/util/throttle.js new file mode 100644 index 00000000..45d85e72 --- /dev/null +++ b/src/js/util/throttle.js @@ -0,0 +1,13 @@ +module.exports = function(func, time) { + var wait = false; + return function() { + if (!wait) { + func.apply(this, arguments); + wait = true; + + setTimeout(function() { + wait = false; + }, time); + } + }; + }; diff --git a/src/js/views/builderViews.js b/src/js/views/builderViews.js index 89a6f8b9..592e1975 100644 --- a/src/js/views/builderViews.js +++ b/src/js/views/builderViews.js @@ -2,6 +2,7 @@ var _ = require('underscore'); var Q = require('q'); var Views = require('../views'); +var throttle = require('../util/throttle'); var ModalTerminal = Views.ModalTerminal; var ContainedBase = Views.ContainedBase; @@ -97,7 +98,7 @@ var MarkdownGrabber = ContainedBase.extend({ keyup: function() { if (!this.throttledPreview) { - this.throttledPreview = _.throttle( + this.throttledPreview = throttle( this.updatePreview.bind(this), 500 ); diff --git a/src/js/views/index.js b/src/js/views/index.js index 6f09413b..3fa26ce6 100644 --- a/src/js/views/index.js +++ b/src/js/views/index.js @@ -7,6 +7,8 @@ var intl = require('../intl'); var log = require('../log'); var Constants = require('../util/constants'); var KeyboardListener = require('../util/keyboard').KeyboardListener; +var debounce = require('../util/debounce'); +var throttle = require('../util/throttle'); var BaseView = Backbone.View.extend({ getDestination: function() { @@ -106,7 +108,7 @@ var GeneralButton = ContainedBase.extend({ click: function() { if (!this.clickFunc) { - this.clickFunc = _.throttle( + this.clickFunc = throttle( this.sendClick.bind(this), 500 ); @@ -580,7 +582,7 @@ var CanvasTerminalHolder = BaseView.extend({ // If the entire window gets resized such that the terminal is outside the view, then // move it back into the view, and expand/shrink it vertically as necessary. - $(window).on('resize', _.debounce(this.recalcLayout.bind(this), 300)); + $(window).on('resize', debounce(this.recalcLayout.bind(this), 300)); if (options.additionalClass) { this.$el.addClass(options.additionalClass); diff --git a/src/js/views/levelDropdownView.js b/src/js/views/levelDropdownView.js index faf95b33..a5e9adbe 100644 --- a/src/js/views/levelDropdownView.js +++ b/src/js/views/levelDropdownView.js @@ -4,6 +4,7 @@ var Backbone = require('backbone'); var LocaleStore = require('../stores/LocaleStore'); var util = require('../util'); +var debounce = require('../util/debounce'); var intl = require('../intl'); var log = require('../log'); var KeyboardListener = require('../util/keyboard').KeyboardListener; @@ -41,7 +42,7 @@ var LevelDropdownView = ContainedBase.extend({ }; this.navEvents = Object.assign({}, Backbone.Events); - this.navEvents.on('clickedID', _.debounce( + this.navEvents.on('clickedID', debounce( this.loadLevelID.bind(this), 300, true diff --git a/src/js/views/multiView.js b/src/js/views/multiView.js index 9a3981ae..7d44a39a 100644 --- a/src/js/views/multiView.js +++ b/src/js/views/multiView.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var Q = require('q'); var Backbone = require('backbone'); @@ -10,6 +9,7 @@ var BuilderViews = require('../views/builderViews'); var MarkdownPresenter = BuilderViews.MarkdownPresenter; var KeyboardListener = require('../util/keyboard').KeyboardListener; +var debounce = require('../util/debounce'); var MultiView = Backbone.View.extend({ tagName: 'div', @@ -84,13 +84,13 @@ var MultiView = Backbone.View.extend({ }, getPosFunc: function() { - return _.debounce(function() { + return debounce(function() { this.navForward(); }.bind(this), this.navEventDebounce, true); }, getNegFunc: function() { - return _.debounce(function() { + return debounce(function() { this.navBackward(); }.bind(this), this.navEventDebounce, true); }, diff --git a/src/js/visuals/index.js b/src/js/visuals/index.js index 80d2d806..9029c2d5 100644 --- a/src/js/visuals/index.js +++ b/src/js/visuals/index.js @@ -3,6 +3,7 @@ var Q = require('q'); var intl = require('../intl'); var GRAPHICS = require('../util/constants').GRAPHICS; +var debounce = require('../util/debounce'); var GlobalStateStore = require('../stores/GlobalStateStore'); var VisNode = require('../visuals/visNode').VisNode; @@ -795,7 +796,7 @@ GitVisuals.prototype.canvasResize = function(width, height) { }; GitVisuals.prototype.genResizeFunc = function() { - this.resizeFunc = _.debounce( + this.resizeFunc = debounce( function(width, height) { this.refreshTree(); }.bind(this), From 70b7a72bd7f7d7ff7bcb5c7aead45e69d8ae8398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Wed, 5 Dec 2018 12:18:35 +0700 Subject: [PATCH 050/359] Use Object.values instead of _.each : 96ddb50 --- src/js/visuals/index.js | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/js/visuals/index.js b/src/js/visuals/index.js index 9029c2d5..31afd596 100644 --- a/src/js/visuals/index.js +++ b/src/js/visuals/index.js @@ -1,4 +1,3 @@ -var _ = require('underscore'); var Q = require('q'); var intl = require('../intl'); @@ -83,7 +82,7 @@ GitVisuals.prototype.resetAll = function() { visTag.remove(); }, this); - _.each(this.visNodeMap, function(visNode) { + Object.values(this.visNodeMap).forEach(function(visNode) { visNode.remove(); }, this); @@ -207,7 +206,7 @@ GitVisuals.prototype.animateAllAttrKeys = function(keys, attr, speed, easing) { this.visBranchCollection.each(animate); this.visEdgeCollection.each(animate); this.visTagCollection.each(animate); - _.each(this.visNodeMap, animate); + Object.values(this.visNodeMap).forEach(animate); var time = (speed !== undefined) ? speed : GRAPHICS.defaultAnimationTime; setTimeout(function() { @@ -322,7 +321,7 @@ GitVisuals.prototype.finishAnimation = function(speed) { GitVisuals.prototype.explodeNodes = function(speed) { var deferred = Q.defer(); var funcs = []; - _.each(this.visNodeMap, function(visNode) { + Object.values(this.visNodeMap).forEach(function(visNode) { funcs.push(visNode.getExplodeStepFunc(speed)); }); @@ -369,7 +368,7 @@ GitVisuals.prototype.animateAllFromAttrToAttr = function(fromSnapshot, toSnapsho this.visBranchCollection.each(animate); this.visEdgeCollection.each(animate); this.visTagCollection.each(animate); - _.each(this.visNodeMap, animate); + Object.values(this.visNodeMap).forEach(animate); }; /*************************************** @@ -393,7 +392,7 @@ GitVisuals.prototype.genSnapshot = function() { this.fullCalc(); var snapshot = {}; - _.each(this.visNodeMap, function(visNode) { + Object.values(this.visNodeMap).forEach(function(visNode) { snapshot[visNode.get('id')] = visNode.getAttributes(); }, this); @@ -633,7 +632,7 @@ GitVisuals.prototype.calcDepth = function() { } var depthIncrement = this.getDepthIncrement(maxDepth); - _.each(this.visNodeMap, function(visNode) { + Object.values(this.visNodeMap).forEach(function(visNode) { visNode.setDepthBasedOn(depthIncrement, this.getHeaderOffset()); }, this); }; @@ -656,7 +655,7 @@ GitVisuals.prototype.calcDepth = function() { **************************************/ GitVisuals.prototype.animateNodePositions = function(speed) { - _.each(this.visNodeMap, function(visNode) { + Object.values(this.visNodeMap).forEach(function(visNode) { visNode.animateUpdatedPosition(speed); }, this); }; @@ -854,7 +853,7 @@ GitVisuals.prototype.zIndexReflow = function() { }; GitVisuals.prototype.visNodesFront = function() { - _.each(this.visNodeMap, function(visNode) { + Object.values(this.visNodeMap).forEach(function(visNode) { visNode.toFront(); }); }; @@ -893,7 +892,7 @@ GitVisuals.prototype.drawTreeFirstTime = function() { this.gitReady = true; this.calcTreeCoords(); - _.each(this.visNodeMap, function(visNode) { + Object.values(this.visNodeMap).forEach(function(visNode) { visNode.genGraphics(this.paper); }, this); From d36619b7f6192e9dc71e54383868ff586e4e7827 Mon Sep 17 00:00:00 2001 From: Guodong Qu Date: Wed, 5 Dec 2018 17:30:59 +0800 Subject: [PATCH 051/359] fix a little typo in cn --- src/levels/remote/remoteBranches.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/remote/remoteBranches.js b/src/levels/remote/remoteBranches.js index 92b6a6c6..37ef477d 100644 --- a/src/levels/remote/remoteBranches.js +++ b/src/levels/remote/remoteBranches.js @@ -409,7 +409,7 @@ exports.level = { "", "远程分支反映了远程仓库(在你上次和它通信时)的**状态**。这会有助于你理解本地的工作与公共工作的差别 —— 这是你与别人分享工作成果前至关重要的一步.", "", - "远程分得有一个特别的属性,在你检出时自动进入分离 HEAD 状态。Git 这么做是出于不能直接在这些分支上进行操作的原因, 你必须在别的地方完成你的工作, (更新了远程分支之后)再用远程分享你的工作成果。" + "远程分支有一个特别的属性,在你检出时自动进入分离 HEAD 状态。Git 这么做是出于不能直接在这些分支上进行操作的原因, 你必须在别的地方完成你的工作, (更新了远程分支之后)再用远程分享你的工作成果。" ] } }, From d06e024a2a12c97d22a2753463bf795f66135e63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Thu, 6 Dec 2018 23:14:46 +0700 Subject: [PATCH 052/359] fix(css): fix offset top of select level (in firefox) --- src/style/main.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/style/main.css b/src/style/main.css index 93c884c3..be68b9d7 100644 --- a/src/style/main.css +++ b/src/style/main.css @@ -72,6 +72,10 @@ body, display: -ms-flexbox; } +.contentHolder { + display: flex; +} + body, .flex1 { -webkit-box-flex: 1; From 94217601654b7a70bd25da76338d30b0b9122b42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Fri, 7 Dec 2018 23:37:12 +0700 Subject: [PATCH 053/359] chore(git): remove some line is covered by other line --- .gitignore | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.gitignore b/.gitignore index f274b4d7..061b58db 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,6 @@ node_modules/ # Build artifacts and asset stuff build/* -build/bundle.js -build/bundle.*.js -build/main.*.css screens FontAwesome-Vectors.pdf index.html @@ -22,7 +19,6 @@ index.html *.xcworkspace xcuserdata UserInterfaceState.xcuserstate -xcuserdata/ *.pbxuser *.perspective @@ -40,7 +36,6 @@ xcuserdata/ .User.xcconfig -xcuserdata Tools/xctool/build Tools/clang/analyzer/build Tools/clang/libtooling/build @@ -50,7 +45,3 @@ VendorLib/Breakpad/src/tools/mac/dump_syms/build DerivedData VendorLib/clang/lib/arc VendorLib/clang/lib/c++ - -*.swp - - From 882526f5ab5f9a1825ee8f9737620c944d4207e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Fri, 7 Dec 2018 23:41:09 +0700 Subject: [PATCH 054/359] chore(git): add yarn-error.log to .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 061b58db..b2903c14 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ -# NPM +# NPM and Yarn npm-debug.log +yarn-error.log node_modules/ # Build artifacts and asset stuff From e8101470e49b8324fd49753dd3cf0e0f46635dba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EF=BC=A8=EF=BD=8F=EF=BD=8E=EF=BD=87=EF=BD=81=EF=BD=92?= =?UTF-8?q?=EF=BD=83?= Date: Sat, 8 Dec 2018 18:21:18 +0700 Subject: [PATCH 055/359] refactor(html): don't use underscore.min.js --- Gruntfile.js | 2 -- lib/underscore-min.js | 32 -------------------------------- 2 files changed, 34 deletions(-) delete mode 100644 lib/underscore-min.js diff --git a/Gruntfile.js b/Gruntfile.js index d144f722..6df6a1ba 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -22,13 +22,11 @@ var indexTemplate = _.template(indexFile); var prodDependencies = [ '', '', - '', '' ]; var devDependencies = [ '', - '', '', '' ]; diff --git a/lib/underscore-min.js b/lib/underscore-min.js deleted file mode 100644 index 5a0cb3b0..00000000 --- a/lib/underscore-min.js +++ /dev/null @@ -1,32 +0,0 @@ -// Underscore.js 1.3.3 -// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc. -// Underscore is freely distributable under the MIT license. -// Portions of Underscore are inspired or borrowed from Prototype, -// Oliver Steele's Functional, and John Resig's Micro-Templating. -// For all details and documentation: -// http://documentcloud.github.com/underscore -(function(){function r(a,c,d){if(a===c)return 0!==a||1/a==1/c;if(null==a||null==c)return a===c;a._chain&&(a=a._wrapped);c._chain&&(c=c._wrapped);if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return!1;switch(e){case "[object String]":return a==""+c;case "[object Number]":return a!=+a?c!=+c:0==a?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source== -c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if("object"!=typeof a||"object"!=typeof c)return!1;for(var f=d.length;f--;)if(d[f]==a)return!0;d.push(a);var f=0,g=!0;if("[object Array]"==e){if(f=a.length,g=f==c.length)for(;f--&&(g=f in a==f in c&&r(a[f],c[f],d)););}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return!1;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&r(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,h)&&!f--)break; -g=!f}}d.pop();return g}var s=this,I=s._,o={},k=Array.prototype,p=Object.prototype,i=k.slice,J=k.unshift,l=p.toString,K=p.hasOwnProperty,y=k.forEach,z=k.map,A=k.reduce,B=k.reduceRight,C=k.filter,D=k.every,E=k.some,q=k.indexOf,F=k.lastIndexOf,p=Array.isArray,L=Object.keys,t=Function.prototype.bind,b=function(a){return new m(a)};"undefined"!==typeof exports?("undefined"!==typeof module&&module.exports&&(exports=module.exports=b),exports._=b):s._=b;b.VERSION="1.3.3";var j=b.each=b.forEach=function(a, -c,d){if(a!=null)if(y&&a.forEach===y)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e2;a==null&&(a=[]);if(A&& -a.reduce===A){e&&(c=b.bind(c,e));return f?a.reduce(c,d):a.reduce(c)}j(a,function(a,b,i){if(f)d=c.call(e,d,a,b,i);else{d=a;f=true}});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(B&&a.reduceRight===B){e&&(c=b.bind(c,e));return f?a.reduceRight(c,d):a.reduceRight(c)}var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=function(a, -c,b){var e;G(a,function(a,g,h){if(c.call(b,a,g,h)){e=a;return true}});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(C&&a.filter===C)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(D&&a.every===D)return a.every(c,b);j(a,function(a,g,h){if(!(e=e&&c.call(b, -a,g,h)))return o});return!!e};var G=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(E&&a.some===E)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return o});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;if(q&&a.indexOf===q)return a.indexOf(c)!=-1;return b=G(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck= -function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a)&&a[0]===+a[0])return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a)&&a[0]===+a[0])return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;bd?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]}; -j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,c,d){d||(d=b.identity);for(var e=0,f=a.length;e>1;d(a[g])=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1),true);return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a= -i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e=0;d--)b=[a[d].apply(this,b)];return b[0]}};b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=L||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&& -c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.pick=function(a){var c={};j(b.flatten(i.call(arguments,1)),function(b){b in a&&(c[b]=a[b])});return c};b.defaults=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return r(a,b,[])};b.isEmpty= -function(a){if(a==null)return true;if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=p||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)};b.isArguments=function(a){return l.call(a)=="[object Arguments]"};b.isArguments(arguments)||(b.isArguments=function(a){return!(!a||!b.has(a,"callee"))});b.isFunction=function(a){return l.call(a)=="[object Function]"}; -b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isFinite=function(a){return b.isNumber(a)&&isFinite(a)};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"};b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a, -b){return K.call(a,b)};b.noConflict=function(){s._=I;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};b.result=function(a,c){if(a==null)return null;var d=a[c];return b.isFunction(d)?d.call(a):d};b.mixin=function(a){j(b.functions(a),function(c){M(c,b[c]=a[c])})};var N=0;b.uniqueId= -function(a){var b=N++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var u=/.^/,n={"\\":"\\","'":"'",r:"\r",n:"\n",t:"\t",u2028:"\u2028",u2029:"\u2029"},v;for(v in n)n[n[v]]=v;var O=/\\|'|\r|\n|\t|\u2028|\u2029/g,P=/\\(\\|'|r|n|t|u2028|u2029)/g,w=function(a){return a.replace(P,function(a,b){return n[b]})};b.template=function(a,c,d){d=b.defaults(d||{},b.templateSettings);a="__p+='"+a.replace(O,function(a){return"\\"+n[a]}).replace(d.escape|| -u,function(a,b){return"'+\n_.escape("+w(b)+")+\n'"}).replace(d.interpolate||u,function(a,b){return"'+\n("+w(b)+")+\n'"}).replace(d.evaluate||u,function(a,b){return"';\n"+w(b)+"\n;__p+='"})+"';\n";d.variable||(a="with(obj||{}){\n"+a+"}\n");var a="var __p='';var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n"+a+"return __p;\n",e=new Function(d.variable||"obj","_",a);if(c)return e(c,b);c=function(a){return e.call(this,a,b)};c.source="function("+(d.variable||"obj")+"){\n"+a+"}";return c}; -b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var x=function(a,c){return c?b(a).chain():a},M=function(a,c){m.prototype[a]=function(){var a=i.call(arguments);J.call(a,this._wrapped);return x(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return x(d, -this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return x(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=true;return this};m.prototype.value=function(){return this._wrapped}}).call(this); From 2aebbb3b400bf574cd97895007b9685dd5a9f3fe Mon Sep 17 00:00:00 2001 From: wasd845 Date: Sun, 16 Dec 2018 13:53:00 +0800 Subject: [PATCH 056/359] fix chinese translate --- src/levels/rampup/cherryPick.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/rampup/cherryPick.js b/src/levels/rampup/cherryPick.js index ce0094a3..197c8967 100644 --- a/src/levels/rampup/cherryPick.js +++ b/src/levels/rampup/cherryPick.js @@ -328,7 +328,7 @@ "", "到现在我们已经学习了 Git 的基础知识 —— 提交、分支以及在提交树上移动。 这些概念涵盖了 Git 90% 的功能,同样也足够满足开发者的日常需求 ", "", - "然而, 剩余的 10% 在处理复杂的工作流时(或者当你陷入困惑时)可能就显示尤为重要了。接下来要讨论的这个话题是“整理提交记录” —— 开发人员有时会说“我想要把这个提交放到这里, 那个提交放到刚才那个提交的后面”, 而接下来就讲的就是它的实现方式,非常清晰、灵活,还很生动。", + "然而, 剩余的 10% 在处理复杂的工作流时(或者当你陷入困惑时)可能就显得尤为重要了。接下来要讨论的这个话题是“整理提交记录” —— 开发人员有时会说“我想要把这个提交放到这里, 那个提交放到刚才那个提交的后面”, 而接下来就讲的就是它的实现方式,非常清晰、灵活,还很生动。", "", "看起来挺复杂, 其实是个很简单的概念。" ] From 2b4046c3e4521fb6beabb3715505618d77badc51 Mon Sep 17 00:00:00 2001 From: labixiaoshuai <35826995+labixiaoshuai@users.noreply.github.com> Date: Fri, 21 Dec 2018 11:29:51 +0800 Subject: [PATCH 057/359] Update interactiveRebase.js Modify zh_CN translation --- src/levels/rampup/interactiveRebase.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/rampup/interactiveRebase.js b/src/levels/rampup/interactiveRebase.js index ed3aaf1e..a99713f9 100644 --- a/src/levels/rampup/interactiveRebase.js +++ b/src/levels/rampup/interactiveRebase.js @@ -236,7 +236,7 @@ "markdowns": [ "## 交互式的 rebase", "", - "当你你知道你所需要的提交记录(**并且**还知道这些提交记录的哈希值)时, 用 cherry-pick 再好不过了 —— 没有比这更简单的方式了。", + "当你知道你所需要的提交记录(**并且**还知道这些提交记录的哈希值)时, 用 cherry-pick 再好不过了 —— 没有比这更简单的方式了。", "", "但是如果你不清楚你想要的提交记录的哈希值呢? 幸好 Git 帮你想到了这一点, 我们可以利用交互式的 rebase —— 如果你想从一系列的提交记录中找到想要的记录, 这就是最好的方法了", "", From 07fd775ce47a74c30fa70f3e1cd2c63d093f6558 Mon Sep 17 00:00:00 2001 From: Bezout Date: Sun, 20 Jan 2019 09:43:37 +0100 Subject: [PATCH 058/359] update french spelling --- src/js/dialogs/confirmShowSolution.js | 2 +- src/js/intl/strings.js | 12 ++++++------ src/levels/advanced/multipleParents.js | 6 +++--- src/levels/index.js | 4 ++-- src/levels/intro/branching.js | 2 +- src/levels/intro/merging.js | 4 ++-- src/levels/intro/rebasing.js | 2 +- src/levels/mixed/describe.js | 6 +++--- src/levels/mixed/jugglingCommits.js | 10 +++++----- src/levels/mixed/jugglingCommits2.js | 2 +- src/levels/mixed/tags.js | 2 +- src/levels/rampup/cherryPick.js | 2 +- src/levels/rampup/detachedHead.js | 4 ++-- src/levels/rampup/interactiveRebase.js | 4 ++-- src/levels/rampup/relativeRefs2.js | 2 +- src/levels/rampup/reversingChanges.js | 4 ++-- src/levels/rebase/selectiveRebase.js | 4 ++-- src/levels/remote/pushManyFeatures.js | 2 +- 18 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/js/dialogs/confirmShowSolution.js b/src/js/dialogs/confirmShowSolution.js index edd92462..b846cb43 100644 --- a/src/js/dialogs/confirmShowSolution.js +++ b/src/js/dialogs/confirmShowSolution.js @@ -65,7 +65,7 @@ exports.dialog = { markdowns: [ '## Êtes-vous sûr de vouloir voir la solution ?', '', - 'Je crois en vous ! Vous pouvez le faire' + 'Je crois en vous ! Vous pouvez le faire !' ] } }], diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js index 34306127..20683cc4 100755 --- a/src/js/intl/strings.js +++ b/src/js/intl/strings.js @@ -88,7 +88,7 @@ exports.strings = { 'es_ES': 'La opción -A no se necesita para este aplicación, sólo hace un commit!', 'pt_BR': 'A opção -A não é necessária para este aplicativo, simplesmente faça commit', 'de_DE': 'Die Option -A wird in dieser Anwendung nicht benötigt, committe einfach!', - 'fr_FR': 'L\'option -A n\'est pas nécessaire pour cette application, simplemer commiter', + 'fr_FR': 'L\'option -A n\'est pas nécessaire pour cette application, simplement commiter', 'ru_RU': 'Опция -A не требуется для этого приложения, просто сделайте коммит.', 'uk': 'Опція -A не потрібна для цього застосунку, можна просто комітити!', 'ko': '이 앱에선 -A 옵션은 필요 없습니다. 그냥 커밋하세요!' @@ -102,7 +102,7 @@ exports.strings = { 'es_AR': 'No hay un comando status para esta aplicación, dado que no hay archivos que indexar. Probá hg summary, en cambio', 'es_ES': 'No hay un comando status para esta aplicación, porque que no hay archivos que indexar. Prueba el comando hg summary, en cambio', 'pt_BR': 'Não existe um comando status para este aplicativo, já que não há staging de arquivos. Tente hg summary', - 'fr_FR': 'Il n\'y a pas de commande status pour cette application, car il n\'y a pas de fichier stagé. Essayé hg summary à la place.', + 'fr_FR': 'Il n\'y a pas de commande status pour cette application, car il n\'y a pas de fichier stagé. Essayez hg summary à la place.', 'de_DE': 'Es gibt keinen Befehl status in dieser Anwendung, da es kein Staging von Dateien gibt. Probier stattdessen hg summary', 'ru_RU': 'Команда status не поддерживается в этом приложении, так как здесь нет файлов. Попробуйте выполнить hg summary', 'uk': 'Команда status не підтримується в цьому застосунку, так як немає стейджингу(staging) файлів. Натомість спробуй hg summary ', @@ -324,7 +324,7 @@ exports.strings = { 'es_AR': '¡No hay commits para rebasear! Son todos commits de merge o cambios ya aplicados', 'es_ES': '¡No hay commits para hacer rebase! Todo es un merge commit o cambios ya hecho.', 'pt_BR': 'Não há commits para o rebase! São todos commits de merge ou mudanças já aplicadas', - 'fr_FR': 'Aucune commit à rebaser ! Tout est soit un commit de merge, soit des modifications déjà appliquées', + 'fr_FR': 'Aucun commit à rebaser ! C\'est soit un commit de merge, soit des modifications déjà appliquées', 'ru_RU': 'Нет коммитов для rebase! Все в коммите слияния или изменения уже применены', 'uk': 'Нема комітів для rebase! Все в коміті злиття (merge commit) чи зміни вже застосовані', 'ko': 'rebase를 하기 위한 커밋이 없습니다! 모든 커밋과 변경 사항들의 병합은 이미 적용되었습니다.' @@ -474,7 +474,7 @@ exports.strings = { 'es_AR': 'No podés hacer reset en el modo detached. Usá checkout si querés moverte', 'es_ES': 'No puedes hacer reset en el modo separado. Usa checkout si quieres moverte.', 'pt_BR': 'Não se pode fazer reset no modo detached. Use checkout se quiser se mover', - 'fr_FR': 'On ne peut pas effectuer un reset quand head est détaché. Utilisez checkout pour déplacer', + 'fr_FR': 'On ne peut pas effectuer un reset quand HEAD est détaché. Utilisez checkout pour déplacer', 'ru_RU': 'Это невозможно в режиме detached HEAD! Используйте checkout!', 'uk': 'Неможливо зробити reset в стані detached head! Використовуй checkout якщо хочеш змінити розташування', 'ko': '분리된 HEAD에서 reset할 수 없습니다. 만약 이동시키기를 원한다면 checkout을 사용하세요.' @@ -685,7 +685,7 @@ exports.strings = { 'es_ES': 'El nombre "{tag}" es prohibido para nombrar un tag.', 'pt_BR': 'Uma tag não pode ser chamada de "{tag}"!', 'de_DE': 'Der Tag-Name "{tag}" ist nicht erlaubt!', - 'fr_FR': 'Le nom de tag "{tag}" n\'est pas autorisé!', + 'fr_FR': 'Le nom de tag "{tag}" n\'est pas autorisé', 'ru_RU': 'Название для тега "{tag}" недопустимо!', 'uk': 'Назва тегу "{tag}" є недопустимою', 'ko': '"{tag}"라는 태그명은 사용할 수 없습니다.' @@ -834,7 +834,7 @@ exports.strings = { 'es_AR': 'Usá alguno de estos comandos para tener más información:', 'es_ES': 'Por favor usa uno de los siguientes comandos para más información:', 'pt_BR': 'Use algum destes comandos para ter mais informações:', - 'fr_FR': 'Merci d\'utiliser une des commandes suivantes pour obtenir plus d\'info', + 'fr_FR': 'Merci d\'utiliser une des commandes suivantes pour obtenir plus d\'informations', 'ru_RU': 'Для получения большей информации используй следующие команды:', 'uk': 'Щоб отримати більше інформації використовуй наступні команди:', 'ko': '더 많은 정보를 위해 다음 명령어들중 하나를 사용하세요.' diff --git a/src/levels/advanced/multipleParents.js b/src/levels/advanced/multipleParents.js index 4a67f00d..93b5e3b7 100644 --- a/src/levels/advanced/multipleParents.js +++ b/src/levels/advanced/multipleParents.js @@ -209,13 +209,13 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "### Determine les Parents", + "### Détermine les parents", "", "Comme le symbole `~`, le symbole `^` accepte un numéro après lui.", "", "Au lieu d'entrer le nombre de générations à remonter (ce que `~` fait), le symbole `^` détermine quel parent est à remonter. Attention, un merge commit a deux parents ce qui peut porter à confusion.", "", - "Normalement Git suit le \"premier\" parent pour un commit/merge, mais avec un numéro suivi de `^` le comportement par défault est modifié.", + "Normalement Git suit le \"premier\" parent pour un commit/merge, mais avec un numéro suivi de `^` le comportement par défaut est modifié.", "", "Assez de bla bla, passons à l\'action", "" @@ -282,7 +282,7 @@ exports.level = { "markdowns": [ "### Un peu de pratique", "", - "Pour réussir le niveau, créez une nouvelle branche à la destination indiquée", + "Pour réussir le niveau, créez une nouvelle branche à la destination indiquée.", "", "Évidement ce serait plus rapide de spécifier le commit (C6 par exemple), mais faites-le plutôt avec les symboles de déplacement dont nous venons de parler !" ] diff --git a/src/levels/index.js b/src/levels/index.js index af38e18a..f35474ad 100644 --- a/src/levels/index.js +++ b/src/levels/index.js @@ -183,7 +183,7 @@ var sequenceInfo = exports.sequenceInfo = { about: { 'en_US': 'Get comfortable with modifying the source tree', 'de_DE': 'Gewöhn dich daran, den Git-Baum zu verändern', - 'fr_FR': 'Soyez alaise de modifier l\'arbre Git', + 'fr_FR': 'Soyez à l\'aise pour modifier l\'arbre Git', 'es_AR': 'Ponete cómodo con modificar el directorio fuente', 'pt_BR': 'Fique confortável em modificar a árvore de códigos', 'ko' : '작업 트리를 수정하는건 식은죽 먹기지요 이제', @@ -227,7 +227,7 @@ var sequenceInfo = exports.sequenceInfo = { 'en_US': 'Advanced Topics', 'de_DE': 'Themen für Fortgeschrittene', 'ja' : '上級トピック', - 'fr_FR': 'Sujets Avancés', + 'fr_FR': 'Sujets avancés', 'es_AR': 'Temas avanzados', 'pt_BR': 'Temas avançados', 'zh_CN': '高级话题', diff --git a/src/levels/intro/branching.js b/src/levels/intro/branching.js index b77195ca..79c00471 100644 --- a/src/levels/intro/branching.js +++ b/src/levels/intro/branching.js @@ -462,7 +462,7 @@ exports.level = { "Travaillons mainenant dans cette branche. Appuyez sur le bouton ci-dessous." ], "afterMarkdowns": [ - "Oh non! La branche `master` a bougé mais pas la branche `newImage` ! C'est parce que nous n'étions pas \"sur\" la nouvelle branche, comme indiqué par l'asterisque (*) sur `master`" + "Oh non! La branche `master` a bougé mais pas la branche `newImage` ! C'est parce que nous n'étions pas \"sur\" la nouvelle branche, comme indiqué par l'astérisque (*) sur `master`" ], "command": "git commit", "beforeCommand": "git branch newImage" diff --git a/src/levels/intro/merging.js b/src/levels/intro/merging.js index 21f2be7c..35a1d2bb 100644 --- a/src/levels/intro/merging.js +++ b/src/levels/intro/merging.js @@ -384,7 +384,7 @@ exports.level = { "markdowns": [ "## Branches et Merges", "", - "Super ! Nous savons désormais comment faire des commits et des branches. Maintenant nous devons apprendre comment combiner ensemble les contenus de deux branches différentes. Ceci nous permettra de créer une nouvelle branche, développer une nouvelle fonctionnalité sur cette dernière, puis intégrer cette fonctionnalité en combinant le contenu de cette branche de développement à la branche d'origine(master par exemple).", + "Super ! Nous savons désormais comment faire des commits et des branches. Maintenant nous devons apprendre comment combiner ensemble les contenus de deux branches différentes. Ceci nous permettra de créer une nouvelle branche, développer une nouvelle fonctionnalité sur cette dernière, puis intégrer cette fonctionnalité en combinant le contenu de cette branche de développement à la branche d'origine (master par exemple).", "", "La première méthode que nous allons voir pour combiner le contenu de deux branches est `git merge`. Faire un 'merge' avec Git crée un commit spécial qui a deux parents. Un commit avec deux parents indique en susbtance \"Je veux inclure le contenu de ce parent et le contenu de cet autre parent, *et* l'ensemble de leurs parents.\"", "", @@ -418,7 +418,7 @@ exports.level = { "Faisons un merge de `master` dans `bugFix`:" ], "afterMarkdowns": [ - "Puisque `bugFix` était un descendant de `master`, git n'avait aucun travail à effectuer ; il a simplement déplacé `bugFix` au même commit auquel `master` est attaché.", + "Puisque `bugFix` était un descendant de `master`, git n'avait aucun travail à effectuer; il a simplement déplacé `bugFix` au même commit auquel `master` est attaché.", "", "Maintenant tous les commits sont de la même couleur, ce qui indique que chaque branche contient tout le contenu du dépôt ! Woohoo!" ], diff --git a/src/levels/intro/rebasing.js b/src/levels/intro/rebasing.js index 6d7c2f47..3cfb56bd 100644 --- a/src/levels/intro/rebasing.js +++ b/src/levels/intro/rebasing.js @@ -386,7 +386,7 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Ici nous avons encore une fois deux branches; notez que nous sommes sur la branche bugFix (cf. l'asterisque)", + "Ici nous avons encore une fois deux branches; notez que nous sommes sur la branche bugFix (cf. l'astérisque)", "", "Nous voudrions transférer notre travail de la branche 'bugFix' directement sur le travail existant dans 'master'. Ainsi on aurait l'impression que ces deux travaux ont été développés séquentiellement alors qu'en réalité ils ont été réalisés en parallèle.", "", diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js index 167cf55c..a1442d8b 100644 --- a/src/levels/mixed/describe.js +++ b/src/levels/mixed/describe.js @@ -17,7 +17,7 @@ }, "hint": { "en_US": "Just commit once on bugFix when you're ready to move on", - "fr_FR": "Faites un commit sur bugFix quand vous êtes pret", + "fr_FR": "Faites un commit sur bugFix quand vous êtes prêt", "de_DE": "Committe nur einmal auf bugFix, wenn du soweit bist", "ja" : "次に進む準備が整ったなら、bugFixに対して一回commitしてください", "es_AR": "Simplemente commiteá una vez en bugFix cuando estés listo para seguir", @@ -102,7 +102,7 @@ "", "Parce ce que les tags sont de très bonnes références dans le code, git à une commande pour *décrire* (describe) la différence entre le commit et le tag le plus récent. Cette commande s'appelle `git describe` !", "", - "Git describe peut vous aider lorsque vous vous êtes beaucoup déplacé ; cela peut arriver après un git bisect (chercher l'apparition d'un bug) ou lorsque vous revenez de vacances après 3 semaines sur l'ordinateur d'un collègue." + "Git describe peut vous aider lorsque vous vous êtes beaucoup déplacé; cela peut arriver après un git bisect (chercher l'apparition d'un bug) ou lorsque vous revenez de vacances après 3 semaines sur l'ordinateur d'un collègue." ] } }, @@ -114,7 +114,7 @@ "", "`git describe `", "", - "où `` est un n'importe quelle chose que git peut résoudre en un commit. Si vous ne specifiez pas de ref, `HEAD` est pris par défault.", + "où `` est un n'importe quelle chose que git peut résoudre en un commit. Si vous ne spécifiez pas de ref, `HEAD` est pris par défaut.", "", "Le résultat de la commande ressemble à :", "", diff --git a/src/levels/mixed/jugglingCommits.js b/src/levels/mixed/jugglingCommits.js index b7268699..7b2d2533 100644 --- a/src/levels/mixed/jugglingCommits.js +++ b/src/levels/mixed/jugglingCommits.js @@ -21,7 +21,7 @@ exports.level = { "ko": "커밋들 갖고 놀기", "en_US": "Juggling Commits", "de_DE": "Jonglieren mit Commits", - "fr_FR": "Jongler avec les Commits", + "fr_FR": "Jongler avec les commits", "es_AR": "Haciendo malabares con los commits", "pt_BR": "Malabarismo com commits", "ja": "コミットをやりくりする", @@ -84,9 +84,9 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "## Jongler avec les Commits", + "## Jongler avec les commits", "", - "Voici une autre situation fréquente. Vous avez certains changements (`newImage`) et un autre groupe de changements (`caption`) qui sont reliés, ils sont donc empilés l'un sur l'autre dans votre dépôt Git (i.e. un après l'autre).", + "Voici une autre situation fréquente. Vous avez certains changements (`newImage`) et un autre groupe de changements (`caption`) qui sont reliés, ils sont donc empilés l'un sur l'autre dans votre dépôt Git (i.e. l'un après l'autre).", "", "Là où ça se complique c'est lorsque vous devez faire une petite modification dans un commit antérieur. Dans ce cas, les configurations de `newImage` devront changer un peu, même si ce commit est loin dans notre historique !!" ] @@ -105,9 +105,9 @@ exports.level = { "", "Il y a plusieurs façons d'atteindre ce but (cherry-pick semble très tentant), mais nous allons parler de cherry-pick plus tard, pour le moment concentrez-vous sur cette technique.", "", - "Pour terminer, Faites attention au but -- Dû au fait que nous déplaçons les commits 2 fois, ils se retrouvent les deux avec une apostrophe. Une deuxième apostrophe est ajouté sur le commit que nous modifions, ce qui nous donne l'arbre finale ", + "Pour terminer, Faites attention au but -- Dû au fait que nous déplaçons les commits 2 fois, ils se retrouvent tous les deux avec une apostrophe. Une deuxième apostrophe est ajoutée sur le commit que nous modifions, ce qui nous donne la forme finale de l'arbre.", "", - "Ceci étant dit, je peux comparer le résultat avec la stucture et les différentes apostophes. Tant que votre arbre master a la même structure et apostrophe le niveau sera considéré réussi." + "Ceci étant dit, je peux comparer le résultat avec la structure et les différentes apostrophes. Tant que votre arbre `master` a la même structure et les différentes apostrophes le niveau sera considéré réussi." ] } }, diff --git a/src/levels/mixed/jugglingCommits2.js b/src/levels/mixed/jugglingCommits2.js index 0c2b3615..067a0ab1 100644 --- a/src/levels/mixed/jugglingCommits2.js +++ b/src/levels/mixed/jugglingCommits2.js @@ -31,7 +31,7 @@ exports.level = { }, "hint": { "en_US": "Don't forget to forward master to the updated changes!", - "fr_FR": "N'oubliez pas de forwarder la branch master dans la nouvelle branch", + "fr_FR": "N'oubliez pas d'appliquer les changements depuis la branche master", "es_AR": "¡No te olvides de avanzar master a los cambios actualizados!", "pt_BR": "Não se esqueça de avançar a referência do master para as mudanças efetuadas!", "de_DE": "Vergiss nicht den master auf die aktuelle Version vorzuspulen", diff --git a/src/levels/mixed/tags.js b/src/levels/mixed/tags.js index 1e00da6a..a52c5ea7 100644 --- a/src/levels/mixed/tags.js +++ b/src/levels/mixed/tags.js @@ -100,7 +100,7 @@ "type": "ModalAlert", "options": { "markdowns": [ - "Vous l'avez deviné ! Git tags offre cette fonctionnalité : les tags marquent à jamais certains commits comme \"milestone\" auxquels vous pouvez vous référez comme à des branches.", + "Vous l'avez deviné ! Les tags Git offrent cette fonctionnalité : les tags marquent à jamais certains commits comme \"milestone\" (étape clé) auxquels vous pouvez vous référer comme à des branches.", "", "Encore plus important, il sont définitifs. Vous ne pouvez donc pas rajouter de commit dans un tag : les tags sont un peu comme un pointeur définitif dans l'arbre des commits.", "", diff --git a/src/levels/rampup/cherryPick.js b/src/levels/rampup/cherryPick.js index ce0094a3..c82bce2d 100644 --- a/src/levels/rampup/cherryPick.js +++ b/src/levels/rampup/cherryPick.js @@ -20,7 +20,7 @@ "uk": "Знайомство з cherry-pick" }, "hint": { - "fr_FR": "git cherry-pick suivis par les noms de commits", + "fr_FR": "git cherry-pick suivi par les noms de commits", "en_US": "git cherry-pick followed by commit names!", "de_DE": "git cherry-pick gefolgt von Commit-Namen.", "ja" : "git cherry-pickの後にコミット名を追加", diff --git a/src/levels/rampup/detachedHead.js b/src/levels/rampup/detachedHead.js index 887c635a..62b9200a 100644 --- a/src/levels/rampup/detachedHead.js +++ b/src/levels/rampup/detachedHead.js @@ -6,7 +6,7 @@ exports.level = { "en_US": "Detach yo' HEAD", "es_AR": "Desatacheá tu HEAD", "pt_BR": "Solte a sua cabeça", - "fr_FR": "Détachez votre HEAD", + "fr_FR": "Détacher votre HEAD", "zh_CN": "分离 HEAD", "zh_TW": "分離 HEAD", "de_DE": "Den Kopf abtrennen", @@ -21,7 +21,7 @@ exports.level = { "pt_BR": "Use o identificador (hash) sobre o commit para te ajudar!", "de_DE": "Benutze den Bezeichner (den Hash) des Commits.", "ja" : "コミットのラベル(hash)を使用", - "fr_FR": "Utiiser le label (identifiant) du commit pour aider !", + "fr_FR": "Utilisez le label (identifiant) du commit pour aider !", "zh_TW": "使用 commit 上的標籤(hash)來幫助你!", "zh_CN": "使用提交记录上的标签(哈希值)来指定提交记录!", "ru_RU": "Ориентируйся по идентификаторам (hash) коммитов.", diff --git a/src/levels/rampup/interactiveRebase.js b/src/levels/rampup/interactiveRebase.js index a99713f9..d4f79450 100644 --- a/src/levels/rampup/interactiveRebase.js +++ b/src/levels/rampup/interactiveRebase.js @@ -11,7 +11,7 @@ "es_AR": "podés usar tanto ramas como referencias relativas (HEAD~) para especificar el objetivo del rebase", "pt_BR": "Você pode usar ou ramos ou referências relativas (HEAD~) para especificar o alvo do rebase", "de_DE": "Du kannst entweder Branches oder relative Ref-Angaben (z.B. HEAD~) benutzen, um das Ziel des Rebase anzugeben.", - "fr_FR": "Vous pouvez utiliser soit les branches, soit les références relatives (HEAD~) pour spéficier la cible à rebaser", + "fr_FR": "Vous pouvez utiliser soit les branches, soit les références relatives (HEAD~) pour spécifier la cible à rebaser", "zh_CN": "branch 或者是相对位置(HEAD~)都可以用來指定 rebase 的目标", "zh_TW": "你可以指定 branch 或者是相對位置(HEAD~)來表示 rebase 的目標", "ru_RU": "Можно использовать либо ветки, либо относительные ссылки (HEAD~), чтобы указать цель для Rebase", @@ -108,7 +108,7 @@ "", "Git cherry-pick est pratique quand vous savez exactement quels commits vous voulez (_et_ que vous connaissez leurs identifiants) -- il est difficile de battre la simplicité qu'il procure.", "", - "Mais que faire quand vous ne connaissez pas les identifiants des commits ? Heureusement git a pensé à vous dans pour ce cas-là ! Nous pouvons utiliser un rebase interactif pour cela -- c'est la meilleure façon de reconsidérer une série de commits que vous vous apprêtez à rebaser.", + "Mais que faire quand vous ne connaissez pas les identifiants des commits ? Heureusement git a pensé à vous pour ce cas-là ! Nous pouvons utiliser un rebase interactif pour cela -- c'est la meilleure façon de reconsidérer une série de commits que vous vous apprêtez à rebaser.", "", "Allons un peu plus dans les détails ..." ] diff --git a/src/levels/rampup/relativeRefs2.js b/src/levels/rampup/relativeRefs2.js index c3ac4171..03acaf62 100644 --- a/src/levels/rampup/relativeRefs2.js +++ b/src/levels/rampup/relativeRefs2.js @@ -287,7 +287,7 @@ exports.level = { "Voyons l'effet de la précédente commande" ], "afterMarkdowns": [ - "On y est ! Les références relatives nous donne une méthode concise pour référencer `C1` et le forçage de branche (`-f`) nous donne une méthode rapide pour bouger une branche à cet emplacement." + "On y est ! Les références relatives nous donnent une méthode concise pour référencer `C1` et le forçage de branche (`-f`) nous donne une méthode rapide pour bouger une branche à cet emplacement." ], "command": "git branch -f master HEAD~3", "beforeCommand": "git commit; git commit; git commit; git checkout -b bugFix" diff --git a/src/levels/rampup/reversingChanges.js b/src/levels/rampup/reversingChanges.js index c84ac7e5..2746c8ed 100644 --- a/src/levels/rampup/reversingChanges.js +++ b/src/levels/rampup/reversingChanges.js @@ -353,7 +353,7 @@ exports.level = { "markdowns": [ "## Annuler des changements avec Git", "", - "Il y a de nombreuses façons d'annuler des changement avec Git. De même que pour les commits, annuler des changements avec Git est à la fois un aspect bas-niveau (gestion des fichiers et morceaux de fichiers) et un aspect de plus haut niveau (comment les changements sont effectivement annulés). Nous allons nous intéresser à ce dernier point.", + "Il y a de nombreuses façons d'annuler des changements avec Git. De même que pour les commits, annuler des changements avec Git est à la fois un aspect bas-niveau (gestion des fichiers et morceaux de fichiers) et un aspect de plus haut niveau (comment les changements sont effectivement annulés). Nous allons nous intéresser à ce dernier point.", "", "Il y a principalement deux façons d'annuler des changements avec Git : l'une est `git reset` et l'autre est `git revert`. Nous allons maintenant voir chacune de ces façons.", "" @@ -400,7 +400,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Pour accomplir ce niveau, annulez les deux derniers commits à la fois sur `local` et sur `pushed`.", + "Pour accomplir ce niveau, annulez les derniers commits à la fois sur `local` et sur `pushed`. Vous devez annuler en tout 2 commits (un pour chaque branche).", "", "Ayez à l'esprit que `pushed` est une branche distante et `local` est une branche locale ; cela devrait vous guider dans le choix de la méthode à employer." ] diff --git a/src/levels/rebase/selectiveRebase.js b/src/levels/rebase/selectiveRebase.js index f337a353..328216d3 100644 --- a/src/levels/rebase/selectiveRebase.js +++ b/src/levels/rebase/selectiveRebase.js @@ -65,9 +65,9 @@ exports.level = { "", "Actuellement nous avons `master` qui se situe quelques commits devant les branches `one` `two` et `three`. Pour une raison quelconque, nous avons besoin de mettre ces trois branches à jour avec les modifications des derniers commits sur master.", "", - "La branche `one` a besoin d'une réorganisation et de la suppression de `C5`. `two` doit simplement être reordonnée, et `three` ne nécessite qu'un commit !", + "La branche `one` a besoin d'une réorganisation et de la suppression de `C5`. `two` doit simplement être réordonnée, et `three` ne nécessite qu'un commit !", "", - "Nous vous laissons imaginer la solution pour ce niveau ; comparez avec notre solution après-coup avec la commande `show solution`. " + "Nous vous laissons imaginer la solution pour ce niveau; comparez avec notre solution après-coup avec la commande `show solution`. " ] } } diff --git a/src/levels/remote/pushManyFeatures.js b/src/levels/remote/pushManyFeatures.js index 976fd613..da1742ae 100644 --- a/src/levels/remote/pushManyFeatures.js +++ b/src/levels/remote/pushManyFeatures.js @@ -124,7 +124,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Ce niveau est assez conséquent ; voici l'idée générale de la solution :", + "Ce niveau est assez conséquent; voici l'idée générale de la solution :", "", "* Il y a trois feature branches : `side1` `side2` et `side3`", "* Nous voulons envoyer chacune de ces modifications, dans l'ordre, sur le dépôt distant", From 5c92e692d3f4c310cab563165cfdc88b22a69c9e Mon Sep 17 00:00:00 2001 From: Daniel Le Berre Date: Tue, 22 Jan 2019 09:50:51 +0100 Subject: [PATCH 059/359] Fix french translation --- src/levels/rampup/interactiveRebase.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/rampup/interactiveRebase.js b/src/levels/rampup/interactiveRebase.js index a99713f9..9571eb86 100644 --- a/src/levels/rampup/interactiveRebase.js +++ b/src/levels/rampup/interactiveRebase.js @@ -108,7 +108,7 @@ "", "Git cherry-pick est pratique quand vous savez exactement quels commits vous voulez (_et_ que vous connaissez leurs identifiants) -- il est difficile de battre la simplicité qu'il procure.", "", - "Mais que faire quand vous ne connaissez pas les identifiants des commits ? Heureusement git a pensé à vous dans pour ce cas-là ! Nous pouvons utiliser un rebase interactif pour cela -- c'est la meilleure façon de reconsidérer une série de commits que vous vous apprêtez à rebaser.", + "Mais que faire quand vous ne connaissez pas les identifiants des commits ? Heureusement git a pensé à vous pour ce cas-là ! Nous pouvons utiliser un rebase interactif pour cela -- c'est la meilleure façon de reconsidérer une série de commits que vous vous apprêtez à rebaser.", "", "Allons un peu plus dans les détails ..." ] From e86175843b946649389865e87d7c258905c03e34 Mon Sep 17 00:00:00 2001 From: Daniel Le Berre Date: Tue, 22 Jan 2019 10:19:01 +0100 Subject: [PATCH 060/359] Yet another small french typo fix --- src/levels/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/index.js b/src/levels/index.js index af38e18a..a305f8f3 100644 --- a/src/levels/index.js +++ b/src/levels/index.js @@ -183,7 +183,7 @@ var sequenceInfo = exports.sequenceInfo = { about: { 'en_US': 'Get comfortable with modifying the source tree', 'de_DE': 'Gewöhn dich daran, den Git-Baum zu verändern', - 'fr_FR': 'Soyez alaise de modifier l\'arbre Git', + 'fr_FR': 'Soyez à l\'aise pour modifier l\'arbre Git', 'es_AR': 'Ponete cómodo con modificar el directorio fuente', 'pt_BR': 'Fique confortável em modificar a árvore de códigos', 'ko' : '작업 트리를 수정하는건 식은죽 먹기지요 이제', From 7c0251fe0ceb73f45548a240d1c60a3cbbb3b3e5 Mon Sep 17 00:00:00 2001 From: Bezout Date: Sun, 20 Jan 2019 09:53:21 +0100 Subject: [PATCH 061/359] pick -> Omit/Pick --- src/template.index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/template.index.html b/src/template.index.html index 5fbc5fd6..6647fd8b 100644 --- a/src/template.index.html +++ b/src/template.index.html @@ -399,7 +399,7 @@

<% } %>

- (Drag and drop to re-order. Toggle the "pick" button to omit or re-add a commit) + (Drag and drop to re-order. Toggle the "Omit/Pick" button to omit or re-add a commit)

    From 70fd61b68476ca179fce8792eb1380f18aebd191 Mon Sep 17 00:00:00 2001 From: Nikita Volobuev Date: Tue, 19 Feb 2019 16:28:13 +0200 Subject: [PATCH 062/359] Make button text unselectable --- src/style/main.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/style/main.css b/src/style/main.css index be68b9d7..43a05ba9 100644 --- a/src/style/main.css +++ b/src/style/main.css @@ -1168,6 +1168,12 @@ div.gitDemonstrationView { text-shadow: rgba(0,0,0,.4) 0 1px 0; color: white; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + vertical-align: middle; cursor: pointer; } From e4fd2065515093a1f892179eeb9c17feb32a4b24 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Wed, 20 Feb 2019 14:14:24 -0800 Subject: [PATCH 063/359] Resolves #540 --- src/levels/remote/pullArgs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/remote/pullArgs.js b/src/levels/remote/pullArgs.js index a746ef3b..7b63fc00 100644 --- a/src/levels/remote/pullArgs.js +++ b/src/levels/remote/pullArgs.js @@ -74,7 +74,7 @@ exports.level = { "If we specify the place to fetch, everything happens as before with fetch but we merge in whatever was just fetched" ], "afterMarkdowns": [ - "See! by specifying `master` we downloaded commits onto `o/master` just as normal. Then we merged `o/master` to where we are, *regardless* of what was currently checked out." + "See! by specifying `master` we downloaded commits onto `o/master` just as normal. Then we merged `o/master` to our currently checked out location which is *not* the local branch `master`. For this reason it can actually make sense to run git pull multiple times (with the same args) from different locations in order to update multiple branches." ], "command": "git pull origin master", "beforeCommand": "git clone; go -b bar; git commit; git fakeTeamwork" From 9a7a4d4c46fa88d02d92fdc6d75bce0cb307b9a3 Mon Sep 17 00:00:00 2001 From: Bernhard Weichel Date: Mon, 25 Feb 2019 15:50:29 +0000 Subject: [PATCH 064/359] see #543 improved git describe --- src/levels/mixed/describe.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js index a1442d8b..b0445568 100644 --- a/src/levels/mixed/describe.js +++ b/src/levels/mixed/describe.js @@ -1,4 +1,4 @@ -exports.level = { +exports.level = { "goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\",\"remoteTrackingBranchID\":null},\"side\":{\"target\":\"C4\",\"id\":\"side\",\"remoteTrackingBranchID\":null},\"bugFix\":{\"target\":\"C7\",\"id\":\"bugFix\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"},\"C5\":{\"parents\":[\"C3\"],\"id\":\"C5\"},\"C6\":{\"parents\":[\"C5\"],\"id\":\"C6\"},\"C7\":{\"parents\":[\"C6\"],\"id\":\"C7\"}},\"tags\":{\"v0\":{\"target\":\"C0\",\"id\":\"v0\",\"type\":\"tag\"},\"v1\":{\"target\":\"C3\",\"id\":\"v1\",\"type\":\"tag\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}", "solutionCommand": "git commit ", "startTree": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\",\"remoteTrackingBranchID\":null},\"side\":{\"target\":\"C4\",\"id\":\"side\",\"remoteTrackingBranchID\":null},\"bugFix\":{\"target\":\"C6\",\"id\":\"bugFix\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"},\"C5\":{\"parents\":[\"C3\"],\"id\":\"C5\"},\"C6\":{\"parents\":[\"C5\"],\"id\":\"C6\"}},\"tags\":{\"v0\":{\"target\":\"C0\",\"id\":\"v0\",\"type\":\"tag\"},\"v1\":{\"target\":\"C3\",\"id\":\"v1\",\"type\":\"tag\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}", @@ -437,7 +437,9 @@ "", "`__g`", "", - "`` ist dabei der nächstliegende Tag in den Vorgänger-Commits, `` zeigt an, wieviele Commits dieses Tag entfernt ist und `` ist das SHA des Commits, auf den das Tag zeigt." + "`` ist dabei der nächstliegende Tag in den Vorgänger-Commits, `` zeigt an, wieviele Commits dieses Tag entfernt ist und `` ist das SHA des Commits, auf den HEAD zeigt.", + "", + "**Achtung**: `` und `` erscheint nur, wenn HEAD nicht auf ein Tag zeigt. `git describe` verarbeitet standardmässig nur annotierte Tags. Um nicht annotierte tags zu sehen, verwende bitte`git describe --tags`." ] } }, From 79c8b1551cbd82943645591ad7402a655ac826ad Mon Sep 17 00:00:00 2001 From: Marcel Richter Date: Mon, 25 Feb 2019 17:46:21 +0100 Subject: [PATCH 065/359] German translation fix --- src/levels/remote/tracking.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/remote/tracking.js b/src/levels/remote/tracking.js index 8892cd6b..150e8956 100644 --- a/src/levels/remote/tracking.js +++ b/src/levels/remote/tracking.js @@ -782,7 +782,7 @@ exports.level = { "", " git checkout -b absolut_nicht_master o/master", "", - "eingibt, wir ein neuer lokaler Branch namens `absolut_nicht_master` angelegt, der `o/master` trackt." + "eingibt, wird ein neuer lokaler Branch namens `absolut_nicht_master` angelegt, der `o/master` trackt." ] } }, From 8ea87eb55da7db41a1aa61c99c62cd4b3dea4e96 Mon Sep 17 00:00:00 2001 From: Jan Keromnes Date: Tue, 26 Feb 2019 14:52:10 +0000 Subject: [PATCH 066/359] Make contributions easier --- .gitpod.yml | 6 ++++++ README.md | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 .gitpod.yml diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 00000000..8fd958bc --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,6 @@ +ports: +- port: 8000 + onOpen: open-preview +tasks: +- init: npm install && npm install -g grunt-cli + command: grunt build && python3 -m http.server 8000 diff --git a/README.md b/README.md index 371266bc..bd03cc58 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ You'll also need `npm` to download all the dependencies of the project. The general workflow / steps are below: -``` +```bash git clone cd learnGitBranching npm install # to install all the node modules I depend on @@ -97,6 +97,10 @@ git push # go online and request a pull ``` +Alternatively, you can also build and run the app in a pre-configured online workspace: + +[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/pcottle/learnGitBranching/blob/master/src/js/git/index.js) + ## Helpful Folks A big shoutout to these brave souls for extensively testing our sandbox and finding bugs and/or inconsistencies: From a5a2d149e90ee71fb81478fd71e5ac1d588d0a96 Mon Sep 17 00:00:00 2001 From: MichaWiedenmann Date: Tue, 26 Feb 2019 21:48:06 +0100 Subject: [PATCH 067/359] Update German translation Update translation of "Show Goal" and "Hide Goal". --- src/js/intl/strings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js index 20683cc4..d465b700 100755 --- a/src/js/intl/strings.js +++ b/src/js/intl/strings.js @@ -1169,7 +1169,7 @@ exports.strings = { 'show-goal-button': { '__desc__': 'button label to show goal', 'en_US': 'Show Goal', - 'de_DE': 'Schauen Ziel', + 'de_DE': 'Ziel anzeigen', 'zh_TW': '顯示目標', 'zh_CN': '显示目标', 'fr_FR': 'Afficher les cibles', @@ -1185,7 +1185,7 @@ exports.strings = { 'hide-goal-button': { '__desc__': 'button label to hide goal', 'en_US': 'Hide Goal', - 'de_DE': 'Verstecken Ziel', + 'de_DE': 'Ziel verstecken', 'fr_FR': 'Cacher les cibles', 'zh_TW': '隱藏目標', 'zh_CN': '隐藏目标', From 21d8bf2858ca490a0f74b02657243fbec1523668 Mon Sep 17 00:00:00 2001 From: Jan Keromnes Date: Wed, 27 Feb 2019 08:59:21 +0100 Subject: [PATCH 068/359] Use 'grunt fastBuild' in Gitpod to build the app faster --- .gitpod.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitpod.yml b/.gitpod.yml index 8fd958bc..4ecce526 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -3,4 +3,4 @@ ports: onOpen: open-preview tasks: - init: npm install && npm install -g grunt-cli - command: grunt build && python3 -m http.server 8000 + command: grunt fastBuild && python3 -m http.server 8000 From d2e4fa9d71e86914c110a5d9dd970073f0889bd7 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Wed, 27 Feb 2019 10:13:27 -0800 Subject: [PATCH 069/359] whitespace for travis --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bd03cc58..8e9a6cd1 100644 --- a/README.md +++ b/README.md @@ -130,3 +130,4 @@ And the following heroes for assisting in translating: Also huge shoutout for everyone who has put up a pull request that was pulled! Check out the 30+ contributors we have in the [Contributors View](https://github.com/pcottle/learnGitBranching/graphs/contributors) And everyone who has reported an issue that was successfully closed! + From a7b537787c9eef716152c6dce0fbefb816d5b63e Mon Sep 17 00:00:00 2001 From: Jan Keromnes Date: Thu, 28 Feb 2019 11:47:39 +0000 Subject: [PATCH 070/359] Print helpful welcome message in Gitpod --- .gitpod.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitpod.yml b/.gitpod.yml index 4ecce526..325d71a3 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -3,4 +3,7 @@ ports: onOpen: open-preview tasks: - init: npm install && npm install -g grunt-cli - command: grunt fastBuild && python3 -m http.server 8000 + command: > + grunt fastBuild && + printf "\nWelcome to Learn Git Branching\nTo rebuild the app, simply run 'grunt fastBuild' and reload index.html.\n\n" && + python3 -m http.server 8000 2>/dev/null From 904a2c5fbf4d316896c547ef73e4e913759b984b Mon Sep 17 00:00:00 2001 From: Rocky Gray Date: Fri, 1 Mar 2019 17:48:22 -0500 Subject: [PATCH 071/359] Refactor show commands to extract keys from the object fixes #541 --- src/js/sandbox/commands.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/js/sandbox/commands.js b/src/js/sandbox/commands.js index 8b913564..7f4e359d 100644 --- a/src/js/sandbox/commands.js +++ b/src/js/sandbox/commands.js @@ -97,9 +97,10 @@ var instantCommands = [ intl.str('show-all-commands'), '
    ' ]; - allCommands.forEach(function(regex, command) { - lines.push(command); - }); + Object.keys(allCommands) + .forEach(function(command) { + lines.push(command); + }); throw new CommandResult({ msg: lines.join('\n') From e26044e0a91da6d4216172240bd29feb3a7781f2 Mon Sep 17 00:00:00 2001 From: Victor Lopez Romero Date: Fri, 25 Jan 2019 13:48:31 +0100 Subject: [PATCH 072/359] Add configuration for Galician language Add translations for intro1 Add translations for intro2 Fix intro Add translations for intro3 Add translations for intro4 Fix intro - rebasing Add translations for rampup1 Add translations for level index add dialog translations Fix dialogs add transations over rebase module rebase add advances transations Add Strings file in intl Fix hit message Add translations to mixed module Fix mixed Add rampup1 Add rampup2 Add rampup3 Add rampup4 Add translations to move1 Add move2 Add remote1 Add remote6 Add fakeTeamwork Add fetch file Add fetchArgs fetch rebase Tracking source nothing Remote branches push many features Merge many feautures Pull Pull args push args Push args2 Fix erratas --- src/js/dialogs/confirmShowSolution.js | 10 ++ src/js/dialogs/levelBuilder.js | 19 +++ src/js/dialogs/nextLevel.js | 11 ++ src/js/dialogs/sandbox.js | 56 +++++++++ src/js/intl/strings.js | 97 ++++++++++++++- src/js/react_views/IntlHelperBarView.jsx | 6 + src/levels/advanced/multipleParents.js | 90 ++++++++++++++ src/levels/index.js | 14 +++ src/levels/intro/branching.js | 84 +++++++++++++ src/levels/intro/commits.js | 44 +++++++ src/levels/intro/merging.js | 71 +++++++++++ src/levels/intro/rebasing.js | 69 +++++++++++ src/levels/mixed/describe.js | 65 ++++++++++ src/levels/mixed/grabbingOneCommit.js | 41 +++++++ src/levels/mixed/jugglingCommits.js | 37 ++++++ src/levels/mixed/jugglingCommits2.js | 45 +++++++ src/levels/mixed/tags.js | 54 +++++++++ src/levels/rampup/cherryPick.js | 63 +++++++++- src/levels/rampup/detachedHead.js | 80 +++++++++++++ src/levels/rampup/interactiveRebase.js | 67 +++++++++++ src/levels/rampup/relativeRefs.js | 77 ++++++++++++ src/levels/rampup/relativeRefs2.js | 71 +++++++++++ src/levels/rampup/reversingChanges.js | 67 ++++++++++- src/levels/rebase/manyRebases.js | 20 ++++ src/levels/rebase/selectiveRebase.js | 22 ++++ src/levels/remote/clone.js | 59 +++++++++ src/levels/remote/fakeTeamwork.js | 56 +++++++++ src/levels/remote/fetch.js | 75 ++++++++++++ src/levels/remote/fetchArgs.js | 125 +++++++++++++++++++ src/levels/remote/fetchRebase.js | 146 +++++++++++++++++++++++ src/levels/remote/mergeManyFeatures.js | 47 ++++++++ src/levels/remote/pull.js | 61 ++++++++++ src/levels/remote/pullArgs.js | 76 ++++++++++++ src/levels/remote/push.js | 44 +++++++ src/levels/remote/pushArgs.js | 74 ++++++++++++ src/levels/remote/pushArgs2.js | 72 +++++++++++ src/levels/remote/pushManyFeatures.js | 55 +++++++++ src/levels/remote/remoteBranches.js | 64 ++++++++++ src/levels/remote/sourceNothing.js | 55 +++++++++ src/levels/remote/tracking.js | 122 +++++++++++++++++++ 40 files changed, 2405 insertions(+), 6 deletions(-) diff --git a/src/js/dialogs/confirmShowSolution.js b/src/js/dialogs/confirmShowSolution.js index b846cb43..966b993e 100644 --- a/src/js/dialogs/confirmShowSolution.js +++ b/src/js/dialogs/confirmShowSolution.js @@ -59,6 +59,16 @@ exports.dialog = { ] } }], + 'gl': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## ¿Queres ver a solución?', + '', + 'Seguro que podes, ¡inténtao unha vez máis!' + ] + } + }], 'fr_FR': [{ type: 'ModalAlert', options: { diff --git a/src/js/dialogs/levelBuilder.js b/src/js/dialogs/levelBuilder.js index 8ea2f989..411a88ae 100644 --- a/src/js/dialogs/levelBuilder.js +++ b/src/js/dialogs/levelBuilder.js @@ -113,6 +113,25 @@ exports.dialog = { ] } }], + 'gl': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## Benvido ó constructor de niveis!', + '', + 'Estes son os pasos principais:', + '', + ' * Prepara o eido inicial usando comandos de Git', + ' * Define a árbore inicial con ```define start```', + ' * Inserta a secuencia de comandos de git que representan a mellor solución', + ' * Define a árbore obxectivo con ```define goal```. O obxectivo tamén determina a solución', + ' * Opcionalmente, define axudas con ```define hint```', + ' * Dalle un nome con ```define name```', + ' * Opcionalmente, define unha mensaxe inicial con ```edit dialog```', + ' * Escribe o comando ```finish``` para obter seu nivel en formato JSON!' + ] + } + }], 'fr_FR': [{ type: 'ModalAlert', options: { diff --git a/src/js/dialogs/nextLevel.js b/src/js/dialogs/nextLevel.js index 49d1ebc9..69d0c9ad 100644 --- a/src/js/dialogs/nextLevel.js +++ b/src/js/dialogs/nextLevel.js @@ -78,6 +78,17 @@ exports.dialog = { ] } }], + 'gl': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## Bo traballo!!', + '', + 'Resolviches o nivel empregando *{numCommands}* comandos; ', + 'a nosa mellor solución é en {best}.' + ] + } + }], 'fr_FR': [{ type: 'ModalAlert', options: { diff --git a/src/js/dialogs/sandbox.js b/src/js/dialogs/sandbox.js index bb088acc..84c69806 100644 --- a/src/js/dialogs/sandbox.js +++ b/src/js/dialogs/sandbox.js @@ -134,6 +134,62 @@ exports.dialog = { ] } }], + 'gl': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## Benvido a Learn Git Branching!', + '', + 'Esta aplicación foi desenvolvida para axudar os iniciados en git a ', + 'aprender os poderosos conceptos que hai por detrás do branching con ', + ' git. Agardamos que disfrutes desta aplicación, e tal vez, ', + 'ata aprendas algunha cousa!', + '', + '# Demostracións!', + '', + 'Se aínda non viches a demo, olla aquí:', + '', + '[https://pcottle.github.io/learnGitBranching/?demo](https://pcottle.github.io/learnGitBranching/?demo)', + '', + '¿Farto destas mensaxes? Engade `?NODEMO` á dirección para librarte dela, como no link de abaixo:', + '', + '[https://pcottle.github.io/learnGitBranching/?NODEMO](?NODEMO)' + ] + } + }, { + type: 'ModalAlert', + options: { + markdowns: [ + '## Comandos de git', + '', + 'Tes a túa disposición unha caixa de área con unha variedade de comandos de git:', + '', + ' * commit', + ' * branch', + ' * checkout', + ' * cherry-pick', + ' * reset', + ' * revert', + ' * rebase', + ' * merge' + ] + } + }, { + type: 'ModalAlert', + options: { + markdowns: [ + '## Compartir e importar!', + '', + 'Comparte árbores cos seus amigas con `export tree` e `import tree`', + '', + '¿Tes un enlace moi grande para compartir? Intenta construír un nivel con `build level` ou importe o nivel dun amigo con `import level`', + '', + 'Para ver tódolos comandos, usa `show commands`. Hai algunha xoia como `undo` e `reset`', + '', + 'Por agora, imos comezar cos `levels`...' + ] + } + }], 'de_DE': [{ type: 'ModalAlert', options: { diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js index d465b700..b7c2c416 100755 --- a/src/js/intl/strings.js +++ b/src/js/intl/strings.js @@ -10,6 +10,7 @@ exports.strings = { 'es_AR': '¡Ea! Terminaste el último nivel, ¡genial!', 'es_ES': '¡Felicitaciones! Terminaste el último nivel!', 'pt_BR': 'Uia! Você terminou o último nível, massa!', + 'gl' : '¡Yeeeha! Remataches o derradeiro nivel, ¡a tope!', 'fr_FR': 'Félicitations, vous avez réussi le dernier niveau !', 'ru_RU': 'Вау! Вы прошли последний уровень, отлично!', 'uk': 'Вау! Ти пройшов останній рівень, круто!', @@ -26,6 +27,7 @@ exports.strings = { 'es_AR': '¿Querés seguir con *"{nextLevel}"*, el próximo nivel?', 'es_ES': '¿Quieres seguir al nivel *"{nextLevel}"*, el próximo nivel?', 'pt_BR': 'Você gostaria de ir para o próximo nível: *"{nextLevel}"*?', + 'gl' : '¿Gustaríache ir o seguinte nivel: *"{nextLevel}"*?', 'fr_FR': 'Voulez-vous passer à *"{nextLevel}"*, le prochain niveau ?', 'ru_RU': 'Хотите перейти на следующий уровень: *"{nextLevel}"*?', 'uk': 'Хочеш перейти на наступний рівень -- *"{nextLevel}"*?', @@ -42,6 +44,7 @@ exports.strings = { 'zh_TW': '太強了,您的答案符合我們的預期甚至更好!', 'es_AR': '¡Fabuloso! Igualaste o superaste nuestra solución.', 'es_ES': '¡Fabuloso! Igualaste o superaste nuestra solución.', + 'gl' : '¡Fabuloso! Fixécholo igual ou mellor ca nosa solución.', 'fr_FR': 'Fabuleux ! Votre solution a égalé ou surpassé notre solution.', 'ru_RU': 'Отлично! Ваше решение соответствует или превосходит наше.', 'uk': 'Чудово! Твій розв’язок на рівні або кращий від нашого.', @@ -58,6 +61,7 @@ exports.strings = { 'es_AR': 'Fijate si podés bajarlo a usar sólo {best} comandos :D', 'es_ES': 'Trata de usar sólo {best} comandos :D', 'pt_BR': 'Veja se consegue reduzir para somente {best} :D', + 'gl' : 'Mira se consigues reducir a solo {best} :D', 'fr_FR': 'Voyons si vous pouvez descendre à {best} :D', 'ru_RU': 'Попробуйте, может вы сможете уложиться в {best} : D', 'uk': 'Спробуй, можливо ти зможеш вкластися в {best} кроків :D', @@ -72,6 +76,7 @@ exports.strings = { 'es_AR': '¡Cuidado! Mercurial hace garbage collection agresivamente y necesita eliminar tu árbol', 'es_ES': '¡Cuidado! Mercurial hace la colección de basura agresivamente (para administrar memoria) y necesita podar tu árbol.', 'pt_BR': 'Cuidado! O Mercurial faz coleção de lixo agressiva e precisa prunar sua árvore', + 'gl' : '¡Coidado! Mercurial fai que recolección de lixo agresivamente (para limpar memoria) e precisa podar a túa árbore.', 'fr_FR': 'Attention, Mercurial supprime de façon agressive et nécessite un prune du repository', 'de_DE': 'Achtung! Mercurial macht aggressive Garbage Collection und muss daher deinen Baum reduzieren', 'ru_RU': 'Внимание! Mercurial использует агрессивный сборщик мусора и обрезает ваше дерево', @@ -87,6 +92,7 @@ exports.strings = { 'es_AR': 'La opción -A no es necesaria para esta aplicación, simplemente hacé commit', 'es_ES': 'La opción -A no se necesita para este aplicación, sólo hace un commit!', 'pt_BR': 'A opção -A não é necessária para este aplicativo, simplesmente faça commit', + 'gl' : 'A opción -A non se necesita para este aplicativo, ¡fai só un commit!', 'de_DE': 'Die Option -A wird in dieser Anwendung nicht benötigt, committe einfach!', 'fr_FR': 'L\'option -A n\'est pas nécessaire pour cette application, simplement commiter', 'ru_RU': 'Опция -A не требуется для этого приложения, просто сделайте коммит.', @@ -102,6 +108,7 @@ exports.strings = { 'es_AR': 'No hay un comando status para esta aplicación, dado que no hay archivos que indexar. Probá hg summary, en cambio', 'es_ES': 'No hay un comando status para esta aplicación, porque que no hay archivos que indexar. Prueba el comando hg summary, en cambio', 'pt_BR': 'Não existe um comando status para este aplicativo, já que não há staging de arquivos. Tente hg summary', + 'gl' : 'Non hai un comando status para esta aplicación, xa que non hai ficheiros que indexar. Proba hg summary', 'fr_FR': 'Il n\'y a pas de commande status pour cette application, car il n\'y a pas de fichier stagé. Essayez hg summary à la place.', 'de_DE': 'Es gibt keinen Befehl status in dieser Anwendung, da es kein Staging von Dateien gibt. Probier stattdessen hg summary', 'ru_RU': 'Команда status не поддерживается в этом приложении, так как здесь нет файлов. Попробуйте выполнить hg summary', @@ -117,6 +124,7 @@ exports.strings = { 'es_AR': '¡Necesito la opción {opcion} para ese comando!', 'es_ES': '¡Necesito la opción {opcion} para ese comando!', 'pt_BR': 'Eu preciso da opção {option} para esse comando!', + 'gl' : 'Preciso da opción {option} para ese comando!', 'fr_FR': 'J\'ai besoin de l\'option {option} pour cette commande', 'de_DE': 'Ich benötige die Option {option} für diesen Befehl!', 'ru_RU': 'Для этой команды требуется опция {option}', @@ -132,6 +140,7 @@ exports.strings = { 'es_AR': 'hg log sin el parámetro -f no está soportado, usá -f', 'es_ES': 'Actualmente hg log sin -f no es compatible con esta aplicación. Usa -f.', 'pt_BR': 'hg log sem -f atualmente não é suportado, use -f', + 'gl' : 'hg log sen -f actulamente non é soportado, usa -f', 'fr_FR': 'hg log sans -f n\'est pas supporté', 'de_DE': 'hg log ohne -f wird aktuell nicht unterstützt, benutze bitte -f', 'ru_RU': 'hg log без опции -f в настоящий момент не поддерживается, используйте -f', @@ -148,6 +157,7 @@ exports.strings = { 'es_AR': '¡Detached HEAD!', 'es_ES': '¡HEAD separado! (Detached HEAD).', 'pt_BR': 'Detached HEAD!', + 'gl' : '¡Detached HEAD!', 'fr_FR': 'head détaché !', 'ru_RU': 'Отделенный HEAD', 'uk': 'Відокремлений HEAD', @@ -163,6 +173,7 @@ exports.strings = { 'es_AR': 'En la rama {branch}', 'es_ES': 'En la rama {branch}', 'pt_BR': 'No ramo {branch}', + 'gl' : 'Non na rama {branch}', 'fr_FR': 'Sur la branche {branch}', 'ru_RU': 'В ветке {branch}', 'uk': 'В гілці {branch}', @@ -178,6 +189,7 @@ exports.strings = { 'es_AR': '¡Listo para commitear! (como siempre en esta demo ;-) )', 'es_ES': '¡Listo para hacer un commit (como siempre en esta demo)!', 'pt_BR': 'Pronto para commitar! (como sempre neste demo ;-) )', + 'gl' : '¡Praparado para facer un commit (como sempre nesta demo ;-) )!', 'fr_FR': 'Prêt à commit ! (comme toujours dans cette démo)', 'ru_RU': 'Готово к коммиту! (как и всегда в этом демо)', 'uk': 'Готово до коміту! (як завжди в цьому демо)', @@ -194,6 +206,7 @@ exports.strings = { 'es_AR': 'Otro commit más, y van...', 'es_ES': 'Hagamos un commit. Atlanta, Georgia! Escucha WHATUPRG también.', 'pt_BR': 'Commitando.. Vai Timão!', + 'gl' : 'Mesturando.. ¡Alá imos!', 'fr_FR': 'Commit rapide. NoMaN Sux!', 'ru_RU': 'Быстрый коммит. А надо!', 'uk': 'Швидкий коміт. Динамо!', @@ -207,6 +220,7 @@ exports.strings = { 'es_AR': 'Estás en la versión más reciente', 'es_ES': 'Ya actualizado con la versión más reciente.', 'pt_BR': 'Já estamos na versão mais recente!', + 'gl' : 'Xa estamos actualizados ca versión máis recente', 'zh_TW': '已經是最新的了', 'zh_CN': '已经是最新的了', 'ru_RU': 'Уже обновлено!', @@ -222,6 +236,7 @@ exports.strings = { 'es_AR': 'Tu rama origin está desincronizada con la rama remota, por lo que no se puede hacer el fetch', 'es_ES': 'Tu rama origin no está sicronizada con la rama remota, así que un fetch no se puede realizar.', 'pt_BR': 'O fetch não pode ser realizado pois o ramo de origem está fora de sincronia com o ramo remoto', + 'gl' : 'O fetch non pode ser realizado xa que a rama de orixe non está sincronizada ca rama remota', 'fr_FR': 'Votre branche origin n\'est plus synchronisée avec la branche distante et fetch ne peut pas être appliqué. Essayez avec l\'option --force', 'ru_RU': 'Ваша origin ветка не синхронизирована с удаленной веткой, невозможно выполнить fetch', 'uk': 'Твоя гілка origin не синхронізована з віддаленою гілкою, неможливо виконати fetch', @@ -234,8 +249,9 @@ exports.strings = { 'zh_TW': '遠端倉庫與你的本地倉庫產生了分歧,故此上傳操作無法通過簡單地快進實現(因此你的 push 被拒絕了)。請 pull 下來遠端裡最新的更改,與本地合併之後再試一次。你可以通過 git pull 或 git pull --rebase 實現。', 'de_DE': 'Das entfernte Repository weicht von deinem lokalen Repository ab, daher können deine Änderungen nicht mit einem einfachen fast forward hochgeladen werden (und daher ist dein push abgelehnt worden). Bitte pull erst die neuen Änderungen in das lokale Repository, integriere sie in den Branch und versuch es nochmal. Das kannst du mit git pull oder git pull --rebase machen', 'es_AR': 'El repositorio remoto divergió de tu repositorio local, por lo que subir tus cambios no es un simple fast forward (y por eso se rechazó tu push). Por favor, hacé pull de los nuevos cambios en el repositorio remoto, incorporalos a esta rama y probá de nuevo. Podés hacerlo con git pull o git pull --rebase', - 'es_ES': 'El depósito remoto se ha desviado del depósito local. Subir cambios no es un avance rápido sencillo (por eso fue rechazado tu push). Por favor haz pull para descaragar los cambios en el depósito remoto para que los incorpores en la rama actual. Los cambios se pueden hacer pull con el comando "git pull" o "git pull--rebase"', + 'es_ES': 'El depósito remoto se ha desviado del depósito local. Subir cambios no es un avance rápido sencillo (por eso fue rechazado tu push). Por favor haz pull para descaragar los cambios en el depósito remoto para que los incorpores en la rama actual. Los cambios se pueden hacer pull con el comando "git pull" o "git pull --rebase"', 'pt_BR': 'O repositório remoto divergiu do repositório local, então enviar suas mudanças não é um simples fast forward (e por isso seu push foi rejeitado). Por favor, faça pull das novas mudanças do repositório remoto, incorpore-os a este ramo, e tente novamente. Você pode fazê-lo com git pull ou git pull --rebase', + 'gl' : 'O repositorio remoto diverxe do teu repositorio local. Subir os cambios non é un fast-forward (avance rápido) e por iso foi rechazado o teu push. Por favor, fai un pull dos novos cambios do repositorio remoto e inclúeos na túa rama actual. Os cambios pódense facer co comando "git pull" ou "git pull --rebase"', 'fr_FR': 'Le dépôt distant a divergé de votre référentiel local, donc l\'envoi de vos modifications n\'est pas en simple avance rapide (et donc votre envoi a été rejeté). Veuillez récupérer les nouveaux changements depuis le dépôt distant, les intégrer dans cette branche, et essayez à nouveau. Vous pouvez le faire avec git pull ou git pull --rebase', 'ru_RU': 'Удаленный репозиторий разошелся с вашим локальным репозиторием, поэтому выгрузка ваших изменений не может быть в режиме fast forward (и следовательно ваш push будет отклонён). Пожалуйста, удалите изменения в удаленном репозитории которые, объедините их в эту ветку и попробуйте еще раз. Вы можете сделать это с помощью git pull или git pull --rebase', 'uk': 'Віддалений репозиторій розбігся з твоїм локальним репозиторієм, тому відвантаження твоїх змін не є простим fast forward (і тому твій push був відхилений). Будь-ласка, витягни зміни з віддаленого репозиторію, включи їх в цю гілку, й спробуй ще. Ти можеш зробити це за допомогою git pull чи git pull --rebase', @@ -250,6 +266,7 @@ exports.strings = { 'es_AR': 'No podés ejecutar ese comando en una rama remota', 'es_ES': 'No puedes ejecutar ese comando en una rama remota', 'pt_BR': 'Você não pode executar esse comando em um ramo remoto', + 'gl' : 'Non podes executar ese comando nunha rama remota', 'fr_FR': 'Vous ne pouvez exécuter cette commande sur une branche distante', 'ru_RU': 'Вы не можете выполнить эту команду на удаленной ветке', 'uk': 'Ти не можеш виконати цю команду на віддаленій гілці', @@ -264,6 +281,7 @@ exports.strings = { 'es_AR': 'Necesitás un origen para ese comando', 'es_ES': 'Se requiere un origen para ese comando.', 'pt_BR': 'É necessário informar uma origem para esse comando', + 'gl' : 'É necesario informar unha orixe para ese comando', 'fr_FR': 'Une origine est requise pour cette commande', 'ru_RU': 'Origin требуется для этой команды', 'uk': 'Для цієї команди потрібний origin', @@ -278,6 +296,7 @@ exports.strings = { 'es_AR': '¡Ya existe el origen! No podés crear uno nuevo', 'es_ES': '¡Ya existe un origen! No puedes crearlo de nuevo.', 'pt_BR': 'A origem já existe! Você não pode criar uma nova', + 'gl' : 'A orixe xa existe! Non podes crear unha nova', 'fr_FR': 'Une origine existe déjà ! Vous ne pouvez pas en créer une nouvelle', 'ru_RU': 'Origin уже существует! Невозможно создать еще один', 'uk': 'Origin вже існує! Неможливо створити ще один', @@ -294,6 +313,7 @@ exports.strings = { 'es_AR': 'No podés borrar la rama master, la rama en la que estás, o cosas que no son ramas', 'es_ES': 'No puedes eliminar la rama master, la rama en que estás, o cosas que no son ramas.', 'pt_BR': 'Você não pode apagar o ramo master, nem o ramo em que você está, nem coisas que não sejam ramos', + 'gl' : 'Non podes borrala rama master, nin a rama na que ti estás, nin cousas que non sexan ramas', 'fr_FR': 'Vous ne pouvez supprimer la branche master, la branche sur laquelle vous êtes, ou ce qui n\'est pas une branche', 'ru_RU' : 'Невозможно удалить ветку master, ветку на которой вы сейчас и то что не является веткой', 'uk': 'Неможливо видалити гілку master, гілку на якій ти зараз знаходишся чи штуки які не є гілкою', @@ -309,6 +329,7 @@ exports.strings = { 'es_AR': 'Mergear {target} a {current}', 'es_ES': 'Incorporar {target} en {current}', 'pt_BR': 'Merge de {target} em {current}', + 'gl' : 'Merge de {target} en {current}', 'fr_FR': 'Merge de {target} dans {current}', 'ru_RU': 'Слияние {target} в {current}', 'uk': 'Злиття {target} в {current}', @@ -324,6 +345,7 @@ exports.strings = { 'es_AR': '¡No hay commits para rebasear! Son todos commits de merge o cambios ya aplicados', 'es_ES': '¡No hay commits para hacer rebase! Todo es un merge commit o cambios ya hecho.', 'pt_BR': 'Não há commits para o rebase! São todos commits de merge ou mudanças já aplicadas', + 'gl' : '¡Non hai commits para o rebase! Son todos commits de merge ou cambios xa aplicados', 'fr_FR': 'Aucun commit à rebaser ! C\'est soit un commit de merge, soit des modifications déjà appliquées', 'ru_RU': 'Нет коммитов для rebase! Все в коммите слияния или изменения уже применены', 'uk': 'Нема комітів для rebase! Все в коміті злиття (merge commit) чи зміни вже застосовані', @@ -339,6 +361,7 @@ exports.strings = { 'es_AR': 'Nada para hacer...', 'es_ES': 'Nada para hacer...', 'pt_BR': 'Nada a ser feito...', + 'gl' : 'Nada para facer...', 'fr_FR': 'Rien à effectuer…', 'ru_RU': 'Нечего выполнять...', 'uk': 'Нічого виконувати...', @@ -354,6 +377,7 @@ exports.strings = { 'es_AR': 'Fast forwardeando...', 'es_ES': 'Avanzando rápidamente...', 'pt_BR': 'Fast forward...', + 'gl' : 'Fast forward...', 'fr_FR': 'En avance rapide…', 'ru_RU': 'Выполняю Fast forward...', 'uk': 'Виконую Fast forward', @@ -369,6 +393,7 @@ exports.strings = { 'es_AR': 'Rama actualmente actualizada', 'es_ES': 'La rama ya se ha actualizado.', 'pt_BR': 'Ramo já atualizado', + 'gl' : 'Rama xa actualizada', 'fr_FR': 'Branche déjà à jour', 'ru_RU': 'Ветка уже обновлена', 'uk': 'Гілку вже оновлено', @@ -384,6 +409,7 @@ exports.strings = { 'es_AR': 'La referencia {ref} no existe o es desconocida', 'es_ES': 'La referencia {ref} no existe o es desconocida', 'pt_BR': 'A referência {ref} não existe ou é desconhecida', + 'gl' : 'A referencia {ref} non existe ou é descoñecida', 'fr_FR': 'La référence {ref} n\'existe pas ou est inconnue', 'ru_RU': 'Ссылка {ref} не существует или неизвестна', 'uk': 'Посилання {ref} не існує чи невідоме', @@ -399,6 +425,7 @@ exports.strings = { 'es_AR': 'El commit {commit} no tiene un {match}', 'es_ES': 'El commit {commit} no tiene un {match}', 'pt_BR': 'O commit {commit} não tem um {match}', + 'gl' : 'O commit {commit} non ten un {match}', 'fr_FR': 'Le commit {commit} n\'a pas de correspondance {match}', 'ru_RU': 'Коммит {commit} не содержит {match}', 'uk': 'Коміт {commit} не містить {match}', @@ -414,6 +441,7 @@ exports.strings = { 'es_AR': '¡Cuidado! Modo de detached HEAD', 'es_ES': '¡Cuidado! Modo de HEAD separado (detached HEAD)', 'pt_BR': 'Cuidado! Modo Detached HEAD', + 'gl' : '¡Coidado! Modo Detached HEAD', 'fr_FR': 'Attention ! HEAD est détaché', 'ru_RU': 'Внимание! Репозиторий в состоянии detached HEAD, то есть не находится ни на какой ветке!', 'uk': 'Увага! Репозиторій в стані detached HEAD, тобто не знаходиться в жодній гілці!', @@ -429,6 +457,7 @@ exports.strings = { 'es_AR': 'No es necesario hacer add a los archivos en esta demo', 'es_ES': 'No es necesario agregar los archivos en esta demo', 'pt_BR': 'Não é necessário adicionar arquivos neste demo', + 'gl' : 'Non é necesario incluír arquivos nesta demo', 'fr_FR': 'Aucun besoin d\'ajouter des fichiers dans cette démo', 'ru_RU': 'Это демо не оперирует файлами', 'uk': 'Не потрібно додавати файли для цього демо', @@ -444,6 +473,7 @@ exports.strings = { 'es_ES': 'Las opciones que especificaste son incompatibles o incorrectas.', 'es_AR': 'No es necesario hacer add a los archivos en esta demo', 'pt_BR': 'As opções que você especificou são incompatíveis ou incorretas', + 'gl' : 'As opcións que especificaches son incompatibles ou incorrectas', 'fr_FR': 'Les options que vous avez spécifiées sont incompatibles ou incorrectes', 'ru_RU': 'Неправильные опции', 'uk': 'Опції, які ти ввів, або некорректні або не підтримуються', @@ -459,6 +489,7 @@ exports.strings = { 'es_AR': 'El commit {commit} ya existe en tus cambios, ¡abortando!', 'es_ES': 'El commit {commit} ya existe en tus cambios, ¡abortando!', 'pt_BR': 'O commit {commit} já existe nas suas mudanças, abortando!', + 'gl' : 'O commit {commit} xa existe nos seus cambios, ¡abortando!', 'fr_FR': 'Le commit {commit} existe déjà dans votre ensemble de modifications, opération avortée !', 'ru_RU': 'Коммит {commit} существует, отменяю!', 'uk': 'Коміт {commit} вже існує в твоєму change set, відміна!', @@ -474,6 +505,7 @@ exports.strings = { 'es_AR': 'No podés hacer reset en el modo detached. Usá checkout si querés moverte', 'es_ES': 'No puedes hacer reset en el modo separado. Usa checkout si quieres moverte.', 'pt_BR': 'Não se pode fazer reset no modo detached. Use checkout se quiser se mover', + 'gl' : 'Non se pode facer reset no modo detached. Use checkout se te queres mover', 'fr_FR': 'On ne peut pas effectuer un reset quand HEAD est détaché. Utilisez checkout pour déplacer', 'ru_RU': 'Это невозможно в режиме detached HEAD! Используйте checkout!', 'uk': 'Неможливо зробити reset в стані detached head! Використовуй checkout якщо хочеш змінити розташування', @@ -492,6 +524,7 @@ exports.strings = { 'es_ES': 'El comportamiento default para reajustes es --hard, pero siéntete libre de omitir esa ' + 'opción si te cansas de escribirla en nuestras lecciones. Recuerda quepor defecto el comportamiento en GitHub es --mixed.', 'pt_BR': 'O comportamento padrão é um reset --hard, fique livre para omitir essa opção!', + 'gl' : 'O comportamente por defecto é un reset --hard, Lembra que por defecto en GitHub é --mixed.', 'fr_FR': 'Le comportement par défaut est un --hard reset, soyez libre d\'omettre cette option !', 'ru_RU': 'По умолчанию будет выполнен --hard reset, эту опцию можно опускать!', 'uk': 'На LearnGitBranching reset по замовчуванню використовує --hard, тому цю опцію ' + @@ -510,6 +543,7 @@ exports.strings = { 'es_AR': 'No existe el concepto de agregar/indexar cambios, así que esa opción o comando es inválido', 'es_ES': 'No existe el concepto de agregar/indexar cambios, así que esa opción o comando es inválido.', 'pt_BR': 'Não existe o conceito de adicionar/indexar mudanças, de forma que essa opção ou comando é inválida', + 'gl' : 'Non existe o concepto de agregar/indexar cambios, así que esa opción ou comando é inválido.', 'fr_FR': 'Il n\'y a pas le concept d\'ajouter / mettre en staging, donc cette option ou commande est invalide', 'ru_RU': 'Это демо не работает с файлами, так что git add не нужен!', 'uk': 'В цьому демо немає можливості додати файл до робочої копії чи до стейджингу, тому ця опція чи команда некоректна чи не підтримується', @@ -525,6 +559,7 @@ exports.strings = { 'es_AR': 'Revirtiendo {oldCommit}: {oldMsg}', 'es_ES': 'Volviendo a {oldCommit}: {oldMsg}', 'pt_BR': 'Revertendo {oldCommit}: {oldMsg}', + 'gl' : 'Revertindo {oldCommit}: {oldMsg}', 'fr_FR': 'Revert {oldCommit}: {oldMsg}', 'ru_RU': 'Откатываю {oldCommit}: {oldMsg}', 'uk': 'Повертаю {oldCommit}: {oldMsg}', @@ -540,6 +575,7 @@ exports.strings = { 'es_AR': 'Espero como máximo {upper} parámetros para {what}', 'es_ES': 'Espero al máximo {upper} parámetros para {what}.', 'pt_BR': 'Espero no máximo {upper} parâmetros para {what}', + 'gl' : 'Espero ó máximo {upper} parámetros para {what}', 'fr_FR': 'J\'attends au plus {upper} argument(s) pour {what}', 'ru_RU': 'Ожидается максимум {upper} аргумент(ов) для {what}', 'uk': 'Я очікую максимум {upper} аргумент(ів) для {what}', @@ -555,6 +591,7 @@ exports.strings = { 'es_AR': 'Espero al menos {lower} parámetros para {what}', 'es_ES': 'Espero al menos {lower} parámetros para {what}.', 'pt_BR': 'Espero pelo menos {lower} parâmetros para {what}', + 'gl' : 'Agardo polo menos {lower} parámetros para {what}', 'fr_FR': 'J\'attends au moins {upper} argument(s) pour {what}', 'ru_RU': 'Ожидается как минимум {lower} аргументов для {what}', 'uk': 'Я очікую як мінімум {lower} аргумент(ів) для {what}', @@ -570,6 +607,7 @@ exports.strings = { 'es_AR': 'Ese comando no acepta parámetros comunes', 'es_ES': 'Ese comando no acepta parámetros generales.', 'pt_BR': 'Este comando não aceita parâmetros gerais', + 'gl' : 'Este comando non acepta parámetros xeráis', 'fr_FR': 'Cette commande n\'accepte aucun argument général', 'ru_RU': 'Это команда без аргументов', 'uk': 'Ця команда не приймає загальних аргументів', @@ -585,6 +623,7 @@ exports.strings = { 'es_AR': 'Copiá el código de acá abajo', 'es_ES': 'Copia el código que sigue.', 'pt_BR': 'Copie o código abaixo', + 'gl' : 'Copie o código abaixo', 'fr_FR': 'Copiez la chaîne d\'arbre ci-dessous', 'ru_RU': 'Скопируй текст ниже', 'uk': 'Скопіюй рядок дерева нижче', @@ -601,6 +640,7 @@ exports.strings = { 'es_AR': 'Aprendé a Branchear en Git', 'es_ES': 'Aprende Git Branching', 'pt_BR': 'Learn Git Branching', + 'gl' : 'Aprende Git Branching', 'fr_FR': 'Apprenez Git Branching', 'ru_RU': 'Изучаем ветвление в git', 'uk': 'Learn Git Branching', @@ -616,6 +656,7 @@ exports.strings = { 'es_AR': 'Seleccioná un nivel', 'es_ES': 'Selecciona un nivel', 'pt_BR': 'Selecione um nível', + 'gl' : 'Selecciona un nivel', 'fr_FR': 'Choisissez un niveau', 'ru_RU': 'Выбери уровень', 'uk': 'Обери рівень', @@ -629,6 +670,7 @@ exports.strings = { 'zh_CN': '主要', 'zh_TW': '主要', 'es_ES': 'Principal', + 'gl' : 'Principal', 'ru_RU': 'Основы', 'uk' : 'Основи', 'ko': '메인' @@ -641,6 +683,7 @@ exports.strings = { 'zh_CN': '远程', 'zh_TW': '遠端', 'es_ES': 'Remota', + 'gl' : 'Remota', 'ru_RU': 'Удаленные репозитории', 'uk' : 'Віддалені репозиторії', 'ko' : '원격' @@ -655,6 +698,7 @@ exports.strings = { 'es_AR': 'Perdón, necesitamos mantener los nombres de los branches cortos para visualizarlos. El nombre de tu rama se truncó a 9 caracteres, resultando en "{branch}"', 'es_ES': 'Perdón, necesitamos mantener los nombres de los branches cortos para visualizarlos. El nombre de tu rama se truncó a 9 caracteres, resultando en "{branch}"', 'pt_BR': 'Desculpe, precisamos manter os nomes dos ramos curtos para visualizá-los. O nome do seu ramo foi truncado para 9 caracteres, resultando em "{branch}"', + 'gl' : 'Desculpe, precisamos manter os nomes das ramas curtas para poder velas. O nome da súa rama foi truncada a 9 letras, resultado en "{branch}"', 'fr_FR': 'Désolé, nous devons garder les noms de branches courts pour la visualisation. Votre nom de branche a été tronqué à 9 caractères, devenant "{branch}"', 'ru_RU': 'Для наглядности нам нужно сохранять имена веток короткими. Твоё название сокращено до 9 символов и теперь это "{branch}"', 'uk': 'Вибач, нам потрібно щоб ім’я гілок було як можна коротше для наглядності. Твоє ім’я гілки було скорочене до 9 літер й тепер це "{branch}"', @@ -670,6 +714,7 @@ exports.strings = { 'es_AR': 'El nombre "{branch}" no está permitido para los branches', 'es_ES': 'El nombre "{branch}" es prohibido para nombrar una rama.', 'pt_BR': 'Um ramo não pode ser chamado de "{branch}"!', + 'gl' : 'Unha rama non pode ser chamada "{branch}', 'fr_FR': 'Ce nom de branche "{branch}" n\'est pas autorisé', 'ru_RU': 'Название для ветки "{branch}" недопустимо!', 'uk': 'Назва гілки "{branch}" є недопустимою', @@ -684,6 +729,7 @@ exports.strings = { 'es_AR': 'El nombre "{tag}" no está permitido para los tags', 'es_ES': 'El nombre "{tag}" es prohibido para nombrar un tag.', 'pt_BR': 'Uma tag não pode ser chamada de "{tag}"!', + 'gl' : 'Unha etiqueta non pode ser chamada "{tag}"', 'de_DE': 'Der Tag-Name "{tag}" ist nicht erlaubt!', 'fr_FR': 'Le nom de tag "{tag}" n\'est pas autorisé', 'ru_RU': 'Название для тега "{tag}" недопустимо!', @@ -700,6 +746,7 @@ exports.strings = { 'es_AR': 'La opción {option} no está soportada', 'es_ES': 'La opción {option} no compatible con esta demo.', 'pt_BR': 'A opção {option} não é suportada', + 'gl' : 'A opción {option} non está soportada', 'fr_FR': 'L\'option "{option}" n\'est pas supportée', 'ru_RU': 'Опция "{option}" недопустима!', 'uk': 'Опція "{option}" не підтримується!', @@ -714,7 +761,8 @@ exports.strings = { 'zh_TW': 'git <指令> [<參數>]', 'es_AR': 'git []', 'es_ES': 'git []', - 'pt_BR': 'git ]', + 'pt_BR': 'git []', + 'gl' : 'git []', 'fr_FR': 'git []', 'ru_RU': 'git <команда> [<аргументы>]', 'uk': 'git <команда> [<аргументи>]', @@ -730,6 +778,7 @@ exports.strings = { 'es_AR': 'Comandos soportados:', 'es_ES': 'Comandos compatibles:', 'pt_BR': 'Comandos suportados:', + 'gl' : 'Comandos soportados:', 'fr_FR': 'Commandes supportées', 'ru_RU': 'Поддерживаемые команды', 'uk': 'Допустимі команди', @@ -745,6 +794,7 @@ exports.strings = { 'es_AR': 'Uso:', 'es_ES': 'Uso:', 'pt_BR': 'Uso:', + 'gl' : 'Uso:', 'fr_FR': 'Utilisation :', 'ru_RU': 'Использование:', 'uk': 'Використання:', @@ -760,6 +810,7 @@ exports.strings = { 'es_AR': 'Git Versión PCOTTLE.1.0', 'es_ES': 'Git Versión PCOTTLE.1.0', 'pt_BR': 'Git versão PCOTTLE.1.0', + 'gl' : 'Git versión PCOTTLE.1.0', 'fr_FR': 'Git version PCOTTLE.1.0', 'ru_RU': 'Версия git PCOTTLE.1.0', 'uk': 'Версія git PCOTTLE.1.0', @@ -774,6 +825,7 @@ exports.strings = { 'es_AR': 'Invirtiendo el árbol...', 'es_ES': 'Invirtiendo el árbol...', 'pt_BR': 'Invertendo a árvore...', + 'gl' : 'Invirtindo a árbore...', 'fr_FR': 'Inversion de l\'arbre...', 'ru_RU': 'Переворачиваю дерево...', 'uk': 'Перевертаю дерево...', @@ -789,6 +841,7 @@ exports.strings = { 'es_AR': 'Refrezcando el árbol...', 'es_ES': 'Actualizando el árbol...', 'pt_BR': 'Atualizando a árvore...', + 'gl' : 'Actualizando a árbore...', 'fr_FR': 'Actualisation de l\'arbre…', 'ru_RU': 'Обновляю дерево...', 'uk': 'Оновлюю дерево...', @@ -804,6 +857,7 @@ exports.strings = { 'es_AR': 'Localización actualizada a {locale}', 'es_ES': 'Idioma puesto a {locale}', 'pt_BR': 'Língua trocada para {locale}', + 'gl' : 'Cambiado o idioma a {locale}', 'fr_FR': 'Langue changée à {locale}', 'ru_RU': 'Локаль теперь равна {locale}', 'uk': 'Локаль тепер дорівнює {locale}', @@ -819,6 +873,7 @@ exports.strings = { 'es_AR': 'Localización vuelta al default, que es {locale}', 'es_ES': 'Idioma reajustado a su valor por defecto ({locale})', 'pt_BR': 'Língua retornada para a padrão, que é {locale}', + 'gl' : 'Lingua reaxustada ó seu valor por defecto {locale}', 'fr_FR': 'Langue remise par défaut, qui est {locale}', 'ru_RU': 'Локаль сброшена. Теперь она равна {locale}', 'uk': 'Локаль скинута. Тепер вона дорівнює {locale}', @@ -834,6 +889,7 @@ exports.strings = { 'es_AR': 'Usá alguno de estos comandos para tener más información:', 'es_ES': 'Por favor usa uno de los siguientes comandos para más información:', 'pt_BR': 'Use algum destes comandos para ter mais informações:', + 'gl' : 'Usa algún destes comandos para ter máis información:', 'fr_FR': 'Merci d\'utiliser une des commandes suivantes pour obtenir plus d\'informations', 'ru_RU': 'Для получения большей информации используй следующие команды:', 'uk': 'Щоб отримати більше інформації використовуй наступні команди:', @@ -849,6 +905,7 @@ exports.strings = { 'es_AR': 'Esta es una lista de los comandos disponibles:', 'es_ES': 'Esta es una lista de todos los comandos disponibles:', 'pt_BR': 'Esta é uma lista dos comandos disponíveis:', + 'gl' : 'Esta é unha lista dos comando dispoñibles:', 'fr_FR': 'Ci-dessous est la liste de toutes les commandes disponibles :', 'ru_RU': 'Вот все поддерживаемуе команды:', 'uk': 'Ось список всіх можливих команд:', @@ -864,6 +921,7 @@ exports.strings = { 'es_AR': 'Directorio cambiado a "/los/directorios/no/importan/en/esta/demo"', 'es_ES': 'Directorio cambiado a "/los/directorios/no/importan/en/esta/demo"', 'pt_BR': 'Diretório mudado para "/diretorios/nao/importam/neste/demo"', + 'gl' : 'Directorio cambiado a "/os/directorios/non/importan/nesta/demo"', 'fr_FR': 'Répertoire changé à "/directories/dont/matter/in/this/demo" (les répertoires ne servent à rien dans cette démo)', 'ru_RU': 'Директория изменена на "/директории/не/важны/в/этом/демо"', 'uk': 'Директорія змінена на "/директорії/не/мають/значення/в/цьому/демо"', @@ -879,6 +937,7 @@ exports.strings = { 'es_AR': 'NoTePreocupesPorLosArchivosEnEstaDemo.txt', 'es_ES': 'NoTePreocupesPorLosArchivosEnEstaDemo.txt', 'pt_BR': 'NaoSePreocupeComNomesDeArquivoNesteDemo.txt', + 'gl' : 'NonTePreocupesPolosCambiosNestaDemo.txt', 'fr_FR': 'DontWorryAboutFilesInThisDemo.txt (ne vous préoccupez pas des noms de fichier dans cette démo)', 'ru_RU': 'НеНадоЗаботитьсяОФайлахВЭтомДемо.txt', 'uk': 'ЗабийНаФайлиВЦьомуДемо.txt', @@ -893,6 +952,7 @@ exports.strings = { 'es_AR': 'LGB no puede recibir comandos en dispositivos móviles. Visitanos desde una desktop, ¡lo vale! :D', 'es_ES': 'LGB no puede recibir comandos en dispositivos móviles. Visítanos en una computadora de escritorio, ¡lo vale! :D', 'pt_BR': 'Provavelmente você não vai conseguir digitar comandos no celular, neste caso tente acessar de um computador', + 'gl' : 'LGB non pode recibir os comandos nos dispositivos móbiles. Visítanos dende un ordenador de escritorio, ¡paga a pena! :D', 'fr_FR': 'Impossible de faire apparaître le clavier sur mobile / tablette :( Essayez de passer sur un ordinateur de bureau :D', 'ru_RU': 'Мобильные не поддерживаются, зайди с компьютера!', 'uk': 'LGB не підтримує ввід тексту з мобільного, зайди з компьютера! Це цього варте!', @@ -908,6 +968,7 @@ exports.strings = { 'es_AR': '¡Compartí este árbol con amigos! Pueden cargarlo con "import tree"', 'es_ES': '¡Comparte este árbol con amigos! Pueden cargarlo con "import tree"', 'pt_BR': 'Compartilhe esta árvore com seus amigos! Eles podem carregá-la com "import tree"', + 'gl' : '¡Comparte esta árbore cos teus amigos! Eles poden cargalo con "import tree"', 'fr_FR': 'Partagez cet arbre avec vos amis ! Ils peuvent le charger avec "import tree"', 'ru_RU': 'Поделись деревом с друзьями! Они могут загрузить его при помощи "import tree"', 'uk': 'Поділись цим деревом з друзями! Вони зможуть його завантажити за допомогою "import tree"', @@ -923,6 +984,7 @@ exports.strings = { 'es_AR': '¡Pegá un blob JSON abajo!', 'es_ES': '¡Pega un blob JSON abajo!', 'pt_BR': 'Cole o JSON abaixo!', + 'gl' : 'Pega un JSON abaixo!', 'fr_FR': 'Collez un blob JSON ci-dessous !', 'ru_RU': 'Вставь JSON ниже!', 'uk': 'Встав JSON нижче!', @@ -938,6 +1000,7 @@ exports.strings = { 'es_AR': 'El mapa resuelto fue eliminado, estás arrancando desde un estado limpio', 'es_ES': 'El mapa resuelto fue eliminado, estás empezando de un estado limpio.', 'pt_BR': 'Mapa de resolvidos descartado, você está começando com ficha limpa!', + 'gl' : 'O mapa resolto foi eliminado, estás arrancando dende un estado limpo.', 'fr_FR': 'La carte des niveaux résolus a été effacée, vous repartez de zéro !', 'ru_RU': 'Всё сброшено! Можно начать с чистого листа!', 'uk': 'Все скинуте! Можна починати з чистого аркушу!', @@ -953,6 +1016,7 @@ exports.strings = { 'es_AR': '¡No estás en un nivel! Estás en el sandbox, comenzá un nivel usando "levels"', 'es_ES': '¡No estás en un nivel! Estás en el sandbox, comienza un nivel con "levels"', 'pt_BR': 'Você não está em um nível! Você está no sandbox, comece um nível com "levels"', + 'gl' : '¡Non estás en ningún nivel! Estás nunha caixa de arena, comeza un nivel usando "levels"', 'fr_FR': 'Vous n\'êtes pas dans un niveau ! Vous êtes dans le mode bac à sable, commencez un niveau avec "levels"', 'ru_RU': 'Ты не проходишь уровень! Ты в песочнице! Чтобы начать уровень, используй команду "levels"!', 'uk': 'Ти не в рівні! Ти в пісочниці! Почни рівень з "levels"', @@ -968,6 +1032,7 @@ exports.strings = { 'es_AR': 'No se encontró ningún nivel {id}. Abriendo la vista de selección de niveles...', 'es_ES': 'No se encontró ningún nivel {id}. Abriendo la vista de selección de niveles...', 'pt_BR': 'O nível "{id}" não existe! Abrindo uma caixa de seleção de nível', + 'gl' : 'O nivel "{id}" non existe! Abrindo unha caixa de seleción de nivel', 'fr_FR': 'Le niveau dont l\'identifiant est {id} n\'a pas été trouvé ! Ouverture de la vue de sélection des niveaux', 'ru_RU': 'Уровень с id "{id}" не найден! Открываю выбор уровней', 'uk': 'Рівень з id "{id}" не знайдений! Відкриваю вибір рівней', @@ -983,6 +1048,7 @@ exports.strings = { 'es_AR': 'No hay comandos que deshacer', 'es_ES': 'No hay comandos que deshacer', 'pt_BR': 'Você já desfez tudo!', + 'gl' : 'Nonn hai comandos que desfacer', 'fr_FR': 'La pile d\'annulation est vide !', 'ru_RU': 'Некуда откатывать!', 'uk': 'Нема куди відкатуватися', @@ -998,6 +1064,7 @@ exports.strings = { 'es_AR': 'Ya resolviste este nivel, probá otros usando "levels" o volvé al sandbox usando "sandbox"', 'es_ES': 'Ya resolviste este nivel, prueba otros usando "levels" o vuelve al sandbox usando "sandbox"', 'pt_BR': 'Você já resolveu este nível, tente outros com "levels" ou volte ao sandbox com "sandbox"', + 'gl' : 'Xa resolviches este nivel, proba outros usando "levels" ou volve á caixa de area con "sandbox"', 'fr_FR': 'Vous avez déjà résolu ce niveau, essayez d\'autres niveaux avec "levels" ou revenez au bac à sable avec "sandbox"', 'ru_RU': 'Ты уже прошел этот уровень, попробуй пройти другие при помощи команды "levels" или иди в песочницу "sandbox"', 'uk': 'Ти вже пройшов цей рівень, спробуй інші рівні з "levels" чи повернись в пісочницю з "sandbox"', @@ -1011,6 +1078,7 @@ exports.strings = { 'zh_CN': '恭喜过关!!', 'zh_TW': '恭喜,本關解決了!!', 'es_ES': '¡Resuelto!\n:D', + 'gl' : '¡Resolto!', 'ru_RU': 'Решено!!\n:D', 'uk' : 'Вирішено!!\n:D', 'ko' : '해결 완료!!\n:D' @@ -1025,6 +1093,7 @@ exports.strings = { 'es_AR': '¡Ese comando de git está deshabilitado para este nivel!', 'es_ES': '¡Ese comando de git está deshabilitado para este nivel!', 'pt_BR': 'Achou que seria fácil assim? Desabilitamos esse comando durante este nível, só para dificultar ;-)', + 'gl' : '¡Ese comando de git está deshabilitado para este nivel!', 'fr_FR': 'Cette commande git est désactivée pour ce niveau !', 'ru_RU': 'На этом уровне нельзя использовать эту команду!', 'uk': 'На цьому рівні не можна використовувати цю команду!', @@ -1040,6 +1109,7 @@ exports.strings = { 'es_AR': 'Este es el JSON de este nivel. Compartilo con quien quieras o mandámelo por Github', 'es_ES': 'Este es el JSON de este nivel. Compártelo con quien quieras o mandámelo por Github.', 'pt_BR': 'Aqui está o JSON para este nível! Compartilhe com alguém ou me envie pelo Github', + 'gl' : 'Este é o JSON deste nivel. Comparteo con quen queiras ou mándao por Github', 'fr_FR': 'Voici le JSON pour ce niveau ! Partagez-le avec quelqu\'un ou envoyez-le moi sur Github', 'ru_RU': 'Вот JSON для этого уровня! Поделись им с кем-нибудь или отправь его нам на GitHub', 'uk': 'Ось JSON для цього рівня! Поділись з кимось чи відправ мені його на Github', @@ -1055,6 +1125,7 @@ exports.strings = { 'es_AR': 'No especificaste un mensaje de inicio, ¿querés agregar uno?', 'es_ES': 'No especificaste un mensaje de inicio, ¿quieres agregar uno?', 'pt_BR': 'Você não especificou uma mensagem de início, quer colocar uma?', + 'gl' : 'Non especificaches unha mensaxe de incio. ¿queres agregar un?', 'fr_FR': 'Vous n\'avez pas spécifié de dialogue de départ, voulez-vous en ajouter un ?', 'ru_RU': 'Не указано стартово сообщение! Точно продолжаем?', 'uk': 'Не вказано стартовий діалог, хочеш додати стартовий діалог?', @@ -1070,6 +1141,7 @@ exports.strings = { 'es_AR': 'No especificaste ninguna pista, ¿querés agregar alguna?', 'es_ES': 'No especificaste ninguna pista, ¿quieres agregar alguna?', 'pt_BR': 'Você não especificou uma dica, quer colocar uma?', + 'gl' : 'Ti non especificaches unha pista, ¿queres agregar algunha?', 'fr_FR': 'Vous n\'avez pas spécifié d\'indice, voulez-vous en ajouter un ?', 'ru_RU': 'Не указана подсказка для уровня! Пренебречь? Вальсируем?', 'uk': 'Не вказана підказка, хочеш додати підказку?', @@ -1085,6 +1157,7 @@ exports.strings = { 'es_AR': 'Ingresá una pista para este nivel, o dejalo en blanco si no querés incluir ninguna', 'es_ES': 'Ingresa una pista para este nivel, o déjalo en blanco si no quieres incluir ninguna.', 'pt_BR': 'Colocque uma dica para este nível, ou deixe em branco se não quiser incluir', + 'gl' : 'Ingresa unha pista para este nivel, ou déixao en branco se non a queres incluír.', 'fr_FR': 'Entrez l\'indice pour ce niveau, ou laissez-le vide pour ne pas l\'inclure', 'ru_RU': 'Введи подсказку для уровня, если хочешь.', 'uk': 'Додай підказку для рівня, якщо хочеш', @@ -1100,6 +1173,7 @@ exports.strings = { 'es_AR': 'Ingresá el nombre del nivel', 'es_ES': 'Ingresa el nombre del nivel.', 'pt_BR': 'Coloque o nome do nível', + 'gl' : 'Coloque o nome do nivel', 'fr_FR': 'Entrez le nom pour ce niveau', 'ru_RU': 'Введи название уровня', 'uk': 'Введи назву рівня', @@ -1115,6 +1189,7 @@ exports.strings = { 'es_AR': '¡Tu solución está vacía! Algo hay que hacer', 'es_ES': '¡Tu solución está vacía! Algo hay que hacer.', 'pt_BR': 'Sua solução está vazia! O aprendiz deveria ter que fazer alguma coisa', + 'gl' : '¡Su solución está vacía! Algo haberá que facer.', 'fr_FR': 'Votre solution est vide !! Quelque chose ne tourne pas rond', 'ru_RU': 'Решение не указано! Так не годится!', 'uk': 'Розв’язок порожній!! Щось не так', @@ -1130,6 +1205,7 @@ exports.strings = { 'es_AR': 'Estableciendo el punto de inicio... La solución y el objetivo serán sobreescritos si ya habían sido definidos', 'es_ES': 'Estableciendo el punto de inicio... La solución y el objetivo serán sobreescritos si ya habían sido definidos.', 'pt_BR': 'Esbelecendo o ponto de início... a solução e o objetivo serão sobrescritos caso já existirem', + 'gl' : 'Establecendo o punto de inicio... A solución e o obxectivo serán sobreescritos se xa foron definidos.', 'fr_FR': 'Redéfinition du point de départ… la solution et la cible seront écrasés s\'ils ont déjà été définis', 'ru_RU': 'Устанавливаю стартовую точку... Решение и итоговое состояние будут стёрты, если они указаны ранее', 'uk': 'Встановлюю стартову точку... розв’язок та ціль будуть переписані якщо вони були задані раніше', @@ -1145,6 +1221,7 @@ exports.strings = { 'es_AR': 'Estás en un nivel, por lo que hay varios tipos de ayuda. Por favor elegí entre "help level" para aprender algo más sobre esta lección, "help general" para ayuda sobre el uso de Learn GitBranching, o "objective" para aprender a resolver este nivel.', 'es_ES': 'Estás en un nivel, por lo que hay varios tipos de ayuda. Por favor elige "help level" para aprender más sobre esta lección, "help general" para ayuda sobre el uso de Learn GitBranching, o "objective" para aprender a resolver este nivel.', 'pt_BR': 'Você está em um nível, então há vários tipos de ajuda. Selecione "help level" para aprender mais sobre esta lição, "help general" para aprender a usar o Learn GitBranching, ou "objective" ver como resolver o nível.', + 'gl' : 'Estás nun nivel, entón hai varios tipos de axuda. Selecione "help level" para aprender máis sobre esta lección, "gelp general" para aprender a usar o Learn Git Branching, ou "objective" para ver como resolver o nivel.', 'fr_FR': 'Vous êtes dans un niveau, donc plusieurs formes d\'aide sont disponibles. Merci de sélectionner soit "help level" pour en apprendre plus sur cette leçon, "help general" pour l\'utilisation de Learn GitBranching, ou "objective" pour apprendre comment résoudre le niveau', 'ru_RU': 'При прохождении уровня доступны несколько видов помощи. Определить что нужно: "help level" чтобы получить информацию об этом уровне, "help general" для того, чтобы узнать о игре в целом или "objective" чтобы узнать что надо сделать в этом уровне.', 'uk': 'При проходженні рівня доступні декілька різновидів допомоги. Виберіть або "help level" щоб взнати більше про цей рівень, чи "help general" щоб взнати більше про Learn Git Branching, чи "objective" щоб дізнатись більше про проходження цього рівня', @@ -1160,6 +1237,7 @@ exports.strings = { 'es_AR': 'Estás en el constructor de niveles, por lo que hay varios tipos de ayuda. Elegí entre "help general" para ayuda sobre Learn GitBranching y "help builder" para ayuda sobre el constructor de niveles', 'es_ES': 'Estás en un constructor de niveles, por lo que hay varios tipos de ayuda. Elige "help general" para ayuda sobre Learn GitBranching o "help builder" para ayuda sobre el constructor de niveles', 'pt_BR': 'Você está no construtor de nívels, então há vários tipos de ajuda. Selecione "help general" ou "help builder"', + 'gl' : 'Estás no constructor de niveis, polo que hai varios tipos de axuda. Elixe "help general" ou "help builder"', 'fr_FR': 'Vous êtes dans l\'éditeur de niveaux, donc plusieurs formes d\'aide sont disponibles. Merci de sélectionner soit "help general" soit "help builder"', 'ru_RU': 'При создании уровней доступны несколько видов помощи. Выбери между "help general" и "help builder"', 'uk': 'При створенні рівня доступні декілька різновидів допомоги. Виберіть або "help general", чи "help builder"', @@ -1174,6 +1252,7 @@ exports.strings = { 'zh_CN': '显示目标', 'fr_FR': 'Afficher les cibles', 'pt_BR': 'Mostrar objetivo', + 'gl' : 'Amosar obxectivo', 'es_AR': 'Mostrar objetivo', 'es_ES': 'Mostrar objetivo', 'ja' : 'ゴールを表示', @@ -1190,6 +1269,7 @@ exports.strings = { 'zh_TW': '隱藏目標', 'zh_CN': '隐藏目标', 'pt_BR': 'Ocultar objetivo', + 'gl' : 'Ocultar obxectivo', 'es_AR': 'Ocultar objetivo', 'es_ES': 'Ocultar objetivo', 'ja' : 'ゴールを隠す', @@ -1205,6 +1285,7 @@ exports.strings = { 'zh_TW': '提示', 'zh_CN': '提示', 'es_ES': 'Objetivo', + 'gl' : 'Obxectivo', 'ru_RU': 'Задача', 'uk': 'Задача', 'ko': '목적' @@ -1216,7 +1297,8 @@ exports.strings = { 'de_DE': 'Git Demonstration', 'zh_TW': 'Git示範', 'zh_CN': 'Git示范', - 'es_ES': 'Demonstración de Git', + 'es_ES': 'Demostración de Git', + 'gl' : 'Demostración de Git', 'ru_RU': 'Git демо', 'uk' : 'Git демо', 'ko' : 'Git 데모' @@ -1231,6 +1313,7 @@ exports.strings = { 'es_AR': 'Objetivo a cumplir', 'es_ES': 'Objetivo a cumplir', 'pt_BR': 'Objetivo a cumprir', + 'gl' : 'Obxectivo a cumprir', 'fr_FR': 'Cible à atteindre', 'ja' : '到達目標', 'ru_RU': 'Цель уровня', @@ -1246,6 +1329,7 @@ exports.strings = { 'es_AR': 'Nota: Sólo la rama master va a ser chequeada en este nivel. Las otras ramas sólo son para referencia. Como siempre, podés ocultar este mensaje con "hide goal"', 'es_ES': 'Nota: Sólo la rama master va a ser inspeccionado en este nivel. Las otras ramas sólo son para referencia (etiquetados abajo con guion). Siempre puedes ocultar este mensaje con "hide goal."', 'pt_BR': 'Nota: Apenas o ramo master será verificado neste nível. Os outros ramos (dentro das caixas clareadas) são somente para referência. Como sempre, você pode ocultar esta janela com "hide goal"', + 'gl': 'Nota: Só a rama master será verificada neste nivel. As outras ramas (dentro das caixas clareadas) son soamente de referencia. Coma sempre, podes ocultar está ventá con "hide goal"', 'zh_CN': '注意:本关卡中,只检查 master 分支,其他分支只是用作 reference 存在(以虚线标签表示)。照常,你可以用 “hide goal” 来隐藏此窗口。', 'zh_TW': '在這個關卡中,只有 master branch 會被檢查,別的 branch 只是用來做為 reference (下面用虛線符號表示)。一如往常,你可以利用 "hide goal" 來隱藏這個對話視窗', 'ja': 'Note: masterブランチだけをこのlevelではチェックします。その他のブランチ(以下では、破線で示されています)に関しては、参照のためにあります。また、いつでもこのウィンドウは"hide goal"と打つかクリックで閉じれます', @@ -1263,6 +1347,7 @@ exports.strings = { 'es_AR': 'Podés ocultar esta ventana con "hide goal"', 'es_ES': 'Puedes ocultar esta ventana con "hide goal."', 'pt_BR': 'Você pode ocultar esta janela com "hide goal"', + 'gl' : 'Podes ocultar esta ventá con "hide goal"', 'fr_FR': 'Vous pouvez masquer cette fenêtre avec "Cacher les cibles"', 'ja' : 'このウィンドウは"hide goal"と打つかクリックで閉じれます', 'ru_RU': 'Можно скрыть это окно при помощи "hide goal"', @@ -1279,6 +1364,7 @@ exports.strings = { 'es_AR': 'Podés ocultar esta ventana con "hide start"', 'es_ES': 'Puedes ocultar esta ventana con "hide start."', 'pt_BR': 'Você pode ocultar esta janela com "hide start"', + 'gl' : 'Podes ocultar esta ventá con "hide start"', 'fr_FR': 'Vous pouvez masquer cette fenêtre avec "hide start"', 'ja' : 'このウィンドウは"hide start"かクリックで閉じれます', 'ru_RU': 'Можно скрыть это окно при помощи "hide start"', @@ -1295,6 +1381,7 @@ exports.strings = { 'es_AR': 'Constructor de niveles', 'es_ES': 'Constructor de niveles', 'pt_BR': 'Construtor de níveis', + 'gl' : 'Constructor de nivéis', 'fr_FR': 'Éditeur de niveaux', 'ja' : 'Levelエディタ', 'ru_RU': 'Редактор уровней', @@ -1311,6 +1398,7 @@ exports.strings = { 'es_AR': '¡No hay mensaje de inicio para este nivel!', 'es_ES': '¡No hay mensaje de inicio para este nivel!', 'pt_BR': 'Não há mensagem de início para este nível!', + 'gl' : '¡Non hai mensaxe de inicio para este nivel!', 'fr_FR': 'Il n\'y a aucun dialogue de départ à afficher pour ce niveau !', 'ja' : 'このLevelにはスタートダイアログが存在しません', 'ru_RU': 'Нет стартового сообщение для уровня!', @@ -1327,6 +1415,7 @@ exports.strings = { 'es_AR': 'Mmm... Pareciera no haber pistas para este nivel :-/', 'es_ES': 'Mmm... Parece que no hay pistas para este nivel. :-/', 'pt_BR': 'Hmm, não existe nenhuma pista para este nível :-/', + 'gl' : 'Hmm, non existe ningunha pista para este nivel :-/', 'fr_FR': 'Hum, il ne semble pas y avoir d\'indice pour ce niveau :-/', 'ja' : 'あらら、このLevelでは、残念ながらヒントが存在しません :-/', 'ru_RU': "Милый мой, хороший, догадайся сам :-/ Подсказка не создана...", @@ -1343,6 +1432,7 @@ exports.strings = { 'es_AR': 'Aún no hay traducción para {key} :( ¡Metete en Github y sugerí una! :)', 'es_ES': 'Aún no hay traducción para {key}. :( ¡Métete en Github y sugiere una! :)', 'pt_BR': 'Não existe tradução para {key} :( Pule no Github e sugira uma! :)', + 'gl' : 'Non existe tradución para {key} :( Axúdanos en Github e suxire unha! :)', 'fr_FR': 'La traduction pour {key} n\'existe pas encore :( Venez sur Github pour en offrir une !', 'ja' : '{key}の翻訳がまだ存在しません :( GitHubでの、翻訳の協力をお願いします m(_)m', 'ru_RU': 'Перевода для {key} не создано :( Пожалуйста, предложи перевод на GitHub', @@ -1359,6 +1449,7 @@ exports.strings = { 'es_AR': 'Este mensaje o texto aún no fue traducido a tu idioma :( ¡Metete en Github y ayudanos a traducirlo!', 'es_ES': 'Este mensaje o texto aún no fue traducido a tu idioma. :( ¡Métete en Github y ayúdanos a traducirlo!', 'pt_BR': 'Esta mensagem ou texto não foi traduzida para Português :( Ajude-nos a traduzir no Github!', + 'gl' : 'Esta mensaxe ou texto non foi traducida ó teu idioma :( Axúdanos a traducir a web en Github, é moi doado!', 'fr_FR': 'Ce message n\'a pas encore été traduit dans votre langue :( Venez sur Github aider à la traduction !', 'ja' : 'このダイアログ、またはテキストの翻訳がまだ存在しません :( GitHubでの、翻訳の協力をお願いします m(_)m', 'ru_RU': 'Для этого сообщения нет перевода :( Пожалуйста, предложи перевод на GitHub', diff --git a/src/js/react_views/IntlHelperBarView.jsx b/src/js/react_views/IntlHelperBarView.jsx index 7b9a1cf7..e0756dcc 100644 --- a/src/js/react_views/IntlHelperBarView.jsx +++ b/src/js/react_views/IntlHelperBarView.jsx @@ -93,6 +93,12 @@ var IntlHelperBarView = React.createClass({ onClick: function() { this.fireCommand('locale uk; levels'); }.bind(this) + }, { + text: 'Galego', + testID: 'galician', + onClick: function() { + this.fireCommand('locale gl; levels'); + }.bind(this) }, { icon: 'signout', onClick: function() { diff --git a/src/levels/advanced/multipleParents.js b/src/levels/advanced/multipleParents.js index 93b5e3b7..7b40b4dc 100644 --- a/src/levels/advanced/multipleParents.js +++ b/src/levels/advanced/multipleParents.js @@ -10,6 +10,7 @@ exports.level = { "ja" : "複数の親", "es_AR": "Múltiples padres", "pt_BR": "Múltiplos pais", + "gl" : "Múltiples pais", "zh_TW": "多個 parent commit", "ru_RU": "Здоровая семья, или несколько родителей", "ko" : "다수의 부모", @@ -23,6 +24,7 @@ exports.level = { "zh_CN": "使用 `git branch bugWork` 加上一个目标提交记录来创建消失的引用。", "es_AR": "Usá `git branch bugWork` sobre algún commit para crear la referencia faltante", "pt_BR": "Use `git branch bugWork` com um commit alvo para criar a referência que falta", + "gl" : "Usa `git branch bugWork` sobre calquera commit para crear a referencia que falta", "zh_TW": "在一個指定的 commit 上面使用 `git branch bugWork`。", "ru_RU": "`git branch bugWork` на нужном коммите поможет создать нужную ссылку.", "ko" : "`git branch bugWork`를 대상 커밋과 함께 사용해서 부족한 참조를 만드세요", @@ -551,6 +553,94 @@ exports.level = { } ] }, + + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Especificando pais", + "", + "Tanto o modificador `~`, como o modificador `^` aceptan un número opcional despois del.", + "", + "Mellor que especificar o número de commits que percorrer cara atrás (que é o que o `~` fai), o modificador sobre `^` especifica qué referencia do pai vai ser seguida dende o commit con merge. Lembra qué os commits do merge teñen varios pais, entón o camiño a seguir é ambiguo.", + "", + "Git normalmente seguirá ó \"primeiro\" pai de un commit de merge, pero especificando un número co `^` muda o comportamento do pai.", + "", + "Xa chega de faladoiros, vexamos o comando en acción.", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Aquí temos un commit do merge. Se fixéramos checkout en `master^` sen especificar un número, imos seguir ó primeiro pai enriba do commit do merge. ", + "", + "(*Na nosa vista, o primeiro pai é aquel directamente enriba do commit do merge.*)" + ], + "afterMarkdowns": [ + "Sinxelo, eso é aquelo co que xa estamos acostumados." + ], + "command": "git checkout master^", + "beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Agora imos, en vez de iso, especificar o segundo pai..." + ], + "afterMarkdowns": [ + "¿Viches? Subimos para o outro pai." + ], + "command": "git checkout master^2", + "beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Os modificadores `^` e `~` pódense mover ao redor da árbore de commits con moito poder:" + ], + "afterMarkdowns": [ + "Rápido coma a luz!" + ], + "command": "git checkout HEAD~; git checkout HEAD^2; git checkout HEAD~2", + "beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Aínda máis tolo, eses modificadores poden ser encadeados en conxunto! Olla ahí:" + ], + "afterMarkdowns": [ + "O mesmo movemento feito antes, pero feito nun só comando." + ], + "command": "git checkout HEAD~^2~2", + "beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Pono na práctica", + "", + "Para completar este nível, crea unha nova rama no destino especificado.", + "", + "Obviamente sería máis sinxelo especificar o commit diretamente (algo como `C6`), pero en vez de facer eso, ¡podes usar os modificadores dos que falamos!" + ] + } + } + ] + }, "zh_TW": { "childViews": [ { diff --git a/src/levels/index.js b/src/levels/index.js index f35474ad..957193c7 100644 --- a/src/levels/index.js +++ b/src/levels/index.js @@ -60,6 +60,7 @@ var sequenceInfo = exports.sequenceInfo = { 'fr_FR': 'Séquence d\'introduction', 'es_AR': 'Secuencia introductoria', 'pt_BR': 'Sequência introdutória', + 'gl' : 'Secuencia introductoria', 'zh_CN': '基础篇', 'zh_TW': '基礎篇', 'ko' : 'git 기본', @@ -73,6 +74,7 @@ var sequenceInfo = exports.sequenceInfo = { 'fr_FR': 'Une introduction en douceur à la majorité des commandes git', 'es_AR': 'Una breve introducción a la mayoría de los comandos de git', 'pt_BR': 'Uma breve introdução à maioria dos comandos do git', + 'gl' : 'Unha breve introducción á maioría dos comandos de git', 'zh_CN': '循序渐进地介绍 Git 主要命令', 'zh_TW': '循序漸進地介紹 git 主要命令', 'ko' : 'git의 주요 명령어를 깔끔하게 알려드립니다', @@ -88,6 +90,7 @@ var sequenceInfo = exports.sequenceInfo = { 'fr_FR': 'Montée en puissance', 'es_AR': 'Acelerando', 'pt_BR': 'Acelerando', + 'gl' : 'Alixeirando', 'zh_CN': '高级篇', 'zh_TW': '進階篇', 'ru_RU': 'Едем дальше', @@ -101,6 +104,7 @@ var sequenceInfo = exports.sequenceInfo = { 'fr_FR': 'Le prochain excellent plat de pur git. J\'espère que vous êtes affamés', 'es_AR': 'La próxima porción de 100% maravillas git. Espero que estés hambriento', 'pt_BR': 'A próxima porção de maravilhas do git. Faminto?', + 'gl' : 'A próxima porción das marabillas de git. Agardo que estés esfameado', 'zh_CN': '要开始介绍 Git 的超棒特性了,快来吧!', 'zh_TW': '接下來是 git 非常厲害的地方!相信你已經迫不及待了吧!', 'ru_RU': 'Следующая порция абсолютной git-крутотенюшки. Проголодались?', @@ -117,6 +121,7 @@ var sequenceInfo = exports.sequenceInfo = { 'fr_FR': 'Push & Pull -- dépôts gits distants !', 'es_AR': 'Push & Pull -- Git Remotes!', 'pt_BR': 'Push & Pull -- repositórios remotos no Git!', + 'gl' : 'Push & Pull -- Repositorios remotos no Git!', 'zh_CN': 'Push & Pull —— Git 远程仓库!', 'zh_TW': 'Push & Pull -- Git Remotes!', 'ru_RU': 'Push & Pull - удалённые репозитории в Git!', @@ -130,6 +135,7 @@ var sequenceInfo = exports.sequenceInfo = { 'de_DE': 'Zeit Eure 1en und 0en zu teilen; Coding mit sozialer Komponente', 'es_AR': 'Hora de compartir sus 1\'s y 0\'s, chicos; programar se volvió social!', 'pt_BR': 'Hora de compartilhar seus 1\'s e 0\'s, crianças; programar agora é social!', + 'gl' : 'Hora de compartilos seus 1\' e 0\'s, rapaces; programar agora é social!', 'zh_CN': '是时候分享你的代码了,让编码变得社交化吧', 'zh_TW': '是時候分享你的程式碼了', 'ru_RU': 'Настало время поделиться своими единичками и нулями. Время коллективного программирования', @@ -146,6 +152,7 @@ var sequenceInfo = exports.sequenceInfo = { 'fr_FR': 'Vers l\'infini et au-delà -- dépôts distants version avancée', 'es_AR': 'Hasta el origin y más allá -- Git Remotes avanzado!', 'pt_BR': 'Até a origin e além -- repositórios remotos avançados!', + 'gl' : 'Ata á orixe e máis aló -- repositorios remotos avanzados!', 'zh_CN': '关于 origin 和它的周边 —— Git 远程仓库高级操作', 'zh_TW': '關於 origin 和其它 repo,git remote 的進階指令', 'ru_RU': 'Через origin – к звёздам. Продвинутое использование Git Remotes', @@ -158,6 +165,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : '絶えず上級者の仕事は存在する。。。', 'es_AR': 'Y pensabas que ser un dictador benévolo sería divertido...', 'pt_BR': 'E você achava que ser um déspota esclarecido seria mais divertido...', + 'gl' : 'E pensabas que ser un dictador benévolo sería divertido...', 'zh_CN': '做一名仁慈的独裁者一定会很有趣……', 'zh_TW': '而且你會覺得做一個仁慈的獨裁者會很有趣...', 'de_DE': 'Git Remotes für Fortgeschrittene', @@ -173,6 +181,7 @@ var sequenceInfo = exports.sequenceInfo = { 'fr_FR': 'Déplacer le travail', 'es_AR': 'Moviendo el trabajo por ahí', 'pt_BR': 'Movendo trabalho por aí', + 'gl' : 'Movendo o traballo por ahí', 'ja' : 'コードの移動', 'ko' : '코드 이리저리 옮기기', 'zh_CN': '移动提交记录', @@ -186,6 +195,7 @@ var sequenceInfo = exports.sequenceInfo = { 'fr_FR': 'Soyez à l\'aise pour modifier l\'arbre Git', 'es_AR': 'Ponete cómodo con modificar el directorio fuente', 'pt_BR': 'Fique confortável em modificar a árvore de códigos', + 'gl' : 'Ponte cómodo modificando a árbore de git', 'ko' : '작업 트리를 수정하는건 식은죽 먹기지요 이제', 'ja' : '話題のrebaseってどんなものだろう?って人にオススメ', 'zh_CN': '自由修改提交树', @@ -202,6 +212,7 @@ var sequenceInfo = exports.sequenceInfo = { 'fr_FR': 'Un assortiment', 'es_AR': 'Bolsa de gatos', 'pt_BR': 'Sortidos', + 'gl' : 'Todo mesturado', 'ko' : '종합선물세트', 'zh_CN': '杂项', 'zh_TW': '活用 git 的指令', @@ -215,6 +226,7 @@ var sequenceInfo = exports.sequenceInfo = { 'fr_FR': 'Un assortiment de techniques et astuces pour utiliser Git', 'es_AR': 'Un rejunte de técnicas, trucos y tips sobre Git', 'pt_BR': 'Técnicas, truques e dicas sortidas sobre Git', + 'gl' : 'Mestura de técnicas, trucos e consellos', 'ko' : 'Git을 다루는 다양한 팁과 테크닉을 다양하게 알아봅니다', 'zh_CN': 'Git 技术、技巧与贴士大集合', 'zh_TW': 'git 的技術,招數與技巧', @@ -230,6 +242,7 @@ var sequenceInfo = exports.sequenceInfo = { 'fr_FR': 'Sujets avancés', 'es_AR': 'Temas avanzados', 'pt_BR': 'Temas avançados', + 'gl' : 'Temas avanzados', 'zh_CN': '高级话题', 'zh_TW': '進階主題', 'ru_RU': 'Продвинутый уровень', @@ -243,6 +256,7 @@ var sequenceInfo = exports.sequenceInfo = { 'fr_FR': 'Pour les plus courageux !', 'es_AR': '¡Para los verdaderos valientes!', 'pt_BR': 'Para os verdadeiros valentes!', + 'gl' : '¡Para os verdadeiros valerosos!', 'zh_CN': '只为真正的勇士!', 'zh_TW': '來成為真正的強者吧!', 'ru_RU': 'Если ты смелый, ловкий, умелый – потренируйся тут', diff --git a/src/levels/intro/branching.js b/src/levels/intro/branching.js index 79c00471..7ecdc005 100644 --- a/src/levels/intro/branching.js +++ b/src/levels/intro/branching.js @@ -8,6 +8,7 @@ exports.level = { "ko": "Git에서 브랜치 쓰기", "es_AR": "Brancheando en Git", "pt_BR": "Ramos no Git", + "gl" : "Ramas en Git", "fr_FR": "Gérer les branches avec Git", "zh_CN": "Git Branch", "zh_TW": "建立 git branch", @@ -20,6 +21,7 @@ exports.level = { "ja" : "ブランチの作成(\"git branch [ブランチ名]\")と、チェックアウト(\"git checkout [ブランチ名]\")", "es_AR": "Hacé una nueva rama con \"git branch [nombre]\" y cambiá a ella con \"git checkout [nombre]\"", "pt_BR": "Crie um novo ramo com \"git branch [nome]\" e mude para ele com \"git checkout [nome]\"", + "gl" : "Crea unha nova rama con \"git branch [nome]\" e cambiate a ela facendo \"git checkout [nome]\"", "fr_FR": "Faites une nouvelle branche avec \"git branch [nom]\" positionnez-vous dans celle-ci avec \"git checkout [nom]\"", "zh_CN": "用 'git branch <分支名>' 来创建分支,用 'git checkout <分支名>' 来切换到分支", "zh_TW": "用 'git branch [ branch 名稱]' 來建立 branch,用 'git checkout [ branch 名稱]' 切換到該 branch", @@ -420,6 +422,88 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Ramas en Git", + "", + "As Ramas en Git son tamén increiblemente liviás. Elas sinxelamente son referencias a un mesmo commit específico, e nada máis. É por iso que moitos entusiastas do Git entonan o mantra:", + "", + "```", + "ramifica cedo, ramifica sempre", + "```", + "", + "Debido a non existir sobrecarga de memoria facendo moitas ramas, é máis sinxelo dividir a lóxica do teu traballo en ramas que ter unha enorme.", + "", + "Cando comezamos a mesturar ramas e commits imos ver como eses dous recursos combínanse ben. Por agora lembra que unha rama esencialmente di \"Quero incluír o traballo deste commit e de todos os seus ancestros\"." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Vexamos cómo as ramas funcionan na práctica.", + "", + "Aquí imos crear unha nova rama chamada `newImage`" + ], + "afterMarkdowns": [ + "Mira, solo tes que poñer eso para crear unha rama! A rama `newImage` agora apunta ó commit `C1`" + ], + "command": "git branch newImage", + "beforeCommand": "" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Imos intentar colocar algún traballo nesta nova rama. Pincha no botón de abaixo" + ], + "afterMarkdowns": [ + "¡Bueno home! A rama `master` moveuse pero a rama `newImage` non! Eso é porque a nova rama non era a \"actual\", e é por iso que o asterisco (*) ficaba na rama `master`" + ], + "command": "git commit", + "beforeCommand": "git branch newImage" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Ímoslle decir a Git que nos queremos mover á rama con:", + "", + "```", + "git checkout [nome]", + "```", + "", + "Esto vainos levar á rama que tiñamos antes de facer os nosos cambios." + ], + "afterMarkdowns": [ + "¡Imos alá! Os nosos cambios foron grabados na nova rama." + ], + "command": "git checkout newImage; git commit", + "beforeCommand": "git branch newImage" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¡Ok! Estas preparado para facer ramas. Así que podes pechar a ventá,", + "crear unha rama chamada `bugFix` e moverte para esa rama.", + "", + "Inda así, hai un atallo: se ti quixeras crear unha nova ", + "rama e moverte a ela ó mesmo tempo, ti podes escribir simplemente ", + "`git checkout -b [a-tua- rama]`." + ] + } + } + ] + }, "fr_FR": { "childViews": [ { diff --git a/src/levels/intro/commits.js b/src/levels/intro/commits.js index a9ee3309..9f74fc72 100644 --- a/src/levels/intro/commits.js +++ b/src/levels/intro/commits.js @@ -4,6 +4,7 @@ exports.level = { "de_DE": "Einführung in Git Commits", "es_AR": "Introducción a los commits de Git", "pt_BR": "Introdução aos commits no Git", + "gl" : "Introducción ós commits de Git", "fr_FR": "Introduction aux commits avec Git", "ja" : "Gitのコミット", 'ko': 'Git 커밋 소개', @@ -20,6 +21,7 @@ exports.level = { "de_DE": "Gib einfach zweimal 'git commit' ein um den Level abzuschließen", "es_AR": "¡Simplemente tipeá 'git commit' dos veces para terminar!", "pt_BR": "Simplesmente digite 'git commit' duas vezes para concluir!", + "gl" : "Simplemente escribe 'git commit' dúas veces para terminar.", "fr_FR": "Il suffit de saisir 'git commit' deux fois pour réussir !", "zh_CN": "执行两次 'git commit' 就可以过关了!", "zh_TW": "輸入兩次 'git commit' 就可以完成!", @@ -246,6 +248,48 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Commits en Git", + "Un commit nun repositorio de git rexistra unha fotografía (snapshot) de tódolos arquivos no seu directorio. É coma un copy&paste xigante, ¡pero todavía mellor!", + "", + "Git quere gardar os commits o máis pequenos posíbel, por iso non copia directamente o directorio completo sempre que fas un commit. El pode (cando é posíbel) comprimir nun commit un conxunto de cambios (ou un _\"delta\"_) entre unha versión do teu respositorio e o seguinte.", + "", + "Git tamén garda un histórico de cando se fixo cada cambio. Por iso a maioría dos commits teñen ancestros enriba deles, e nos indicámolos con frechas na nosa visualización. ¡Manter a historia é óptimo para tódolos que traballan no proxecto!", + "", + "Hai moito que aprender, pero por agora podes pensar que os commits son fotos do teu proxecto. Os commits son liviáns, e cambiar dun para o outro é extremadamente rápido!" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Vexamos o que iso significa na práctica. Á dereita, temos unha visualización dun (pequeno) repositorio de git. Hai dous commits por agora: o commit inicial, `C0`, e un commit que lle segue, `C1`, que podería ter algúns cambios interesantes.", + "", + "Pincha no botón de abaixo para facer un novo commit" + ], + "afterMarkdowns": [ + "¡Alá imos! Mi ma!. Fixemos cambios no repositorio e gardámolos nun commit. O commit que creaches ten un pai, `C1`, que é unha referencia do commit no que se basea." + ], + "command": "git commit", + "beforeCommand": "" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Alá imos. ¡Inténtao ti agora! Cando se peche a ventá, fai dous commits para completar o nivel." + ] + } + } + ] + }, "fr_FR": { "childViews": [ { diff --git a/src/levels/intro/merging.js b/src/levels/intro/merging.js index 35a1d2bb..4e69ba24 100644 --- a/src/levels/intro/merging.js +++ b/src/levels/intro/merging.js @@ -6,6 +6,7 @@ exports.level = { "de_DE": "Mergen in git", "es_AR": "Mergeando en Git", "pt_BR": "Merge no Git", + "gl" : "Merge en Git", "fr_FR": "Faire des 'merge' (fusions de branches) avec Git", "ko": "Git에서 브랜치 합치기(Merge)", "ja"   : "ブランチとマージ", @@ -20,6 +21,7 @@ exports.level = { "ja"   : "指示された順番でコミットすること(masterの前にbugFixで)", "es_AR": "Acordate de commitear en el orden especificado (bugFix antes de master)", "pt_BR": "Lembre-se de commitar na ordem especificada (bugFix antes de master)", + "gl" : "Lembrate de facer commit na orde específica (bugFix antes de master)", "fr_FR": "Pensez à faire des commits dans l'ordre indiqué (bugFix avant master)", "zh_CN": "要按目标窗口中指定的顺序进行提交(bugFix 先于 master)", "zh_TW": "記住按指定的順序 commit(bugFix 比 master 優先)", @@ -376,6 +378,75 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Ramas e merges", + "", + "¡Xenial! Agora sabemos como facer commits e crear ramas. Agora precisamos aprender unha forma de combinar o traballo de dúas ramas diferentes. Iso permitiríanos ramificar, facer un novo cambio, e entón mesturalo de volta.", + "", + "O primeiro comando para mesturar o traballo que imos ver é `git merge`. O merge de Git crea un commit especial que ten dous pais únicos. Un commit con dous pais significa \"Quero incluír todo o traballo deste pai cos cambios do outro pai, *e* o conxunto de tódolos ancestros.\"", + "", + "É máis doado con unha visualización, ímolo ver na seguinte vista." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Aquí nos temos dúas ramas; cada unha ten un commit que é único. Isto significa que ningunha rama inclúe o conxunto de \"traballo\" feito no noso repositorio. Imos arranxar esto cun merge.", + "", + "Imos xuntar a rama `bugFix` na `master`" + ], + "afterMarkdowns": [ + "¡Uah! ¿Viches? Antes de todo, `master` agora apunta a un commit que ten dous pais. Se ti sigues as frechas subindo a árbore de commits a partir de `master`, serás capaz de ver tódolos commits ata a raíz, calquera de eles. Isto significa que a rama `master` contén todo o traballo realizado no repositorio ata ese momento.", + "", + "Ademáis, ¿viches como cambiaron as cores dos commits? Para axudarte a aprender, hai unha lenda. Cada rama ten unha única cor. Cada commit ten a cor resultante de mesturar as cores de tódalas ramas que contén.", + "", + "Aquí vemos que a rama `master` está mesturada en todos os commits, pero a cor da rama `bugFix` non o está. Imos arranxar eso..." + ], + "command": "git merge bugFix", + "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Imos mesturar a rama `master` en `bugFix`:" + ], + "afterMarkdowns": [ + "Como o `bugFix` é un ancestro de `master`, o git non ten traballo que facer; el só ten que mover o punteiro de `bugFix` para o mesmo commit que `master`.", + "", + "Agora tódolos commits teñen a mesma cor, o que significa que ambas ramas teñen o mesmo traballo no repositorios! Iepa!" + ], + "command": "git checkout bugFix; git merge master", + "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, fai o seguinte:", + "", + "* Crea unha nova ramara chamada `bugFix`", + "* Fai checkout da rama `bugFix` con `git checkout bugFix`", + "* Fai un commit", + "* Volve á rama `master` con `git checkout`", + "* Fai un novo commit", + "* Xunta a rama `bugFix` en `master` con `git merge`", + "", + "¡Recorda, podes amosar esta mensaxe novamente co comando \"objective\"!" + ] + } + } + ] + }, "fr_FR": { "childViews": [ { diff --git a/src/levels/intro/rebasing.js b/src/levels/intro/rebasing.js index 3cfb56bd..29a46107 100644 --- a/src/levels/intro/rebasing.js +++ b/src/levels/intro/rebasing.js @@ -7,6 +7,7 @@ exports.level = { "ja" : "Rebaseの解説", "es_AR": "Introducción a rebase", "pt_BR": "Introdução ao rebase", + "gl" : "Introducción a rebase", "fr_FR": "Introduction à rebase", "ko": "리베이스(rebase)의 기본", "zh_CN": "Git Rebase", @@ -21,6 +22,7 @@ exports.level = { "fr_FR": "Assurez-vous de bien faire votre commit sur bugFix en premier", "es_AR": "Asegurate de commitear desde bugFix primero", "pt_BR": "O bugFix precisa ser commitado primeiro", + "gl" : "Asegurate de facer o commit dende bugFix primeiro", "ko": "bugFix 브랜치에서 먼저 커밋하세요", "zh_CN": "先在 bugFix 分支上进行提交", "zh_TW": "你要先在 bugFix branch 進行 commit", @@ -366,6 +368,73 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Rebase en Git", + "", + "A segunda forma de mesturar traballo entre ramas é o *rebase*. O rebase esencialmente pega un conxunto de commits, \"copia\" os commits, e os sitúa en outro lugar.", + "", + "Esto pode paracer confuso, pero a vantaxe do rebase é que se pode usar para construír unha secuencia máis bonita e linial de commits. O rexisto de commits do repositorio estará máis limpo se só se permite facer rebases.", + "", + "Ímolo ver en acción..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Aquí temos dúas ramas novamente; decátate de que a rama `bugFix` está seleccionada (olla ó asterisco)", + "", + "Queremos mover o noso traballo do `bugFix` directamente dentro da rama `master`. Desta forma, vai parecer que eses dous recursos foron editados secuencialmente, cando a realidade é que se fixeron en paralelo.", + "", + "Imos lanzar o comando `git rebase`" + ], + "afterMarkdowns": [ + "¡Buah chorvo! Agora o traballo da nosa rama `bugFix` está seguida de master, e temos unha fermosa línea de commits.", + "", + "Percibe que o commit `C3` aínda existe nalgún lugar (el está borrado na árbore), e que `C3'` é a \"copia\" que rebasamos en master.", + "", + "O único problema é que a rama master non foi actualizada tamén, ímolo facer agora..." + ], + "command": "git rebase master", + "beforeCommand": "git commit; git checkout -b bugFix C1; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Agora a rama `master` está ativa. Continuamos facendo o rebase na `bugFix`..." + ], + "afterMarkdowns": [ + "¡Xa está! Como `master` era um ancestro de `bugFix`, git simplemente moveu a referencia da rama `master` máis adiante na historia." + ], + "command": "git rebase bugFix", + "beforeCommand": "git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, fai o seguinte", + "", + "* Fai checkout de un novo branch chamado `bugFix`", + "* Fai un commit", + "* Regresa a master e fai un commit novamente", + "* Móvete á rama bugFix outra vez e fai rebase sobre master", + "", + "Boa sorte!" + ] + } + } + ] + }, "fr_FR": { "childViews": [ { diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js index b0445568..0bef2010 100644 --- a/src/levels/mixed/describe.js +++ b/src/levels/mixed/describe.js @@ -9,6 +9,7 @@ exports.level = { "ja" : "Git Describe", "es_AR": "Git Describe", "pt_BR": "Git Describe", + "gl" : "Git Describe", "zh_TW": "git describe", "zh_CN": "Git Describe", "ru_RU": "Git describe", @@ -22,6 +23,7 @@ exports.level = { "ja" : "次に進む準備が整ったなら、bugFixに対して一回commitしてください", "es_AR": "Simplemente commiteá una vez en bugFix cuando estés listo para seguir", "pt_BR": "Simplesmente commite uma vez em bugFix quando quiser parar de experimentar", + "gl" : "Simplemente fai commit en bugFix cando estés listo para continuar.", "zh_TW": "當你要移動的時候,只要在 bugFix 上面 commit 就好了", "zh_CN": "当你准备好时,在 bugFix 分支上面提交一次就可以了", "ru_RU": "Когда закончишь, просто сделай commit", @@ -409,6 +411,69 @@ exports.level = { } ] }, + "gl" : { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Git Describe", + "", + "Como as tags fan a función de \"áncora\" no repositorio, Git ten un comando para *describir* ónde podes estar ti en relación á \"áncora\" (tag) máis próxima. Ese comando chámase `git describe`!", + "", + "Git describe pode axudar a recuperar a túa posición despois de mover moitos commits para atrás ou para adiante na historia; esto pode suceder depois de que fagas un git bisect (unha búsqueda para atopar erros) ou cando te sentas no ordenador dun colega que chegou das vacacións." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Git describe lánzase do seguinte xeito:", + "", + "`git describe `", + "", + "Onde `` é qualquera cousa que git poida resolver como unha referencia a un commit. Se non especificas a ref, git usará o commit actual no que se esté traballando (`HEAD`).", + "", + "A resposta do comando é algo semellante a esto:", + "", + "`__g`", + "", + "Onde `tag` é a tag anterior máis próxima na historia, `numCommits` é o número de commits de distancia ó tag, e `` é o hash do commit no que estamos." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Vexamos un exemplo rápido. Para a árbore de abaixo:" + ], + "afterMarkdowns": [ + "O comando `git describe master` daría a saída:", + "", + "`v1_2_gC2`", + "", + "Mentres que `git describe side` daría:", + "", + "`v2_1_gC4`" + ], + "command": "git tag v2 C3", + "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¡Básicamente é iso do que trata git describe! Intenta descubrir algúns locais da árbore para sentir como se comporta o comando.", + "", + "Cando estés listo, fai un commit para que o nivel remate. Esa é a gracia." + ] + } + } + ] + }, "de_DE": { "childViews": [ { diff --git a/src/levels/mixed/grabbingOneCommit.js b/src/levels/mixed/grabbingOneCommit.js index 898cf581..42e748d3 100644 --- a/src/levels/mixed/grabbingOneCommit.js +++ b/src/levels/mixed/grabbingOneCommit.js @@ -20,6 +20,7 @@ exports.level = { "de_DE": "Einen Commit pflücken", "es_AR": "Tomando un único commit", "pt_BR": "Pegando um único commit", + "gl" : "Escollendo un único commit", "ja": "一つのコミットのみを取得", "zh_CN": "只取一个提交记录", "zh_TW": "只取一個 commit", @@ -32,6 +33,7 @@ exports.level = { "fr_FR": "Souvenez-vous, les rebases interactifs ou cherry-pick sont vos amis ici.", "es_AR": "Acordate, el rebase interactivo o cherry-pick son tus amigos acá", "pt_BR": "Lembre-se, o rebase interativo ou o cherry-pick são seus amigos aqui", + "gl" : "Recorda, o rebase interativo ou cherry-pick é un dos teus colegas aquí", "ja": "このレベルではインタラクティブモードのrebaseやcherry-pickがクリアのカギです", "ko": "대화식 리베이스(rebase -i)나 or 체리픽(cherry-pick)을 사용하세요", "zh_CN": "你有两个朋友,cherry-pick 和 rebase -i", @@ -194,6 +196,45 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Commits apilados localmente", + "", + "Aquí estamos nunha situación que acontece de cotio con desenvolvedores: Estou intentando atopar un erro, mais é escorredizo. Para axudar ó meu traballo de detective, eu coloco algúns comandos de debug e prints.", + "", + "¡Todos esos comandos de debug e mensaxes están nas súas ramas propias. Finalmente eu atopo o erro, arránxoo e reorganizo!", + "", + "O único problema é que agora eu preciso devolver o meu `bugFix` á rama `master`. Se eu fixera simplemente un fast-forward en `master`, entón o `master` rematará contendo tódolos comandos de debug, o que é indesexable. Debe existir algunha outra forma..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Precisamos decirlle a git que copie só os commits que nos interesa. Esta situación é exatamente a mesma dos niveis anteriores respecto de como mover o traballo -- podemos usar os mesmos comandos:", + "", + "* `git rebase -i`", + "* `git cherry-pick`", + "", + "Para acadar o objetivo." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Este é un nivel avanzado, entón imos deixarche a decisión de qué comando empregar, pero para completar este nivel, asegurate de que a rama `master` colla o commit referenciado por `bugFix`." + ] + } + } + ] + }, "de_DE": { "childViews": [ { diff --git a/src/levels/mixed/jugglingCommits.js b/src/levels/mixed/jugglingCommits.js index 7b2d2533..747a518e 100644 --- a/src/levels/mixed/jugglingCommits.js +++ b/src/levels/mixed/jugglingCommits.js @@ -24,6 +24,7 @@ exports.level = { "fr_FR": "Jongler avec les commits", "es_AR": "Haciendo malabares con los commits", "pt_BR": "Malabarismo com commits", + "gl" : "Argallando cos commits", "ja": "コミットをやりくりする", "zh_CN": "提交的技巧 #1", "zh_TW": "commit 的戲法", @@ -36,6 +37,7 @@ exports.level = { "fr_FR": "La première commande est git rebase -i HEAD~2", "es_AR": "El primer comando es git rebase -i HEAD~2", "pt_BR": "O primeiro comando é git rebase -i HEAD~2", + "gl" : "O primeiro comando é git rebase -i HEAD~2", "ja": "最初に打つコマンドはgit rebase -i HEAD~2", "ko": "첫번째 명령은 git rebase -i HEAD~2 입니다", "zh_CN": "第一个命令是 `git rebase -i HEAD~2`", @@ -183,6 +185,41 @@ exports.level = { }, ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Argallando cos commits", + "", + "Aquí está outra situación que acontece con bastante frecuencia. Estás facendo algúns cambios (`newImage`), separado do resto de cambios (`caption`) que están relacionados, deste xeito están apilados un enriba do outro no teu repositorio.", + "", + "O complicado é que ás veces, poida que precises facer unha pequena nota nun commit máis antigo. Neste caso, a persoa de deseño quere mudar un pouco as dimensións da imaxe introducida en `newImage`, a pesar de que ese commit está máis abaixo no noso histórico!!" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Superamos este problema facendo o seguinte:", + "", + "* Reordenaremos os commits seleccionando aqueles que desexamos que estén no cambio, con `git rebase -i`", + "* Empregaremos o comando `git commit --amend` para facer unha pequena modificación", + "* Imos, entón, reordear os commits na mesma orde na que estaban anteriormente con `git rebase -i`", + "* Finalmente, moveremos o master para esa parte atualizada da árbore e así finalizar o nivel (usando o método que máis che pete)", + "", + "Hai moitas formas de obter o obxectivo final (eu vexo o cherry-pick pasando pola túa cachola), e verémolo máis adiante, pero agora ímonos centrar nesta técnica.", + "", + "Por último, preste atención no estado do \"objectivo\" aquí -- como movemos os commits dúas veces, ambos teñen o apóstrofo sumado. O apóstrofo engádese polo commit que nos correximos (amend), o cal danos a forma final da árbore.", + "", + "Contado todo esto, a resposta valídase baseándose na estructura e nos diferentes apóstrofes. Cando a rama `master` teña a mesma estructura, e o número de apóstrofos sexa igual, obterás todos os puntos da tarefa." + ] + } + }, + ] + }, "de_DE": { "childViews": [ { diff --git a/src/levels/mixed/jugglingCommits2.js b/src/levels/mixed/jugglingCommits2.js index 067a0ab1..29a97a31 100644 --- a/src/levels/mixed/jugglingCommits2.js +++ b/src/levels/mixed/jugglingCommits2.js @@ -22,6 +22,7 @@ exports.level = { "fr_FR": "Jongler avec les commits #2", "es_AR": "Haciendo malabares con los commits #2", "pt_BR": "Malabarismo com commits #2", + "gl" : "Argallando cos commits #2", "de_DE": "Jonglieren mit Commits Teil 2", "ja": "コミットをやりくりする その2", "zh_CN": "提交的技巧 #2", @@ -34,6 +35,7 @@ exports.level = { "fr_FR": "N'oubliez pas d'appliquer les changements depuis la branche master", "es_AR": "¡No te olvides de avanzar master a los cambios actualizados!", "pt_BR": "Não se esqueça de avançar a referência do master para as mudanças efetuadas!", + "gl" : "¡Non te esquezas de avanzar master ós cambios actualizados!", "de_DE": "Vergiss nicht den master auf die aktuelle Version vorzuspulen", "ja": "masterのポインタを先に進めることを忘れずに!", "ko": "master를 변경 완료한 커밋으로 이동(forward)시키는 것을 잊지 마세요!", @@ -215,6 +217,49 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Argallando cos commits #2", + "", + "*No caso de non ter rematado o tema anterior (Argallando cos commits #1), por favor faino antes de continuar*.", + "", + "Como puideches ver no anterior tema, usamos `rebase -i` para reordear os commits. Unha vez que atopamos o commit que queriamos modificar, puidemos empregar sinxelamente o `--amend`, e depois reordenalo de volta para obter a nosa orde preferida.", + "", + "O único problema aquí é que hai moita reordenación ocorrendo, o que pode introducir conflitos no rebase. Imos votar unha ollada a outro método, o uso de `git cherry-pick`" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Lembra que `git cherry-pick` copiará un commit de qualquera lugar na árbore enriba do HEAD (sempre e cando non sexa ancestro do HEAD).", + "", + "Aquí está unha demostración para que refresques a memoria:" + ], + "afterMarkdowns": [ + "¡A tope! Seguimos." + ], + "command": "git cherry-pick C2", + "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Entón, neste nivel, imos completar o mesmo obxectivo que facendo \"amend\" no `C2`, pero evitando facer o `rebase -i`. Agora deixámoste que lle des os miolos para sacar o exercicio! :D", + "", + "Recorda, o número exacto de apóstrofos (') nos commits non é importante, só as diferencias relativas. Por exemplo, levarás todos os puntos desta tarefa se obtés o mesmo resultado da árbore que se mostra na visualización do exercicio con un apóstrofo extra en tódolos commits." + ] + } + } + ] + }, "de_DE": { "childViews": [ { diff --git a/src/levels/mixed/tags.js b/src/levels/mixed/tags.js index a52c5ea7..2d7c1b45 100644 --- a/src/levels/mixed/tags.js +++ b/src/levels/mixed/tags.js @@ -8,6 +8,7 @@ "ja" : "Gitのタグ", "es_AR": "Tags en git", "pt_BR": "Tags no Git", + "gl" : "Etiquetas en git", "fr_FR": "Git Tags", "zh_CN": "Git Tag", "zh_TW": "git tag", @@ -22,6 +23,7 @@ "ja" : "コミットを直接チェックアウトできますが、簡単にタグでチェックアウトすることも可能!", "es_AR": "Podés checkoutear directamente el commit, ¡o simplemente el tag!", "pt_BR": "Você pode fazer checkout diretamente no commit ou na tag correspondente!", + "gl" : "Podes saltar directamente ó commit, ¡ou a etiqueta, que é máis doado!", "zh_TW": "你可以直接 checkout 到 commit 上,或是簡單的 checkout 到 tag 上", "zh_CN": "你可以直接 checkout 到 commit 上,或是简单地 checkout 到 tag 上", "ru_RU": "Можно сделать checkout напрямую на коммит или же на тег", @@ -341,6 +343,58 @@ } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Etiquetas en Git", + "", + "Como aprendiches nas leccións previas, as ramas pódense mover sinxelamente, e xeralmente refírense a distintos commits según vas completando o código. As ramas mutan con facilidade, soen ser temporais, e sempre cambiantes.", + "", + "Se estamos nese caso, podes preguntarte se existe unha forma de marcar *permanentemente* puntos históricos no proxecto. Para cousas como grandes entregas ou grandes merges, ¿existe algunha forma de marcar commits con algo máis permanente que unha rama?", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Acertaches seguro, ¡si que existe! As etiquetas de git foron creadas para ese propósito -- elas marcan de forma (relativamente) permanente algún commits coma se fosen \"marcos das fincas\" (\"milestones\") nun campeiro, e podes facer referencias a elas mellor que o catastro.", + "", + "É moi importante saber que, as etiquetas non avanzan cando se crean novos commits. Non podes facer \"checkout\" nun tag e completar o traballo de esa etiqueta cun commit amend ou rebasándoo -- as etiquetas existen como áncoras na árbore de commits que están pegadas a certos puntos.", + "", + "Vexamos como se comportan as etiquetas na práctica." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Creamos un tag na rama `C1`, que é o noso prototipo da versión 1" + ], + "afterMarkdowns": [ + "¡Ahí o tes!. Sinxelo. Nomeamos a etiqueta de `v1` e referenciamos o commit `C1` explícitamente. Se non indicas o commit, git vai empregar o commit onde está situado o `HEAD`." + ], + "command": "git tag v1 C1", + "beforeCommand": "git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar esta tarefa, crea as etiquetas amosadas na visualización do obxectivo, e entón fai checkout en `v1`. Mira que terminas no estado \"Detached HEAD\" -- eso é porque non podes facer commit directamente na etiqueta `v1`.", + "", + "No próximo nivel, examinaremos un caso de uso máis interesante para as etiquetas." + ] + } + } + ] + }, "de_DE": { "childViews": [ { diff --git a/src/levels/rampup/cherryPick.js b/src/levels/rampup/cherryPick.js index 8908112e..4f1ba889 100644 --- a/src/levels/rampup/cherryPick.js +++ b/src/levels/rampup/cherryPick.js @@ -13,6 +13,7 @@ "ja" : "cherry-pick入門", "es_AR": "Introducción a cherry-pick", "pt_BR": "Introdução ao cherry-pick", + "gl" : "Introuducción a cherry-pick", "zh_CN": "Git Cherry-pick", "zh_TW": "介紹 cherry-pick", "ru_RU": "Введение в Cherry-pick", @@ -26,6 +27,7 @@ "ja" : "git cherry-pickの後にコミット名を追加", "es_AR": "git cherry-pick seguido de los nombres de los commits", "pt_BR": "git cherry-pick seguido dos nomes dos commits", + "gl" : "git cherry-pick seguido das referencias a commits", "zh_CN": "git cherry-pick 后面要跟提交的名字", "zh_TW": "git cherry-pick 後面要接著 commit 的名稱", "ru_RU": "git cherry-pick основывается на именах коммитов!", @@ -171,7 +173,7 @@ "", "El primer comando en esta serie se llama `git cherry-pick`. Tiene la siguiente forma:", "", - "* `git cherry-pick <...>`", + " `git cherry-pick <...>`", "", "Es una manera bastante directa de decir que querés copiar una serie de commits sobre tu ubicación actual (`HEAD`). Personalmente amo `cherry-pick` porque hay muy poca magia involucrada y es bastante simple de entender.", "", @@ -210,7 +212,7 @@ "type": "ModalAlert", "options": { "markdowns": [ - "## Movendo trabalho por aí", + "## Movendo o trabalho por aí", "", "Por enquanto nós abordamos o básico do Git -- commitar, criar ramos, e mover-se pela árvore. Apenas esses conceitos já são suficientes para utilizar 90% do poder dos repositórios Git, e cobrem as principais necessidades dos desenvolvedores.", "", @@ -261,6 +263,63 @@ } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Movendo traballo por ahí", + "", + "Ata agora cubrimos o uso básico de git -- facer commit, crear ramas, e moverse pola árbore. Estes conceptos chegan para aproveitar o 90% do poder dos repositorios de git e cubrilas necesidades principais dos desenvolvedores.", + "", + "O 10% restante, ademáis, poden ser extremadamente útiles nos fluxos de traballo complexos (ou cando te meteches nalgún problema complicado). O próximo concepto que imos abordar é \"movendo o traballo por ahí\" -- noutras verbas, unha forma que teñen os desenvolvedores de dicir \"eu quero este traballo aquí, e aquel alí\" de forma precisa, elocuente e flexible.", + "", + "Eso pode ser moito, pero os conceptos son simples." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Cherry-pick", + "", + "O primeiro comando desta serie é `git cherry-pick`. O comando emprégase da seguinte forma:", + "", + "* `git cherry-pick <...>`", + "", + "Trátase dunha forma bastante directa de dicir que queres copiar unha serie de commits sobre a túa ubicación actual (`HEAD`). Eu persoalmente adoro `cherry-pick` porque hai moita maxia envolta e é un funcionamento sinxelo de entender.", + "", + "Vexamos unha demostración!", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Aquí está un repositorio onde hai algún traballo na rama `side` que desexamos copiar para a rama `master`. Iso podería ser obtido por medio dun rebase (que xa aprendemos), pero imos ver como o resolve cherry-pick." + ], + "afterMarkdowns": [ + "¡Eso é! Queríamos os commits `C2` e `C4` e git insertounos por baixo de nós. ¡Moi sinxelo!" + ], + "command": "git cherry-pick C2 C4", + "beforeCommand": "git checkout -b side; git commit; git commit; git commit; git checkout master; git commit;" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, copia algo de traballo das outras ramas na master. Podes ver qué commits queremos copiar na visualización do obxectivo.", + "" + ] + } + } + ] + }, "zh_TW": { "childViews": [ { diff --git a/src/levels/rampup/detachedHead.js b/src/levels/rampup/detachedHead.js index 62b9200a..498c55bd 100644 --- a/src/levels/rampup/detachedHead.js +++ b/src/levels/rampup/detachedHead.js @@ -6,6 +6,7 @@ exports.level = { "en_US": "Detach yo' HEAD", "es_AR": "Desatacheá tu HEAD", "pt_BR": "Solte a sua cabeça", + "gl" : "Abandona o teu HEAD", "fr_FR": "Détacher votre HEAD", "zh_CN": "分离 HEAD", "zh_TW": "分離 HEAD", @@ -19,6 +20,7 @@ exports.level = { "en_US": "Use the label (hash) on the commit for help!", "es_AR": "¡Usá la etiqueta (hash) sobre el commit para ayudarte!", "pt_BR": "Use o identificador (hash) sobre o commit para te ajudar!", + "gl" : "¡Usa a etiqueta (hash) sobre o commit para axudarte!", "de_DE": "Benutze den Bezeichner (den Hash) des Commits.", "ja" : "コミットのラベル(hash)を使用", "fr_FR": "Utilisez le label (identifiant) du commit pour aider !", @@ -263,6 +265,84 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Movéndose en Git", + "", + "Antes de seguir con algunhas das funcionalidades máis avanzadas de Git, é importante entender as diferentes formas de se mover a través da árbore de commits que representa o teu proxecto.", + "", + "¡Unha vez que te sintas ben ó teu redor, os teus poderes empregando outros comandos de git serán amplificados!", + "", + "", + "", + "", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## HEAD", + "", + "Primeiro temos que falar sobre o \"commit actual\" (\"HEAD\"). HEAD é un nome simbólico para o commit atualmente ativo (o último checkout que se fixo) -- é esencialmente o commit sobre o cal estás traballando nese momento.", + "", + "O HEAD sempre apunta para o commit máis recentemente copiado sobre a árbore de traballo (arquivos do proxecto). A maioría dos comandos de git que fan algún cambio sobre a árbore de traballo empezarán movendo o HEAD.", + "", + "Normalmente o HEAD apunta para o nome dunha rama (por exemplo, bugFix). Quando fagas commit, o status do bugFix é alterado e ese cambio ocorre tamén sobre o HEAD." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Vexamos isto en acción. Aquí imos mostrar o HEAD antes e depois dun commit." + ], + "afterMarkdowns": [ + "Ves! O HEAD estivo ó lado do noso `master` todo este tempo." + ], + "command": "git checkout C1; git checkout master; git commit; git checkout C2", + "beforeCommand": "" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "### Soltando a cabeza", + "", + "Soltar o HEAD significa apuntar a un commit en vez de apuntar a unha rama. Antes do estado solo (\"detached\"), é así como aparece:", + "", + "HEAD -> master -> C1", + "" + ], + "afterMarkdowns": [ + "E agora é", + "", + "HEAD -> C1" + ], + "command": "git checkout C1", + "beforeCommand": "" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, imos soltar o HEAD de `bugFix` e en vez diso apuntamos ó commit.", + "", + "Especifica o commit por medio do hash correspondente. O hash de cada commit está dentro do círculo que representa ó commit (a letra C seguida dun número)." + ] + } + } + ] + }, "fr_FR": { "childViews": [ { diff --git a/src/levels/rampup/interactiveRebase.js b/src/levels/rampup/interactiveRebase.js index d4f79450..54ade7fb 100644 --- a/src/levels/rampup/interactiveRebase.js +++ b/src/levels/rampup/interactiveRebase.js @@ -10,6 +10,7 @@ "en_US": "you can use either branches or relative refs (HEAD~) to specify the rebase target", "es_AR": "podés usar tanto ramas como referencias relativas (HEAD~) para especificar el objetivo del rebase", "pt_BR": "Você pode usar ou ramos ou referências relativas (HEAD~) para especificar o alvo do rebase", + "gl" : "Podes usar ramas ou referencias relativas (HEAD~) para especificar o obxectivo do rebase", "de_DE": "Du kannst entweder Branches oder relative Ref-Angaben (z.B. HEAD~) benutzen, um das Ziel des Rebase anzugeben.", "fr_FR": "Vous pouvez utiliser soit les branches, soit les références relatives (HEAD~) pour spécifier la cible à rebaser", "zh_CN": "branch 或者是相对位置(HEAD~)都可以用來指定 rebase 的目标", @@ -23,6 +24,7 @@ "en_US": "Interactive Rebase Intro", "es_AR": "Introducción al rebase interactivo", "pt_BR": "Introdução ao rebase interativo", + "gl" : "Introducción ó rebase interativo", "de_DE": "Einführung Interactive Rebase", "ja" : "インタラクティブrebase入門", "fr_FR": "Introduction à rebase", @@ -423,6 +425,71 @@ } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Rebase Interativo en Git", + "", + "Empregar cherry-pick é xenial cando coñeces qué commits queres (_e_ coñeces os seus códigos hash) -- é difícil mellorar a súa simplicidade.", + "", + "Pero ¿qué pasa cando non sabes qué commits son os que queres? Por sorte, ¡git cúbrete nesta situación tamén! Podemos empregar o rebase interactivo para esto -- é a mellor forma de revisar unha serie de commits que estás a rebasar.", + "", + "Mergullémonos nos detalles..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "O rebase interativo é o comando `rebase` coa opción `-i`.", + "", + "Se ti inclúes esta opción, o git abrirá unha interfaz para mostrar qué commits están hábiles para ser copiados sobre o obxectivo do rebase. Tamén amosa os seus códigos hash e mensaxes dos commits, o cal axuda moito para saber qué é cada commit.", + "", + "En git \"de verdade\", a interfaz significa abrir un arquivo de texto nun editor (por exemplo `vim`). Para os nosos propósitos, aquí aparecerá unha pequena ventá que se comporta do mesmo xeito." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Cando a xanela de rebase interativo abra, poderás facer 3 cousas distintas:", + "", + "* Podes reordenar os commits simplemente cambiando a súa orde na interface (na nosa ventá significa arrastrar e soltar os commits).", + "* Podes escoller a opción de omitir algúns commits. Para iso, pincha no botón `pick` -- deixar o `pick` desligado significa que queres descartar o commit.", + "* Ademáis, ti podes \"esmagar\" (fazer squash) nos commits. Tristemente, este tutorial non será capaz de cubrir esa funcionalidade por algúns motivos loxísticos, entón imos pulir algúns detalles ó respecto. Resumindo, o squash permite combinar commits.", + "", + "¡Xenial! Vexamos un exemplo." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Cando pinches o botón, unha ventá de rebase interativo abrirase. Reordena algúns commits da forma que ti prefieras (ou se o prefires desmarca o `pick` de algúns) e mira o seu resultado!" + ], + "afterMarkdowns": [ + "¡Veña! Git copiou algúns commits exatamente da mesma forma que o indicaches na ventá" + ], + "command": "git rebase -i HEAD~4 --aboveAll", + "beforeCommand": "git commit; git commit; git commit; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para finalizar este nivel, fai un rebase interativo e obteñaa a orde amosada na visualización do obxectivo. Lembra que podes usar os comandos `undo` ou `reset` para correxir erros :D" + ] + } + } + ] + }, "de_DE": { "childViews": [ { diff --git a/src/levels/rampup/relativeRefs.js b/src/levels/rampup/relativeRefs.js index 2fd6e3f1..b008011b 100644 --- a/src/levels/rampup/relativeRefs.js +++ b/src/levels/rampup/relativeRefs.js @@ -10,6 +10,7 @@ exports.level = { "zh_TW": "相對引用(^)", "es_AR": "Referencias relativas (^)", "pt_BR": "Referências relativas (^)", + "gl" : "Referencias relativas (^)", "de_DE": "Relative Referenzen (^)", "ru_RU": "Относительные ссылки (^)", "ko" : "상대 참조 (^) (Relative Refs)", @@ -22,6 +23,7 @@ exports.level = { "de_DE": "Denk an den Dach-Operator (^)!", "es_AR": "¡No te olvides del operador ^!", "pt_BR": "Não se esqueça do operador circunflexo (^)", + "gl" : "Non se esqueza do operador circunflexo (^)", "zh_CN": "记住操作符(^)!", "zh_TW": "不要忘記插入(^)符號!", "ru_RU": "Не забудь оператор `^`", @@ -404,6 +406,81 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Referencias relativas", + "", + "Moverse por a árbore de git usando os códigos hash dos commits pode volverse un pouco tedioso. Neste mundo real non vas ter unha visualización dos commits tan bonita no terminal, así que vas ter que usar `git log` para ver cada código hash.", + "", + "Inda peor, os códigos hash són xeralmente moito máis grandes no mundo real. Por exemplo, o hash do commit que introduxemos no nivel anterior é `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Non é algo sinxelo de lembrar.", + "", + "O bo é que git aínda afina cos hashes. El só precisa que expecifiques a cantidade mínima de caracteres suficientes para identificar unívocamente ó commit. Entón eu podo escribir `fed2` e non o hash completo." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Como xa dixemos, indicar os commits polo seu código hash non é a forma máis convinte, e é por eso que git ten referencias relativas. ¡Son a caña!", + "", + "Cas referencias relativas, podes comezar por un punto sinxelo de lembrar (como a rama `bugFix` ou o `HEAD`) e referenciar a partir de ahí.", + "", + "Os commits relativos son poderosos, pero agora imos presentar só dous formas sinxelas:", + "", + "* Moverse un commit por riba con `^`", + "* Mover unha cantidade de commits atrás con `~`" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Votémoslle unha ollada o operador (^) primeiro. Cada vez que o engadimos a unha referencia, estaslle dicindo a commit que queres o pai de esa referencia.", + "", + "Entón, dicir `master^` é equivalente a \"o primeiro pai do `master`\".", + "", + "`master^^` é o avó (ancestral de segunda xeración) do `master`", + "", + "Imos facer checkout do commit que está enriba de master" + ], + "afterMarkdowns": [ + "Boom! Ahí o tes. Moito máis rápido que por o hash do commit" + ], + "command": "git checkout master^", + "beforeCommand": "git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Tamén podes usar o `HEAD` como parte dunha referencia relativa. Ímolo utilizar para nos mover uns commits cara arriba na árbore." + ], + "afterMarkdowns": [ + "¡Chupado! Podemos viaxar cara atrás no tempo con `HEAD^`" + ], + "command": "git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^", + "beforeCommand": "git commit; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, fai checkout do commit pai de `bugFix`. Iso soltará o `HEAD`.", + "", + "¡Podes indicar o hash que queiras, pero intenta empregar as referencias relativas, é moito mellor!" + ] + } + } + ] + }, "zh_CN": { "childViews": [ { diff --git a/src/levels/rampup/relativeRefs2.js b/src/levels/rampup/relativeRefs2.js index 03acaf62..4d269a8c 100644 --- a/src/levels/rampup/relativeRefs2.js +++ b/src/levels/rampup/relativeRefs2.js @@ -9,6 +9,7 @@ exports.level = { "zh_TW": "這一關至少要用到一次直接參考(hash)", "es_AR": "Vas a necesitar usar al menos una referencia directa (hash) para completar este nivel", "pt_BR": "Você precisará usar pelo menos uma referência direta (hash) para completar este nível", + "gl" : "Precisarás usar polo menos unha referencia directa (hash) para completar este nivel", "de_DE": "Du musst mindestens einen Hash benutzen, um dieses Level zu schaffen", "ja" : "このレベルをクリアするには少なくとも一つの直接リファレンス(hash)を使用する必要があります", "ru_RU": "Понадобится использовать как минимум одну прямую ссылку (хеш), чтобы пройти этот уровень", @@ -21,6 +22,7 @@ exports.level = { "ja" : "相対リファレンス その2 (~)", "es_AR": "Referencias relativas #2 (~)", "pt_BR": "Referências relativas #2 (~)", + "gl" : "Referencias relativas #2 (~)", "fr_FR": "Références relatives #2 (~)", "zh_CN": "相对引用2(~)", "zh_TW": "相對引用二(~)", @@ -236,6 +238,75 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### O operador \"~\"", + "", + "Digamos que queres moverte un montón de commits cara atrás nunha árbore de git. Sería moi tedioso escribir `^` moitas veces, e por iso que git tamén ten o operador (`~`).", + "", + "", + "Pódeselle pasar un número (opcionalmente) despois da tilde, especificando o número de commits que se quere mover cara atrás. Mira como é en acción." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Imos especificar un número de commits cara atrás con `~`." + ], + "afterMarkdowns": [ + "¡Veeeña! Ben apuntado -- as referencias relativas son a leche." + ], + "command": "git checkout HEAD~4", + "beforeCommand": "git commit; git commit; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Forzando as ramas", + "", + "Agora que eres un especialista en referencias relativas, imos *usalas* para algunha cousiña.", + "", + "Un dos usos máis comúns para o uso das referencias relativas é para movelas ramas de lugar. Ti podes reasignar directamente unha rama a un commit usando a opción `-f`. Así que con algo coma:", + "", + "`git branch -f master HEAD~3`", + "", + "Move (de forma forzosa) a rama master 3 commits enriba do HEAD." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Vexamos o comando anterior en acción" + ], + "afterMarkdowns": [ + "¡Agora é o a nosa quenda! As referencias relativas nos darán unha forma concisa de nos referír a `C1`, e forzar a rama (con `-f`) deunos unha forma rápida de movela rama `master` a esa posición." + ], + "command": "git branch -f master HEAD~3", + "beforeCommand": "git commit; git commit; git commit; git checkout -b bugFix" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Xa viches as referencias relativas e o movemento de ramas combinadas, ímolas usar para resolver o próximo exercicio.", + "", + "Para completar este nivel, mova o `HEAD` e as ramas `master` e `bugFix` para os destinos mostrados no obxectivo." + ] + } + } + ] + }, "fr_FR": { "childViews": [ { diff --git a/src/levels/rampup/reversingChanges.js b/src/levels/rampup/reversingChanges.js index 2746c8ed..b1c8f926 100644 --- a/src/levels/rampup/reversingChanges.js +++ b/src/levels/rampup/reversingChanges.js @@ -10,7 +10,8 @@ exports.level = { "fr_FR": "Annuler des changements avec Git", "es_AR": "Revirtiendo cambios en git", "pt_BR": "Revertendo mudanças no Git", - "ko": "Git에서 작업 되돌리기", + "gl" : "Revertindo cambios en git", + "ko" : "Git에서 작업 되돌리기", "zh_CN": "撤销变更", "zh_TW": "在 git 中取消修改 ", "ru_RU": "Отмена изменений в Git", @@ -22,6 +23,7 @@ exports.level = { "fr_FR": "Notez que `revert` et `reset` n'ont pas les mêmes arguments.", "es_AR": "Notá que revert y reset toman parámetros distintos", "pt_BR": "Lembre que revert e reset recebem parâmetros diferentes", + "gl" : "Lembra que revert e reset usan parámetros distintos", "zh_CN": "注意 revert 和 reset 使用的参数不同。", "zh_TW": "注意 revert 和 reset 使用不同的參數。", "ko": "revert와 reset이 받는 인자가 다름을 기억하세요", @@ -219,6 +221,69 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Revertindo cambios en Git", + "", + "Existen varias formas de revertir os cambios en git. E, como cando se fai commit, desfacer cambios supon unha operación de baixo nivel (a indexación de arquivos ou trozos de eles) e unha operación de alto nivel (desfacer os cambios xa aplicados). Aquí ímonos enfocar neste último punto.", + "", + "Hai dúas formas de desfacer os cambios en git -- unha delas é `git reset`, e a outra é usando `git revert`. Imos comparalas na próxima ventá.", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "## Git Reset", + "", + "O comando `git reset` desfai os cambios movendo a referencia dunha rama cara un commit máis antigo na rama. Desta forma, podes pensar nesta operación como \"reescritura do histórico\"; o `git reset` vai movela rama cara atrás, como se ós commits nunca antes se fixeran.", + "", + "Vexamos o seu funcionamento:" + ], + "afterMarkdowns": [ + "¡Bye bye! Git moveu a referencia da rama master cara atrás, ata o commit `C1`; agora o teu repositorio local está coma se o commit `C2` nunca acontecera." + ], + "command": "git reset HEAD~1", + "beforeCommand": "git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "## Git Revert", + "", + "Mentres que resetear os cambios funciona xenial para as ramas locales na túa máquina, o método utilizado de \"reescribir o histórico\" non funciona con ramas remotas que outra xente usa.", + "", + "Para revervir os cambios e *compartir* eses cambios ca outra xente, precisamos usar `git revert`. Atende a cómo funciona" + ], + "afterMarkdowns": [ + "Estrano, xurdíu un novo commit por baixo do commit que queriamos desfacer. Iso é porque o novo commit `C2'` engadíu *cambios* -- o que pasa é que o commit desfai exactamente os cambios feitos no commit `C2`.", + "", + "Con `revert`, ti podes facer `push` dos teus cambios para compartilos cos outros." + ], + "command": "git revert HEAD", + "beforeCommand": "git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, reverte os dous commits máis recentes tanto en `local` como en `pushed`.", + "", + "Ten en mente que `pushed` é unha rama remota, e `local` é unha rama local -- Iso poida que te axude a aplicar o método apropriado." + ] + } + } + ] + }, "de_DE": { "childViews": [ { diff --git a/src/levels/rebase/manyRebases.js b/src/levels/rebase/manyRebases.js index dd99b175..6da53c7b 100644 --- a/src/levels/rebase/manyRebases.js +++ b/src/levels/rebase/manyRebases.js @@ -12,6 +12,7 @@ exports.level = { "de_DE": "10000 Rebases unter dem `HEAD`", "es_AR": "Rebaseando más de 9000 veces", "pt_BR": "Fazendo mais de 9000 rebases", + "gl" : "Facendo máis de 9000 rebases", "fr_FR": "Rebaser plus de 1000 fois", "ko": "9천번이 넘는 리베이스", "ja" : "9000回以上のrebase", @@ -25,6 +26,7 @@ exports.level = { "de_DE": "Nicht vergessen: die effizienteste Möglichkeit könnte sein, schließlich einfach nur den master zu aktualisieren ...", "es_AR": "Acordate, la manera más eficiente podría ser actualizar master sólo al final...", "pt_BR": "Lembre-se, a forma mais eficiente pode ser atualizar o master por último...", + "gl" : "Lembra, a forma máis eficiente pode ser actualizar a rama master ó final...", "fr_FR": "Rappelez-vous, la façon la plus efficace peut être de mettre à jour master seulement à la fin ...", "ja" : "最も効率的なやり方はmasterを最後に更新するだけかもしれない・・・", "ko": "아마도 master를 마지막에 업데이트하는 것이 가장 효율적인 방법일 것입니다...", @@ -88,6 +90,24 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Fazendo rebase en múltiples ramas", + "", + "Neno, temos unha chea de ramas aquí! Imos facer rebase de todo o traballo contido nesas ramas para a master.", + "", + "A xente de administración estanos a facer as cousas complicadas, igual eles queren que os commits estén todos en orde secuencial. Isto significa que a nosa árbore final precisa ter `C7'` de último, `C6'` inda por riba, está por adiante, todo ordeado.", + "", + "Se te fas un lio polo camiño, síntete ceibe para usar o comando `reset` para comezar de cero outra vez. Despois lembra ollar a nosa solución para ver se consegues resolver a tarefa usando menos comandos!" + ] + } + } + ] + }, "fr_FR": { "childViews": [ { diff --git a/src/levels/rebase/selectiveRebase.js b/src/levels/rebase/selectiveRebase.js index 328216d3..b38d3ddf 100644 --- a/src/levels/rebase/selectiveRebase.js +++ b/src/levels/rebase/selectiveRebase.js @@ -13,6 +13,7 @@ exports.level = { "de_DE": "Branch-Spaghetti", "es_AR": "Enslada de branches", "pt_BR": "Espaguete de ramos", + "gl" : "Espaguete de ramas", "ja": "ブランチスパゲッティ", "zh_CN": "纠缠不清的分支", "zh_TW": "branch 漿糊", @@ -25,6 +26,7 @@ exports.level = { "de_DE": "Stelle sicher, dass du alles in der richtigen Reihenfolge machst! Branche erst one, dann two, dann three.", "es_AR": "¡Asegurate de hacer las cosas en el orden correcto! Brancheá `one` primero, después `two`, y después `three`.", "pt_BR": "Certifique-se de fazer tudo na ordem correta! Crie o ramo `one` primeiro, depois `two`, depois `three`.", + "gl" : "¡Afiánzate de facer as cousas no orde correcto! Crea ramas `one` de primeiras, e logo `two` e `three`.", "ja": "全て正しい順番で処理すること!oneが最初で、次がtwo、最後にthreeを片付ける。", "ko": "이 문제를 해결하는 방법은 여러가지가 있습니다! 체리픽(cherry-pick)이 가장 쉽지만 오래걸리는 방법이고, 리베이스(rebase -i)가 빠른 방법입니다", "zh_CN": "确保你是按照正确的顺序来操作!先操作分支 `one`, 然后 `two`, 最后才是 `three`", @@ -113,6 +115,26 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Espaguete de ramas", + "", + "¡Íscalle lura! Temos un _pequeno_ obxectivo que acadar neste nivel.", + "", + "Temos aquí un `master` que está algúns commits por detrás das ramas `one`, `two` e `three`. Por algunha razón, precisamos atualizar esas tres ramas con versións modificadas dos últimos commits de master.", + "", + "A rama `one` precisa de unha reordenación, e votar fora a `C5`. O `two` precisa apenas de reordenacións. O `three` precisa dun único commit!", + "", + "Ímoste deixar resolver o problema por ti mesmo -- pero non deixes de ver a nosa solución, para eso escrebe `show solution`. " + ] + } + } + ] + }, "de_DE": { "childViews": [ { diff --git a/src/levels/remote/clone.js b/src/levels/remote/clone.js index 63ff1be4..5ef9ff65 100644 --- a/src/levels/remote/clone.js +++ b/src/levels/remote/clone.js @@ -8,6 +8,7 @@ exports.level = { "ja" : "Clone入門", "es_AR": "Introducción a clone", "pt_BR": "Introdução à clonagem", + "gl" : "Introducción a clone", "zh_CN": "Git Clone", "zh_TW": "介紹 clone", "ru_RU": "Введение в клонирование", @@ -22,6 +23,7 @@ exports.level = { "zh_CN": "只要 git clone 就可以了!", "es_AR": "Simplemente hacé git clone!", "pt_BR": "Basta fazer um git clone!", + "gl" : "¡Chega con facer git clone!", "zh_TW": "只要 git clone 就好了", "ru_RU": "Простой git clone!", "ko" : "그냥 git clone 하세요!", @@ -256,6 +258,63 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Repositorios remotos en Git", + "", + "Os repositorios remotos non son complicados en git. Actualmente ca computación na nube, pódese pensar que hai moita maxia tras os repositorios remotos de git, pero para nada é así -- en verdade son copias do repositorio, pero noutra máquina. Ti podes comunicarte xeralmente con esa outra máquina por medio de internet, o que permite que mandes commits de un repositorio cara o outro.", + "", + "Dito isto, os repositorios remotos teñen propiedades interesantes:", + "", + "- Primeiro e antes de todo, os repositorios remotos serven como unha copia de seguranza! Os repositorios locais posúen a habilidade de restaurar un arquivo nun estado anterior (como xa sabes), pero toda á información está gardada. Tendo copias do repositorio noutras máquinas, incluso poderías perder tódolos datos da túa computadora, e comenzar a traballar no punto onde o deixaches no último commit.", + "", + "- Máis importante aún, ¡os repositorios remotos fan que o desenvolvemento sexa social! Agora que existe unha copia do teu código noutro lugar, os teus amigos poden contribuír no teu proxecto (ou obter os últimos cambios) dunha forma moi simple.", + "", + "Hai webs moi populares onde se pode ver a actividade dos repositorios (como [Github](https://github.com/) ou [Phabricator](http://phabricator.org/)), pero estes recursos remotos _sempre_ axudan como mecanismo de base para esas ferramentas. ¡Entón é importante saber cómo funcionan!" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## O noso comando para crear remotos", + "", + "Ata este punto, Learn Git Branching enfocouse en ensinar o básico respecto do traballo en repositorios _locais_ (branch, merge, rebase, etc). Entretanto, agora que queremos aprender como os repositorios remotos funcionan, precisamos dun comando para configurar o entorno para esas leccións. Este comando será `git clone`.", + "", + "Técnicamente, `git clone` no mundo real é un comando que fai copias _locais_ de repositório remotos (de GitHub para a túa máquina, por exemplo). Todavía, por motivos loxísticos, nós usaremos ese comando dunha forma un pouco diferente, Learn Git Branching -- aquí `git clone` creará un repositorio remoto a partir do repositorio local. Certamente, ese comportamento é exactamente o oposto do comando real, pero a pesares de iso axudarate a formar unha conexión mental entre a clonación e como funcionan os repositorios remotos, entón imos usalo desa forma.", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Imos comenzar a modo, e só ollar cómo un repositorio remoto semellase á nosa visualización.", + "" + ], + "afterMarkdowns": [ + "¡Aquí o tes! Agora temos un respositorio remoto do noso proxecto. El é moi parecido exceto por algúns cambios visuais para ter a unha distinción visible -- nas tarefas a seguir veremos como compartir o traballo entre eses repositorios." + ], + "command": "git clone", + "beforeCommand": "" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, escribe o comando `git clone`. Aprenderás algo de verdade sóamente nas próximas leccións." + ] + } + } + ] + }, "zh_TW": { "childViews": [ { diff --git a/src/levels/remote/fakeTeamwork.js b/src/levels/remote/fakeTeamwork.js index 22d2b866..ca08387f 100644 --- a/src/levels/remote/fakeTeamwork.js +++ b/src/levels/remote/fakeTeamwork.js @@ -9,6 +9,7 @@ exports.level = { "ja" : "擬似的なチーム作業", "es_AR": "Simulando el trabajo en equipo", "pt_BR": "Simulando trabalho em equipe", + "gl" : "Simulando o traballo no repositorio", "zh_CN": "模拟团队合作", "zh_TW": "模擬團隊合作", "ru_RU": "Коллективная работа", @@ -22,6 +23,7 @@ exports.level = { "ja" : "擬似的に作成するコミット数を指定できるのをお忘れなく", "es_AR": "Acordate que podés especificar cuántos commits simular", "pt_BR": "Lembre-se que você pode especificar quantos commits quer simular", + "gl" : "Lembra que podes especifar cantos commits queres simular", "zh_CN": "记住你可以指定仿真提交的个数", "zh_TW": "你要記得指定要送多少個 commit 出去", "ru_RU": "помните, Вы можете указать количество фейковых коммитов", @@ -245,6 +247,60 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Simulando o traballo no repositorio", + "", + "Entón, hai algo con trampa aquí -- para algunhas das leccións seguintes, precisamos explicarche cómo baixar os cambios introducidos no repositorio remoto.", + "", + "Eso significa que escencialmente temos que \"finxir\" que o repositorio remoto foi actualizado por algún compañeiro, amigo ou incluso nalgunha rama específica a cantidade de commits feitos.", + "", + "Para acadar esto, introduxemos o ben chamado comando `git fakeTeamwork`! É bastante auto-explicativo: semella traballo dos nosos colegas. Vexamos una demo..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "O comportamento por defecto de `fakeTeamwork` é simplemente crear un commit en master na rama remota" + ], + "afterMarkdowns": [ + "Ahí o tes: a rama remota actualizouse cun novo commit, e aínda non nos baixamos ese commit porque inda non fixemos `git fetch`." + ], + "command": "git fakeTeamwork", + "beforeCommand": "git clone" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Tamén podes especificar a cantidad de commits ou a rama agregándoos ó comando" + ], + "afterMarkdowns": [ + "Cun único comando simulamos que un colega do equipo empurrou tres commits á rama `foo` do noso remoto" + ], + "command": "git fakeTeamwork foo 3", + "beforeCommand": "git branch foo; git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Os niveis seguintes van ser un pouco máis complicados, así que imos a esixirte un pouco máis neste nivel.", + "", + "Anímate e crea unha rama remota (con `git clone`), e simula algúns cambios no repositorio remoto, logo desto, fai commit do teu repo local, e logo descarga os cambios. ¡É coma varias leccións nunha soa!" + ] + } + } + ] + }, "zh_TW": { "childViews": [ { diff --git a/src/levels/remote/fetch.js b/src/levels/remote/fetch.js index 5501167b..29c94e80 100644 --- a/src/levels/remote/fetch.js +++ b/src/levels/remote/fetch.js @@ -9,6 +9,7 @@ exports.level = { "ja" : "Git Fetch", "es_AR": "git fetch", "pt_BR": "Git Fetch", + "gl" : "Git Fetch", "zh_CN": "Git Fetch", "zh_TW": "git fetch", "ru_RU": "Git fetch", @@ -22,6 +23,7 @@ exports.level = { "ja" : "単にgit fetchを実行!", "es_AR": "Simplemente ¡hacé git fetch!", "pt_BR": "Simplesmente chame git fetch!", + "gl" : "¡Sinxelamente fai git fetch!", "zh_CN": "只需要运行 git fetch 命令!", "zh_TW": "只要下 git fetch 指令", "ru_RU": "Просто выполните git fetch!", @@ -321,6 +323,79 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Fetch", + "", + "Traballar con respositorios remotos en Git, a fin de contas, resúmese en transferir datos _dun_ repositorio _cara_ outros repositorios. Dende que podemos enviar commits dun lado cara o outro, poderemos compartir calquera tipo de actualización que sexa xerada por git (e polo tanto compartir o traballo, novos arquivos, novas ideas, cartas de amor, etc).", + "", + "Nesta lección imos aprender como baixar os cambios _dun_ repositorio remoto -- o comando para iso é `git fetch`.", + "", + "Percibirás que conforme atualizamos a representación do repositorio remoto, as nosas ramas _remotas_ actualizaranse para reflexar a nova representación. Iso ten que ver co que vimos na lección anterior sobre as ramas remotas" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Ántes de entrar nos detalles de `git fetch`, vexámolo en acción! Aquí temos un repositorio remoto que contén dous commits que o noso repositorio local non ten." + ], + "afterMarkdowns": [ + "Alá imos! Os commits `C2` e `C3` baixáronse ó noso repositorio local, e a nosa rama `o/master` actualizouse para reflexar ese cambio." + ], + "command": "git fetch", + "beforeCommand": "git clone; git fakeTeamwork 2" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### O que fai o fetch", + "", + "`git fetch` fai dous pasos pasos principais, e soamente estes dous pasos princpipais. Son:", + "", + "* Baixa os commits que o repositório remoto contén pero non temos nos no noso repositoiro local, e...", + "* Actualiza a referencia nas ramas remotas (por exemplo, `o/master`) nas que se está apuntando", + "", + "`git fetch` esencialmente fai que a nosa representación _local_ do repositorio remoto se sincronice ca forma que posúe o repositorio remoto, _de feito_ parecese (nese momento).", + "", + "Se ti lembras a lección anterior, nos dixemos que as ramas remotas reflexan o estado dos repositorios remotos _dende a última vez_ na que ti fixeches un commit dese repositorio. O `git fetch` é a única forma de falar con eses repositorios remotos! Agardo que a conexión entre as ramas remotas e o `git fetch` esté clara dabondo agora.", + "", + "`git fetch` xeralmente fala co repositorio remoto por medio da rede (usando un protocolo como `http://`, `git://` ou `ssh`).", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### O que fetch NON fai", + "", + "`git fetch`, por agora, non cambia nada no estado _local_ do repositorio. El solo actualiza a rama `master` sen facer cambios na forma de cómo está o teu sistema de arquivos nese momento.", + "", + "É importante entender iso, xa que moitos desenvolvedores pensan que executar `git fetch` fará que o traballo local se vexa modificado polo repositorio remoto. El pode que baixara todos os cambios necesarios para facelo, pero, o comando _non_ cambia cómo están os teus arquivos locais. Imos aprender comandos para facer esas conexións :D", + "", + "A fin de contas, ti podes pensar en `git fetch` como unha descarga." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para rematar este nivel, so executa `git fetch` e baixa todos os commits!" + ] + } + } + ] + }, "zh_TW": { "childViews": [ { diff --git a/src/levels/remote/fetchArgs.js b/src/levels/remote/fetchArgs.js index 405329c1..efb61364 100644 --- a/src/levels/remote/fetchArgs.js +++ b/src/levels/remote/fetchArgs.js @@ -9,6 +9,7 @@ exports.level = { "zh_TW": "fetch 的參數", "es_AR": "Parámetros de fetch", "pt_BR": "Parâmetros do fetch", + "gl" : "Parámetros de fetch", "de_DE": "Optionen für Fetch", "ja" : "Fetchの引数", "ru_RU": "Аргументы для fetch", @@ -22,6 +23,7 @@ exports.level = { "zh_TW": "注意 commit 的 id 是怎麼被交換的!你可以透過 `help level` 來閱讀對話視窗!", "es_AR": "¡Prestá atención a cómo podrían haberse invertido los ids de los commits! Podés volver a leer toda la lección usando \"help level\"", "pt_BR": "Preste atenção em como os identificadores dos commits podem ter trocado! Você pode ler os slides novamente com \"help level\"", + "gl" : "Preste atención en como poderían invertirse os ids dos commits! Podes volver ler toda a lección usando \"help level\"", "de_DE": "Beachte wie die Commit IDs getauscht wurden! Du kannst den Einführungsdialog mit \"help level\" erneut anzeigen", "ja" : "コミットIDの入れ替わりに注意!スライドを復習するには`help level`を実行", "ru_RU": "Обратите внимание на то, как номера коммитов могут меняться! Вы можете прочесть слайды вновь, воспользовавшись командой \"help level\"", @@ -521,6 +523,129 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Parámetros de fetch", + "", + "Entonces, aprendido todo sobre os parámetros de push, este parámetro `` molón, e incluso as referencias separadas por dous puntos (`:`). ¿Poderemos empregar todo este coñecemento para `git fetch` tamén?", + "", + "¡Home claro! Os parámetros para `git fetch` son realmente *moi, moi* semellantes os de `git push`. É o mesmo tipo de conceptos, pero aplicados na dirección contraria (xa que agora estás baixando os commits en lugar de subilos).", + "", + "Vexamos os conceptos dunha puntada..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### O parámetro ``", + "", + "Se especificar o lugar co git fetch como no comando seguinte:", + "", + "`git fetch origin foo`", + "", + "Git vai ir á rama `foo` no remoto, vai traer tódolos commits que non estén presentes localmente, e logo aplicaráos sobre a rama `o/foo` localmente.", + "", + "Vexámolo en acción (refresquemos o concepto)." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Especificando un lugar..." + ], + "afterMarkdowns": [ + "Sólo baixamos os commits de `foo` e os poñemos en `o/foo`" + ], + "command": "git fetch origin foo", + "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Poderás preguntarte \"¿Por qué git aplicou eses commits sobre a rama `origin/foo` e non os aplicou sobre a rama `foo` local? Lembra que o parámetro `` era un lugar que existía tanto no local como no remoto.\"", + "", + "Bueno, git fai unha excepción especial neste caso, xa que poderías ter traballo na rama `foo` que non quixeras mesturar. Esto refírese á lección anterior sobre `git fetch` - non actualiza as túas ramas locais non-remotas, só descarga os commits (para que poidas velos ou mesturalos despois).", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "\"Bueno, e, neste caso, ¿qué pasa se explícitamente definimos o orixe e destino con `:`?\"", + "", + "Se te sentes o suficientemente seguro como para traer os commits *directamente* da rama local, entón, sí, podes especificalo empregando a referencia con dous puntos. Non podes traer commits a unha rama que non teñas, pero en calquera outro caso, git vaino facer.", + "", + "Este é o único problema, igual: `` é agora un lugar no *remoto*, e `` é un lugar *local* onde poñer esos commits. É exactamente o oposto a git push, e eso ten sentido xa que ¡estamos enviando os datos no sentido contrario!", + "", + "Dito esto, difícilmente alguén use esto na práctica. Estouno presentando principalmente como un modo de traballar no que `fetch` e `push` son moi semellantes, só que en direccións opostas." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Vexamos esta locura en acción" + ], + "afterMarkdowns": [ + "¡Wow! Mira: git resolveu `foo~1` como un lugar no que a orixe descargou eses commits a `bar` (que era unha rama local). Nota como `foo` e `o/foo` non foron actualizados, xa que especificamos o destino." + ], + "command": "git fetch origin foo~1:bar", + "beforeCommand": "git branch foo; git clone; git branch bar; git fakeTeamwork foo 2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Qué pasa si o destino non existe antes de lanzar este comando? Vexamos o último exemplo pero sin que `bar` exista de antemán." + ], + "afterMarkdowns": [ + "Mira: é IGUAL que git push. Git creou o destino localmente antes de facer o fetch, tal e como git creará o destino no remoto antes de empurrar (se non existiran)." + ], + "command": "git fetch origin foo~1:bar", + "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Sen argumentos?", + "", + "Se `git fetch` non recibe ningún argumento, simplemente descarga tódolos commits do remoto a tódalas ramas remotas..." + ], + "afterMarkdowns": [ + "Moi sinxelo, pero vale a pena velo ó menos unha vez." + ], + "command": "git fetch", + "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork master" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Bueno, moitas verbas. Para rematar o nivel, descarga só os commits especificados na visualización do obxectivo. ¡Faite colega destes comandos!", + "", + "Vas ter que especificar a orixe e o destino para ámbolos dous comandos fetch. Presta atención ó objetivo dado que ¡os IDs poden estar invertidos!" + ] + } + } + ] + }, "zh_TW": { "childViews": [ { diff --git a/src/levels/remote/fetchRebase.js b/src/levels/remote/fetchRebase.js index 851316bd..f44b2aab 100644 --- a/src/levels/remote/fetchRebase.js +++ b/src/levels/remote/fetchRebase.js @@ -8,6 +8,7 @@ exports.level = { "zh_TW": "diverged history", "es_AR": "Historia divergente", "pt_BR": "Histórico divergente", + "gl" : "Histórico diverxente", "de_DE": "Abweichende History", "fr_FR": "Historique divergent", "ja" : "履歴の分岐", @@ -21,6 +22,7 @@ exports.level = { "zh_TW": "確認視覺化的目標中的順序", "es_AR": "Prestá atención al orden del objetivo", "pt_BR": "Preste atenção na ordem da visualização do objetivo", + "gl" : "Presta atención ó orixe do obxectivo", "de_DE": "Beachte die Reihenfolge in der Zieldarstellung", "ja" : "ゴールのツリーの順番を参考にすること", "fr_FR": "regardez l'ordre dans la fenêtre de visualisation d'objectif", @@ -601,6 +603,150 @@ exports.level = { } ] }, + + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Traballo diverxente", + "", + "Ata agora vimos cómo descargar e mesturar os commits de outros e como empurrar os nosos. Parece bastante sinxelo, así que ¿cómo pode confundirse tanto a xente?", + "", + "A dificultade ven cando a historia dos repositorios *diverxe*. Antes de entrar nos detalles, vexamos un examplo...", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Imaxínate que clonas un repositorio o luns e comezas a desenvolver algo. Para o venres, xa estás listo para publicar o teu traballo, pero, ¡oh, oh! Os teus colegas tamén fixeron código durante a semana, facendo que o teu traballo quede desactualizado (e obsoleto). Ademáis, eles publicaron eses commits no repositorio remoto, así que agora o *teu* traballo está baseado nunha versión *vella* do proxecto, que xa non lle interesa a ninguén.", + "", + "Neste caso, o comando `git push` é ambiguo. Se executas `git push`, ¿git debería mudar o repositorio para como estaba o luns? ¿Deberías arranxar o teu código sen eliminar o código novo? ¿Ou debería ignorar completamente os teus cambio porque xa están desactualizados?", + "", + "Como hai tanta ambiguedade nesta situación (na que a historia diverxeu), git non che permite empurrar os teus cambios. En cambio, fórzate a integrar o último estado do respositorio remoto antes de poder compartir o teu traballo." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¡Demasiada charla, vexámolo en acción!" + ], + "afterMarkdowns": [ + "¿Ves? Non pasou nada, porque o comando falla. `git push` falla porque `C3`, o teu commit máis recente, está baseado no remoto sobre `C1`. O remoto foi actualizado a `C2` dende entonces, polo que git rechaza o teu push." + ], + "command": "git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¿Cómo resolves esta situación? É sinxelo, todo o que tes que facer é basear o teu traballo na versión máis recente da rama remota.", + "", + "Hai un par de formas de facer esto, pero a máis sinxela é mover o teu traballo facendo un rebase. Probémolo a ver cómo se ve." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Agora, se facemos rebase antes de empurrar..." + ], + "afterMarkdowns": [ + "¡Boom! Actualizamos a nosa representación local do remoto con `git fetch`, rebasamos o noso traballo para reflexar os novos cambios do remoto, e despois os empurramos con `git push`" + ], + "command": "git fetch; git rebase o/master; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¿Hai outra forma de actualizar o meu traballo se actualizaran o repositorio remoto? ¡Pois claro! Vexamos cómo facer o mesmo pero empregando `merge`.", + "", + "Por máis que `git merge` non mova o teu traballo (só crea un commit de merge), é un modo de decirlle a git que integrase tódolos cambios do remoto. Esto é porque agora unha rama remota pasou a ser un *ancestro* da tua propia rama, o que significa que o teu commit reflexa os cambios de tódolos commits da rama remota.", + "", + "Vexamos unha mostra..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Si no lugar de rebasar facemos un merge..." + ], + "afterMarkdowns": [ + "¡Boom! Actualizamos a nosa representación local do remoto usando `git fetch`, *mesturamos* ou *mergeamos* o novo traballo xunto co noso (para reflexar os novos cambios no remoto), e despois os empurramos empregando `git push`" + ], + "command": "git fetch; git merge o/master; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¡Asombroso! ¿Hai forma de facer esto sen escreber tantos comandos?", + "", + "¡Claro que sí! Xa sabes que `git pull` é sinxelamente un atallo para facer fetch e merge. Ademáis, ¡`git pull --rebase` é un atallo para facer fetch e rebase!", + "", + "Vexamos estos atallos funcionando." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Primeiro con `--rebase`..." + ], + "afterMarkdowns": [ + "¡Igual que antes! Só que máis corto." + ], + "command": "git pull --rebase; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "E agora un `pull` común" + ], + "afterMarkdowns": [ + "Outra vez, ¡exactamente o mesmo que antes!" + ], + "command": "git pull; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Toda esta movida de fetchear, rebasear/mergear e pushear é bastante común. Nas seguintes leccións imos ver formas máis complexas de estes fluxos de traballo, pero por agora probemos o que vimos.", + "", + "Para resolver este nivel, fai o siguiente:", + "", + "* Clona o teu repositorio", + "* Simula algo de trabajo dun colega (1 commit)", + "* Commitea algo de traballo propio (1 commit)", + "* Publica o teu traballo *rebasando*" + ] + } + } + ] + }, "zh_TW": { "childViews": [ { diff --git a/src/levels/remote/mergeManyFeatures.js b/src/levels/remote/mergeManyFeatures.js index e9d2223e..136a202c 100644 --- a/src/levels/remote/mergeManyFeatures.js +++ b/src/levels/remote/mergeManyFeatures.js @@ -8,6 +8,7 @@ exports.level = { "zh_TW": "merge with remotes", "es_AR": "Mergeando con los remotos", "pt_BR": "Merge com remotos", + "gl" : "Merge cos repos remotos", "de_DE": "Änderungen vom Remote zusammenführen", "ja" : "リモートとのmerge", "fr_FR": "Fusionner avec les branches distantes", @@ -21,6 +22,7 @@ exports.level = { "zh_TW": "注意最後要完成的目標!", "es_AR": "¡Prestá atención al árbol final!", "pt_BR": "Preste atenção na árvore do objetivo!", + "gl" : "Presta atención á arbore final!", "de_DE": "Beachte den Ziel-Baum!", "ja" : "ゴールツリーをよく見てください!", "fr_FR": "Respectez l'arbre représentant l'objectif !", @@ -210,6 +212,51 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## ¿Por qué non mesturar?", + "", + "Para empurrar as túas novidades ó remoto, todo o que tes que facer é *integrar* os últimos cambios do remoto cos teus. Eso significa que podes facer tanto rebase como merge ca rama remota (por exemplo, `o/master`).", + "", + "Así que podes facer calquera das dúas, ¿por qué as leccións só se centraron en rebasar ata agora? ¿Por qué non adicarlle algo de amor ó `merge` cando traballamos con remotos?", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Hai moito debate entre os desenvolvedores sobre os pros e contras de mesturar vs rebasar. Aquí temos os pros e os contras de rebasar:", + "", + "Pros:", + "", + "* Rebasar fai que a túa árbore de commits sexa bastante limpa, xa que tódolos commits seguen unha única línea.", + "", + "Contras:", + "", + "* Rebasar modifica a historia (aparente) da túa árbore de commits.", + "", + "Por exemplo, o commit `C1` pode rebasarse para que apareza *despois* de `C3`. Entón, parece que o traballo de `C1'` fíxose despois de `C3`, inda que na realidade fixérase antes.", + "", + "Algúns desenvolvedores aman preservar a historia, polo que prefiren mesturar. Outros (coma min) preferimos ter unha árbore de commits limpos, e preferimos rebasar. Todo é unha cuestión de preferencias :D" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para este nivel, tratemos de resolvelo nivel anterior, pero *mesturando*. Pode poñerse un pouco oscuro, pero ilustra a idea bastante ben." + ] + } + } + ] + }, "zh_TW": { "childViews": [ { diff --git a/src/levels/remote/pull.js b/src/levels/remote/pull.js index d1fa8cf9..a19a0f80 100644 --- a/src/levels/remote/pull.js +++ b/src/levels/remote/pull.js @@ -8,6 +8,7 @@ exports.level = { "zh_TW": "git pull", "es_AR": "git pull", "pt_BR": "Git Pull", + "gl" : "Git Pull", "de_DE": "Git Pull", "ja" : "Git Pull", "fr_FR": "Git pull", @@ -21,6 +22,7 @@ exports.level = { "zh_TW": "只要下 git pull 這個指令即可", "es_AR": "Simplemente ¡hacé git pull!", "pt_BR": "Basta executar git pull!", + "gl" : "Sinxelamente fai git pull!", "de_DE": "Führe einfach git pull aus.", "ja" : "単にgit pullを実行!", "fr_FR": "Utilisez facilement git pull !", @@ -265,6 +267,65 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Pull", + "", + "Agora que vimos cómo traer os datos dun repositorio remoto con `git fetch`, ¡actualicemos o noso traballo local para reflexar eses cambios!", + "", + "Realmente hai varias formas de facer esto: unha vez que teñas os commits dispoñibles localmente, podes integralos coma se foran commits comúns de outras ramas. Esto significa que poderías executar comandos como:", + "", + "* `git cherry-pick o/master`", + "* `git rebase o/master`", + "* `git merge o/master`", + "* etc., etc.", + "", + "De feito, o fluxo de traballo de *fetchear* os cambios remotos e depois *mesturalos* é tan común que git inclúe un comando que fai as dúas operacións nunha sola: ¡`giti pull`!" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Vexamos primeiro un `fetch` e un `merge` executados secuencialmente" + ], + "afterMarkdowns": [ + "Boom: descargamos `C3` cun `fetch` e logo mesturámolos con `git merge o/master`. Agora a nosa rama `master` reflexa o novo traballo do remoto (neste caso, chamado `origin`)" + ], + "command": "git fetch; git merge o/master", + "beforeCommand": "git clone; git commit; git fakeTeamwork" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Qué pasaría se usáramos `git pull` en cambio?" + ], + "afterMarkdowns": [ + "¡O mesmo! Eso debía deixar ben claro que `git pull` é básicamente un atallo para facer `git fetch` seguido pola mestura ca rama que houbésemos descargado." + ], + "command": "git pull", + "beforeCommand": "git clone; git commit; git fakeTeamwork" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Exploraremos os detalles de `git pull` despois (incluíndo as súas operacións e parámetros), pero por agora probarémolo neste nivel.", + "", + "Lémbrate: podes resolver este comando sinxelamente con `fetch` e `merge`, pero eso costaríache un comando extra :P" + ] + } + } + ] + }, "zh_TW": { "childViews": [ { diff --git a/src/levels/remote/pullArgs.js b/src/levels/remote/pullArgs.js index 7b63fc00..c719162a 100644 --- a/src/levels/remote/pullArgs.js +++ b/src/levels/remote/pullArgs.js @@ -8,6 +8,7 @@ exports.level = { "zh_TW": "pull 的參數", "es_AR": "Parámetros de pull", "pt_BR": "Parâmetros do pull", + "gl" : "Parámetros de pull", "de_DE": "Optionen für Pull", "ja" : "Pullの引数", "fr_FR": "Arguments de pull", @@ -21,6 +22,7 @@ exports.level = { "zh_TW": "記住,你可以透過 fetch 以及 pull 來建立一個新的 local 的 branch", "es_AR": "Acordate de que podés crear nuevas ramas locales usando los parámetros de fetch/pull", "pt_BR": "Lembre-se que você pode criar novos ramos locais com parâmetros de fetch/pull", + "gl" : "Lémbrate que podes crear novas ramas locais con parámetros de fetch/pull", "de_DE": "Du kannst neue lokale Branches mittels fetch / pull erstellen", "ja" : "Fetchとpullの引数を利用してローカルで新規ブランチを作成できるのをお忘れなく", "fr_FR": "Vous pouvez aussi créer une nouvelle branche locale avec les arguments de fetch/pull", @@ -325,6 +327,80 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Parámetros de git pull", + "", + "Agora que sabes prácticamente *todo* o que hai que saber sobre os parámetros de `git fetch` e `git push`, casi que non queda nada para cubrir os de git pull :D", + "", + "Eso é porque git pull é sinxelamente un atallo para facer un fetch seguido dun merge. Podes pensalo como executar git fetch cos *mesmos* parámetros, e logo mesturar aquelo onde esos commits houberan ido ficar.", + "", + "Esto aplica incluso cando usas parámetros hiper-complexos. Vexamos algúns exemplos:" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Estos son algúns comandos equivalentes de git:", + "", + "`git pull origin foo` equivale a:", + "", + "`git fetch origin foo; git merge o/foo`", + "", + "E...", + "", + "`git pull origin bar~1:bugFix` equivale a:", + "", + "`git fetch origin bar~1:bugFix; git merge bugFix`", + "", + "¿Ves? git pull é sinxelamente un atallo para un fetch + merge, e todo o que lle importa a git pull é ónde terminaron eses commits (o parámetro `destino` que indícase durante o fetch).", + "", + "Vexamos unha demostración:" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Se especificamos o lugar do que facer o fetch, todo ocorre coma antes, pero só mesturamos o que se descargou" + ], + "afterMarkdowns": [ + "¡Ves! Indicando `master` baixamos os commits á `o/master` coma sempre. Despois mesturamos `o/master` á nosa rama actual, *sen importar* qué tiñamos na nos copia de traballo." + ], + "command": "git pull origin master", + "beforeCommand": "git clone; go -b bar; git commit; git fakeTeamwork" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Esto funciona co orixe e o destino, tamén? ¡Máis lle vale! Vexámolo:" + ], + "afterMarkdowns": [ + "Wow, eso es unha CHEA nun único comando. Creamos unha nova rama local chamada `foo`, descargamos os commits do master do remoto a esta rama `foo`, e logo mesturamos esa rama á nosa rama actual `bar`. ¡¡¡Supera os 9000!!!" + ], + "command": "git pull origin master:foo", + "beforeCommand": "git clone; git fakeTeamwork; go -b bar; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "OK: para rematar, alcanza o estado do obxectivo. Vase necesitar descargar algúns commits, crear algunhas ramas novas, e mesturar esas ramas xunto con outras, pero non debería levar demasiados domandos :P" + ] + } + } + ] + }, "zh_TW": { "childViews": [ { diff --git a/src/levels/remote/push.js b/src/levels/remote/push.js index 9d8591ab..9377579e 100644 --- a/src/levels/remote/push.js +++ b/src/levels/remote/push.js @@ -8,6 +8,7 @@ exports.level = { "zh_TW": "git push", "es_AR": "git push", "pt_BR": "Git Push", + "gl" : "Git Push", "de_DE": "Git Push", "ja" : "Git Push", "fr_FR": "Git push", @@ -199,6 +200,49 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Push", + "", + "Ok, entón xa baixamos os cambios dun repositorio remoto e integrámolos na árbore local. Esto está xenial... pero ¿cómo comparto o _meu_ sensacional traballo cas outras persoas?", + "", + "Ben, a forma de subir traballo para ser compartido é a oposta daquela de baixar o traballo que foi compartido. E ¿qué é o oposto a `git pull` (tirar)? ¡É `git push` (empuxar)!", + "", + "`git push` é o responsable de subilos _teus_ cambios para un repositorio remoto especificado, e atualizar ese repositorio remoto para incorporar os seus novos commits. Unha vez que `git push` complétase, todos os teus amigos poderán baixar o teu traballo do repositorio remoto.", + "", + "Podes pensar en `git push` como un comando para \"publicar\" o teu traballo. O comando ten unha serie de detalles cos que imos xogar logo, pero comezemos con pasos curtos...", + "", + "*Nota -- o comportamento de `git push` sen argumentos varía dependendo da configuración `push.default` de Git. O valor para esa configuración depende da versión de Git que esteas empregando, pero imos asumir o valor `upstream` nestas leccións. Eso non é un gran problema, pero paga a pena verificalas súas configuracións antes de facer push nos teus propios proxectos.*" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Aquí temos algúns cambios que o repositorio remoto non contén. ¡Imos subilas!" + ], + "afterMarkdowns": [ + "Ahí imos -- o repositorio remoto recibiu o commit `C2`, a rama `master` do repositorio remoto foi actualizado para apuntar para `C2`, e o *noso* reflexo do remoto (`o/master`) foi atualizado tamén. ¡Está todo sincronizado!" + ], + "command": "git push", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, comparte dous novos commits co repositorio remoto. Igual, non te confíes, ¡xa se complicará nas seguintes leccións!" + ] + } + } + ] + }, "zh_TW": { "childViews": [ { diff --git a/src/levels/remote/pushArgs.js b/src/levels/remote/pushArgs.js index 7da6ee93..c7d72ea9 100644 --- a/src/levels/remote/pushArgs.js +++ b/src/levels/remote/pushArgs.js @@ -11,6 +11,7 @@ exports.level = { "zh_TW": "git push 的參數", "es_AR": "Parámetros de git push", "pt_BR": "Parâmetros do git push", + "gl" : "Parámetros de git push", "de_DE": "Optionen für Git Push", "ja" : "Git pushの引数", "fr_FR": "Arguments de git push", @@ -24,6 +25,7 @@ exports.level = { "zh_TW": "你可以利用 \"objective\" 來閱讀對話視窗的最後一頁", "es_AR": "Siempre podés ver el último mensaje tipeando \"objective\"", "pt_BR": "Você sempre pode rever o último slide com o comando \"objective\"", + "gl" : "Ti sempre podes desfacer último mensaxe escribindo \"objective\"", "de_DE": "Du kannst dir die Zielsetzung des Levels immer wieder mit \"objective\" anzeigen lassen", "ja" : "ダイアログの最後のスライドを参照するには\"objective\"を実行", "fr_FR": "Vous pouvez toujours regarder le dernier slide des dialogues en tapant \"objective\".", @@ -323,6 +325,78 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Parámetros de push", + "", + "¡Xenial! Agora que sabes acerca das ramas que seguen remotos, podemos empezas a desvelar algo do misterio detrás do git push, fetch e pull. Imos atacar cun só comando dunha vez, pero os conceptos entre eles son moi semellantes.", + "", + "Vexamos primeiro `git push`. Xa aprendiches na lección sobre as ramas remotas que git determina o remoto *e* a rama á que empurrar mirando as propiedades da rama actual (o remoto ó que seguir). Este é o comportamento por defecto para cando non se especifican parámetros, pero git push toma, opcionalmente, parámetros da forma:", + "", + "`git push `", + "", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¿Qué será este parámetro ``, fixécheste esa pregunta? Xa imos entrar en detalle, pero primeiro un exemplo. Executa o comando:", + "", + "`git push origin master`", + "", + "tradúcese así ó galego:", + "", + "*Vai á rama chamada \"master\" no meu repositorio, colle tódolos commits, e despois vai á rama \"master\" do remoto chamado \"origin\". Aplica ahí tódolos commits que falten, e avísame cando remates.*", + "", + "Indicando `master` como o parámetro \"lugar\", dixémoslle a git ónde traer os commits, e ónde mandalos. É básicamente, o \"lugar\" ou \"ubicación\" que sincroniza entre ámbolos dous repositorios.", + "", + "Ten en conta que, como lle dixemos a git todo o que precisaba saber (indicando ambos parámetros), ¡ignora totalmente ónde andabamos neste momento!" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Vexamos un exemplo especificando os parámetros. Nota ónde ficamos parados neste exemplo." + ], + "afterMarkdowns": [ + "¡Ahí o tes! Actualizouse `master` no remoto, porque especificamos eses parámetros." + ], + "command": "git checkout C0; git push origin master", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿E se non especificáramos os parámetros? ¿Que ocorrería?" + ], + "afterMarkdowns": [ + "O comando falla (como podes ver), xa que `HEAD` non está sobre ningunha rama que siga algún remoto." + ], + "command": "git checkout C0; git push", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ok. Para este nivel, actualiza tanto `foo` como `master` no remoto. O tema está en que ¡temos deshabilitado `git checkout` neste nivel!" + ] + } + } + ] + }, "zh_TW": { "childViews": [ { diff --git a/src/levels/remote/pushArgs2.js b/src/levels/remote/pushArgs2.js index 8e15cf6f..bf464f5e 100644 --- a/src/levels/remote/pushArgs2.js +++ b/src/levels/remote/pushArgs2.js @@ -8,6 +8,7 @@ exports.level = { "zh_TW": "git push 的參數,延伸討論!", "es_AR": "¡Más! Parámetros de git push", "pt_BR": "Parâmetros do git push -- expandido", + "gl" : "Parámetros de git push -- ampliado", "de_DE": "Optionen für Git Push -- noch mehr!", "ja" : "Git pushの引数 -- 拡張編!", "fr_FR": "Arguments de git push -- toujours plus !", @@ -21,6 +22,7 @@ exports.level = { "zh_TW": "如果你失敗了,可以利用 \"show solution\" 來找到解答:P", "es_AR": "Recordá que podés admitir tu derrota y tipear \"show solution\" para ver la solución :P", "pt_BR": "Lembre-se que você pode admitir que foi derrotado e digitar \"show solution\" :P", + "gl" : "Lembrate que podes admitir que fuches derrotado e escribir \"show solution\" para amosala solución :P", "de_DE": "Vergiss nicht dass du aufgeben kannst, indem du \"show solution\" eingibst :P", "ja" : "降参して解説を見るには\"show solution\"を実行できるのをお忘れなく", "fr_FR": "N'oubliez pas que vous pouvez toujours déclarer forfait avec \"show solution\" :P", @@ -309,6 +311,76 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Detalles sobre o parámetro ``", + "", + "Lémbrate da lección anterior cando especificamos `master` como o parámetro lugar de git push, especificamos tanto a *orixe* do que sacar os commits como o *destino* ó que envialos.", + "", + "Poderías estar a preguntarte ¿E se quixéramos que a orixe e o destino sexan distintos? ¿Se quixéramos empurrar os commits da rama local `foo` á rama `bar` do remoto?", + "", + "Bueno, esto non se pode facer en git... ¡Caramboliñas! Claro que se pode :D. git é extremadísimamente flexibe (case case que de máis).", + "", + "Vexamos cómo facelo a continuación..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para especificar tanto a orixe como o destino de ``, sinxelamente úneos empregando dous puntos:", + "", + "`git push origin :`", + "", + "Esto pódeselle chamar refspec con dous puntos. Refspec é sinxelamente un nome cool para unha ubicación que git pode entender (como a rama `foo`, ou incluso `HEAD~1`)", + "", + "Unha vez que especificas a orixe e o destino independientemente, podes poñerte cómodo e preciso cos comandos remotos. ¡Vexamos a demo!" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Lembra: `orixe` é calquera ubicación que git poida entender:" + ], + "afterMarkdowns": [ + "¡Woow! Ese commando é unha tolemia, pero ten sentido: git resolveu `foo^` a unha ubicación, subiu calquera commit de ahí que aún non estivera no remoto, e logo actualizou o destino." + ], + "command": "git push origin foo^:master", + "beforeCommand": "git clone; go -b foo; git commit; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿E qué hai se o destino ó que queres empurrar non existise? ¡Non pasa nada! Sinxelamente dalle un nome á rama e git vaise encargar de crealo no remoto." + ], + "afterMarkdowns": [ + "Xenial, sinxelamente tira para adiante" + ], + "command": "git push origin master:newBranch", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para este nivel, intenta chegar o obxectivo final, e lembrate do formato:", + "", + "`:`" + ] + } + } + ] + }, "zh_TW": { "childViews": [ { diff --git a/src/levels/remote/pushManyFeatures.js b/src/levels/remote/pushManyFeatures.js index da1742ae..3069169a 100644 --- a/src/levels/remote/pushManyFeatures.js +++ b/src/levels/remote/pushManyFeatures.js @@ -8,6 +8,7 @@ exports.level = { "zh_TW": "你隨時都可以使用 undo 或 reset 指令。", "es_AR": "Acordate que siempre podés usar los comandos reset y undo", "pt_BR": "Lembre-se que você sempre pode usar undo ou reset", + "gl" : "Lembra que sempre podes usar undo ou reset", "de_DE": "Denk dran, du kannst immer undo oder reset benutzen, um deine Befehle zurück zu nehmen.", "ja" : "undoやresetコマンドをいつでも使用することができるのをお忘れなく", "fr_FR": "Rappelez-vous que vous pouvez toujours utiliser les commandes undo et reset.", @@ -21,6 +22,7 @@ exports.level = { "zh_TW": "push master!", "es_AR": "¡Push Master!", "pt_BR": "Push Master!", + "gl" : "Empurra ó Master!", "de_DE": "Push Master!", "ja" : "Push Master!", "fr_FR": "Maître du push !", @@ -242,6 +244,59 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Mesturando ramas", + "", + "Agora que estás afeito a descargar, mesturar e empurrar, poñamos a proba estas habilidades cun novo fluxo de traballo.", + "", + "É bastante común que os desenvolvedores nos grandes proxectos traballen sobre ramas específicas para cada tarefa (feature branches) baseadas en `mater`, e que as integren só cando están preparadas. Esto é similar á lección anterior, na que empurrábamos as ramas periféricas ó remoto, pero acá temos un paso máis.", + "", + "Algúns desenvovledores só empurran e descargan cando están en `master`: de ese xeito, `master` sempre mantén actualizado o seu estado co remoto (`o/master`).", + "", + "Entón, neste fluxo de traballo combinamos dúas cousas:", + "", + "* integramos o traballo das ramas específicas a `master`, e", + "* empurramos e turramos do remoto" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Refresquemos un pouco cómo actualizar `master` e empurrar o noso traballo." + ], + "afterMarkdowns": [ + "Agora executamos dous comandos que:", + "", + "* rebasamos o noso traballo sobre os novos commits do remoto, e", + "* publicamos o noso traballo nese remoto" + ], + "command": "git pull --rebase; git push", + "beforeCommand": "git clone; git commit; git fakeTeamwork" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Este nivel é bastante pesado. Aquí tes algúns patróns para resolvelo:", + "", + "* Temos tres ramas específicas -- `side1` `side2` e `side3`", + "* Queremos empurrar cada unha de esas ramas, en orde, ó remoto", + "* O remoto foi actualizado, así que imos ter que integrar eses cambios tamén", + "", + ":O ¡Intenso! ¡Éxitos! Completar este nivel representa un grande avance." + ] + } + } + ] + }, "zh_TW": { "childViews": [ { diff --git a/src/levels/remote/remoteBranches.js b/src/levels/remote/remoteBranches.js index 37ef477d..1196c57a 100644 --- a/src/levels/remote/remoteBranches.js +++ b/src/levels/remote/remoteBranches.js @@ -8,6 +8,7 @@ exports.level = { "zh_TW": "remote branch (遠端分支)", "es_AR": "Ramas remotas", "pt_BR": "Ramos remotos", + "gl" : "Ramas remotas", "de_DE": "Branches auf entfernten Servern", "ja" : "リモートのブランチ", "fr_FR": "Les branches distantes", @@ -21,6 +22,7 @@ exports.level = { "zh_TW": "注意順序的問題喔!先在 master branch 上面送 commit", "es_AR": "Prestá atención al orden: ¡commiteá sobre master primero!", "pt_BR": "Preste atenção na ordem: commite no master primeiro!", + "gl" : "Preta atención á orde: fai commit no master primeiro", "de_DE": "Beachte die Sortierung -- committe zuerst auf dem master!", "ja" : "順番に注意 -- まずmasterに対してcommitしましょう", "fr_FR": "Prêtez attention à l'ordre -- les commits sur master d'abord !", @@ -273,6 +275,68 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Ramas remotas de git", + "", + "Agora que viches `git clone` en acción, mergullémonos no que realmente mudou.", + "", + "O primeiro que notarías é que apareceu unha nova rama no teu repositorio local chamada `o/master`. A este tipo de ramas chámaselle ramas _remotas_. As ramas remotas teñén propiedades especiais porque serven para un propósito específico.", + "", + "As ramas remotas reflexan o _estado_ dos repositorios remotos (como estaban á última vez que falaches con eles). Axúdante a entender as diferencias entre o teu traballo local e o teu traballo que xa está publicado - un paso crítico antes de compartir o teu traballo cos demáis.", + uU + "", + "As ramas remotas teñen a propiedade especial de que cando fas checkout, pasas o modo detached `HEAD`. Git faino a drede porque non podes traballar nesas ramas directamente: tes que traballar nalgún outro lado e despois compartir o teu traballo co remoto (tras o que as túas ramas remotas actualizaranse)." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### ¿Qué é `o/`?", + "", + "Poderías estar a preguntarte qué significa ese `o/` ó principio das ramas remotas. Bueno, as ramas remotas tamén teñen unha convención de nomes obligatoria -- se as amosas co formato:", + "", + "* `/`", + "", + "Entonces, se miras unha rama chamada `o/master`, o nome da rama é `master`, e o nome do remoto é `o`.", + "", + "A maioría dos desenvolvedores chaman `origin` ó seu remoto no lugar de `o`. Esto é tan común que git efectivamente crea o teu remoto chamandoo `origin` cando fas `git clone` dun repositorio.", + "", + "Desafortunadamente o nome `origin` completo non entra na nosa UI, así que empregaremos `o` para acortar: (Sinxelamente recorda que cando uses git na vida real, o teu remote ¡probablemente se chame `origin`!)", + "", + "Hai moito para procesar, así que vexámolo en acción." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Fagamos checkout a unha rama remota a ver qué pasa" + ], + "afterMarkdowns": [ + "Como ves, git púxonos no modo detached `HEAD` e non actualizou `o/mater` cando creamos un novo commit. Esto é porque `o/mater` só vai actualizarse cando o remoto se actualice." + ], + "command": "git checkout o/master; git commit", + "beforeCommand": "git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, fai commit unha vez sobre `mater` e despois de facer o checkout a `o/master`. Esto vaite axudar a entender cómo funcionan as ramas remotas, e que só se actualizan para reflexar o estado do remoto." + ] + } + } + ] + }, "zh_TW": { "childViews": [ { diff --git a/src/levels/remote/sourceNothing.js b/src/levels/remote/sourceNothing.js index 40899640..d94359be 100644 --- a/src/levels/remote/sourceNothing.js +++ b/src/levels/remote/sourceNothing.js @@ -8,6 +8,7 @@ exports.level = { "zh_TW": "沒有 source", "es_AR": "Origen de nada", "pt_BR": "Origem vazia", + "gl" : "Orixen de nada", "de_DE": "Die Quelle des Nichts", "ja" : "無のsource", "fr_FR": "Source de rien du tout", @@ -21,6 +22,7 @@ exports.level = { "zh_TW": "在本關卡中,不允許使用 branch 指令,因此你只能使用 fetch!", "es_AR": "El comando branch está deshabilitado para este nivel, así que ¡vas a tener que usar fetch!", "pt_BR": "O comando branch está desabilitado para este nível, então você terá de usar o fetch!", + "gl" : "O comando branch está deshabilitado para este nivel, entón terás que empregar o comando fetch!", "de_DE": "Der branch Befehl ist für diesen Level inaktiv, du musst also fetch benutzen", "ja" : "このレベルではbranchコマンドが無効になっているのでfetchを使うしかない!", "fr_FR": "La commande branch est désactivée pour ce niveau, vous devrez donc utiliser fetch !", @@ -241,6 +243,59 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Rarezas do ``", + "", + "Git abusa do parámetro `` de dúas maneiras extranas. Estos dous abusos veñen do feito de que técnicamente podes especificar \"á nada\" como un `orixe` válido tanto para git push como para git fetch. O modo de especificar a nada é a través dun parámetro vacío:", + "", + "* `git push origin :side`", + "* `git fetch origin :bugFix`", + "", + "Vexamos qué fan..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Qué fai cando se empurra a \"nada\" a unha rama remota? ¡Eliminaa!" + ], + "afterMarkdowns": [ + "Ahí está, borramos a rama `foo` exitosamente do remoto empurrando o concepto da \"nada\". Ten algo de sentido..." + ], + "command": "git push origin :foo", + "beforeCommand": "git clone; git push origin master:foo" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Finalmente, descargar a \"nada\" a un lugar local na realidade crea unha nova rama" + ], + "afterMarkdowns": [ + "Bastante bizarro, pero, meh, da igual. Así é git." + ], + "command": "git fetch origin :bar", + "beforeCommand": "git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Este é un nivel rápido: simplemente borra unha rama remota e crea unha nova empregando `git fetch` para completalo." + ] + } + } + ] + }, "zh_TW": { "childViews": [ { diff --git a/src/levels/remote/tracking.js b/src/levels/remote/tracking.js index 150e8956..1928e943 100644 --- a/src/levels/remote/tracking.js +++ b/src/levels/remote/tracking.js @@ -8,6 +8,7 @@ exports.level = { "zh_TW": "remote tracking", "es_AR": "Trackeando remotos", "pt_BR": "Seguindo remotos", + "gl" : "Traceando os remotos", "de_DE": "Remote Tracking", "ja" : "リモートのトラッキング", "fr_FR": "Suivi de branche distante", @@ -21,6 +22,7 @@ exports.level = { "zh_TW": "記住喔,有兩個方式可以去設定 remote tracking", "es_AR": "¡Acordate de que hay dos formas de trackear un remoto!", "pt_BR": "Lembre-se que há duas formas de seguir um ramo remoto!", + "gl" : "¡Lembrate de que hai dúas formas de seguir unha rama remota!", "de_DE": "Nicht vergessen, es gibt zwei Arten Remote Tracking einzurichten!", "ja" : "リモートトラッキングを設定する方法が二つあるのをお忘れなく!", "fr_FR": "Rappelez-vous qu'il existe deux façons de configurer le suivi de branche distante !", @@ -503,6 +505,126 @@ exports.level = { } ] }, + "gl": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Ramas que trackean os remotos", + "", + "Unha das cousas que poden semellar \"máxicas\" das últimas leccións é que git sabía que a rama `master` estaba relacionada co `o/master`. Obviamente, estas ramas teñen nomes semellantes, e podería semellar lóxico conectar a rama `master` do remoto ca rama `master` local, pero esta conexión é ben evidente nos dous escenarios:", + "", + "* Durante unha operación de pull, os commits descarganse ó `o/master` e logo *mesturanse* á rama `master`. O obxectivo implícito do merge determinase con esta conexión.", + "* Durante un push, o traballo da rama `master` súbese á rama `master` do remoto (que estaba representada localmente por `o/master`). O *destino* do push determinouse con esta conexión entre `master` e `o/master`.", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Trackeando remotos", + "", + "Facéndoa curta, esta conexión entre `master` e `o/master` ensínase pola propiedade de \"trackear (seguir) remotos\" das ramas. A rama `master` está configurada para trackear `o/master` -- o que quere dicir, que hai un obxectivo implícito para o merge e un destino implícito para a rama `master`.", + "", + "Poderías estar pensando cómo esa propiedade apareceu na túa rama `master` se ti non executaches ningún comando para especificalo. Bueno, cando clonas un repositorio co git, esta propiedade asignase por ti automáticamente.", + "", + "Durante un clone, git crea unha rama remota por cada rama no remoto (por exemplo, ramas como `o/master`). Pero despois crea unha rama local que trakea a rama activa do remoto, que habitúa ser `master`.", + "", + "Una vez completado o git clone, só tés unha única rama local (para que non te asustes) pero podes ver todalas ramas que do remoto (se fora tan curioso). ¡É o mellor de ámbolos dous mundos!", + "", + "Esto tamén explica por qué poderías ver unha mensaxe como este durante a clonación:", + "", + " local branch \"master\" set to track remote branch \"o/master\"", + "", + " rama local \"master\" establecida para trackear a rama remota \"o/master\"" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### ¿Podo especificalo eu?", + "", + "¡Claro que sí! Podes facer que calquera rama que quixeras seguir `o/master`, e se o fixeras, esa rama vai ter o mesmo destino implícito de push e obxectivo implícito de merge que `master`. Eso significa que podes executar `git push` nunha rama chamada `nonMaster` e ¡que o teu traballo se empurre á rama `master` do remoto!", + "", + "Hai dúas formas de establecer esta propiedade. A primeira é facer checkout a unha nova rama empregando unha rama remota como a referencia especificada. Executar", + "", + "`git checkout -b nonMaster o/master`", + "", + "Crea unha nova rama chamada `nonMaster` e persigue a `o/master`." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Suficiente charla, ¡vexamos unha demo! Imos facer checkout a unha nova rama chamada `foo` e facer que siga a `master` no remoto." + ], + "afterMarkdowns": [ + "Como podes ver, empregamos o obxectivo implícito de merge `o/master` para actualizar a rama `foo`. ¡Nota como `master` non foi actualizada!" + ], + "command": "git checkout -b foo o/master; git pull", + "beforeCommand": "git clone; git fakeTeamwork" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "O mismo aplica para git push" + ], + "afterMarkdowns": [ + "Boom. Empurramos o noso traballo á rama `master` do remoto incluso cando a nosa rama se chamaba totalmete distinto" + ], + "command": "git checkout -b foo o/master; git commit; git push", + "beforeCommand": "git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Forma número 2", + "", + "Outra forma de especificar a rama a seguir é usar a opción `git branch -u`. Executando", + "", + "`git branch -u o/master foo`", + "", + "establecemos que a rama `foo` segue a `o/mater`. Se por riba estás parado en `foo`, incluso podes obvialo:", + "", + "`git branch -u o/master`", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Vexamos rápidamente está outra forma de especificar a rama a seguir..." + ], + "afterMarkdowns": [ + "O mesmo que antes, só que un comando bastante máis explícito. ¡Unha cousa preciosa!" + ], + "command": "git branch -u o/master foo; git commit; git push", + "beforeCommand": "git clone; git checkout -b foo" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¡Ok! Para este nivel, empurra o teu traballo á rama `master` do remoto *sen* estar parado sobre `master` localmente. Déixote que te decates do resto ti só, que para algo estás nun nivel avanzado :P" + ] + } + } + ] + }, "zh_TW": { "childViews": [ { From cfa547de92fb36e93ae215e4f4e3048b788713f2 Mon Sep 17 00:00:00 2001 From: Prou Yann Date: Tue, 12 Mar 2019 16:47:03 +0100 Subject: [PATCH 073/359] Fix: file remoteBranches.js --- src/levels/remote/remoteBranches.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/levels/remote/remoteBranches.js b/src/levels/remote/remoteBranches.js index 1196c57a..82f630cf 100644 --- a/src/levels/remote/remoteBranches.js +++ b/src/levels/remote/remoteBranches.js @@ -288,7 +288,6 @@ exports.level = { "O primeiro que notarías é que apareceu unha nova rama no teu repositorio local chamada `o/master`. A este tipo de ramas chámaselle ramas _remotas_. As ramas remotas teñén propiedades especiais porque serven para un propósito específico.", "", "As ramas remotas reflexan o _estado_ dos repositorios remotos (como estaban á última vez que falaches con eles). Axúdante a entender as diferencias entre o teu traballo local e o teu traballo que xa está publicado - un paso crítico antes de compartir o teu traballo cos demáis.", - uU "", "As ramas remotas teñen a propiedade especial de que cando fas checkout, pasas o modo detached `HEAD`. Git faino a drede porque non podes traballar nesas ramas directamente: tes que traballar nalgún outro lado e despois compartir o teu traballo co remoto (tras o que as túas ramas remotas actualizaranse)." ] From f097d7be0e6740df46481c1b45fa56052339f568 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Fri, 22 Mar 2019 14:25:23 -0700 Subject: [PATCH 074/359] Resolves #554 --- src/levels/intro/merging.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/intro/merging.js b/src/levels/intro/merging.js index 4e69ba24..894501ff 100644 --- a/src/levels/intro/merging.js +++ b/src/levels/intro/merging.js @@ -849,7 +849,7 @@ exports.level = { "Щоб пройти цей рівень виконай наступні кроки:", "", "* Зроби нову гілку (branch) з назвою `bugFix`", - "* Перейди на кілку `bugFix` за допомогою `git checkout bugFix`", + "* Перейди на гілку `bugFix` за допомогою `git checkout bugFix`", "* Зроби один коміт", "* Повернись до `master` за допомогою `git checkout`", "* Зроби ще один коміт", From 699898debf009958f18ea1b8a3c78a8abe84253a Mon Sep 17 00:00:00 2001 From: Hongarc Date: Sat, 6 Apr 2019 00:26:15 +0700 Subject: [PATCH 075/359] Update `grunt` version Fix error can't find `grunt` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8f1b0254..f44d5db0 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ }, "devDependencies": { "browserify": "^13.0.0", - "grunt": "~0.4.2", + "grunt": "^1.0.4", "grunt-browserify": "^4.0.1", "grunt-contrib-clean": "~0.5.0", "grunt-contrib-jshint": "~0.7.2", From 8c3966ed480ee44e1d0db8d38db7281152861245 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Tue, 9 Apr 2019 17:23:00 -0700 Subject: [PATCH 076/359] Resolves #557 -- add contributor faces --- README.md | 34 ++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 35 insertions(+) diff --git a/README.md b/README.md index 8e9a6cd1..5c287241 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,40 @@ git push Alternatively, you can also build and run the app in a pre-configured online workspace: [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/pcottle/learnGitBranching/blob/master/src/js/git/index.js) +[//]: contributor-faces + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[//]: contributor-faces ## Helpful Folks A big shoutout to these brave souls for extensively testing our sandbox and finding bugs and/or inconsistencies: diff --git a/package.json b/package.json index f44d5db0..936132b9 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ }, "dependencies": { "backbone": "~1.1.2", + "contributor-faces": "^1.0.2", "flux": "^2.0.1", "markdown": "~0.4.0", "q": "~0.8.11", From a44b5d5af57f2f0546e32bd1e8b5eb3e55bed17e Mon Sep 17 00:00:00 2001 From: Hongarc Date: Wed, 10 Apr 2019 10:31:36 +0700 Subject: [PATCH 077/359] fix(readme): hide comment in README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5c287241..a73d7215 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,7 @@ git push Alternatively, you can also build and run the app in a pre-configured online workspace: [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/pcottle/learnGitBranching/blob/master/src/js/git/index.js) + [//]: contributor-faces From 135730b662b6152c32e2e38b63541f0bbe070b37 Mon Sep 17 00:00:00 2001 From: Hongarc Date: Wed, 10 Apr 2019 11:20:25 +0700 Subject: [PATCH 078/359] chore(deps): `contributor-faces` to `devDepen` `contributor-faces` is a package to build `README.md`, not require in code so we need to change it from `dependencies` to `devDependencies` --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 936132b9..54f69cec 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ }, "devDependencies": { "browserify": "^13.0.0", + "contributor-faces": "^1.0.2", "grunt": "^1.0.4", "grunt-browserify": "^4.0.1", "grunt-contrib-clean": "~0.5.0", @@ -30,7 +31,6 @@ }, "dependencies": { "backbone": "~1.1.2", - "contributor-faces": "^1.0.2", "flux": "^2.0.1", "markdown": "~0.4.0", "q": "~0.8.11", From 0a9fe8a89f248746d544de25c1bbc0505c693d50 Mon Sep 17 00:00:00 2001 From: Hongarc Date: Wed, 10 Apr 2019 11:23:38 +0700 Subject: [PATCH 079/359] chore(readme): remove blamk line This line will be removed by `contributor-faces` --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index a73d7215..9c187699 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,6 @@ Alternatively, you can also build and run the app in a pre-configured online wor [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/pcottle/learnGitBranching/blob/master/src/js/git/index.js) [//]: contributor-faces - From 428be3e2f8aa57fd229348cc6cad897ff26d6716 Mon Sep 17 00:00:00 2001 From: Hongarc Date: Wed, 10 Apr 2019 23:18:01 +0700 Subject: [PATCH 080/359] remove Node.js v7 in travis-ci This project uses `contributor-faces`, it includes `gh-got`. And `gh-got` require Node v8 so `travis-ci` will have the error. So I have 2 option: - Remove Nodejs v7 in `.travis.yml` - Or install `contributor-faces` in your machine(require Node >= 8) and sometime run `contributor-faces .` in your project to update list contributor. --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4412d1ed..55656971 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,6 @@ language: node_js node_js: - "10" - "8" - - "7" before_install: - curl -o- -L https://yarnpkg.com/install.sh | bash - export PATH="$HOME/.yarn/bin:$PATH" From 638a711c4d5bfd49fb9b7fa42222ccd122f278e6 Mon Sep 17 00:00:00 2001 From: Hongarc Date: Sat, 13 Apr 2019 09:31:07 +0700 Subject: [PATCH 081/359] use `every` instead of _.uniq Array.every is better for check all pass --- src/js/graph/treeCompare.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/js/graph/treeCompare.js b/src/js/graph/treeCompare.js index 9b37bc60..ad3324f4 100644 --- a/src/js/graph/treeCompare.js +++ b/src/js/graph/treeCompare.js @@ -98,11 +98,9 @@ TreeCompare.compareAllBranchesWithinTrees = function(treeA, treeB) { treeB.branches ); - var result = true; - _.uniq(allBranches, function(info, branch) { - result = result && this.compareBranchWithinTrees(treeA, treeB, branch); - }, this); - return result; + return Object.keys(allBranches).every(function(branch) { + return this.compareBranchWithinTrees(treeA, treeB, branch); + }.bind(this)); }; TreeCompare.compareAllTagsWithinTrees = function(treeA, treeB) { From 39457f14ba88a64d3b78709dbef23f3f291fe754 Mon Sep 17 00:00:00 2001 From: Hongarc Date: Sat, 13 Apr 2019 09:37:25 +0700 Subject: [PATCH 082/359] remove unused `underscore` --- src/js/stores/LevelStore.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/js/stores/LevelStore.js b/src/js/stores/LevelStore.js index c5e1a7ba..57ce98f8 100644 --- a/src/js/stores/LevelStore.js +++ b/src/js/stores/LevelStore.js @@ -3,8 +3,6 @@ var AppConstants = require('../constants/AppConstants'); var AppDispatcher = require('../dispatcher/AppDispatcher'); var EventEmitter = require('events').EventEmitter; - -var _ = require('underscore'); var assign = require('object-assign'); var levelSequences = require('../../levels').levelSequences; var sequenceInfo = require('../../levels').sequenceInfo; From d4a2fbb2de7c289ad79a134bfe1099ac4e1c4f05 Mon Sep 17 00:00:00 2001 From: David Nelson Date: Thu, 18 Apr 2019 14:51:14 -0500 Subject: [PATCH 083/359] Explicitly fail when unsupported range operator is specified --- __tests__/git.spec.js | 7 +++++++ src/js/git/index.js | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js index 656d197e..6b7c8ece 100644 --- a/__tests__/git.spec.js +++ b/__tests__/git.spec.js @@ -142,6 +142,13 @@ describe('Git', function() { ); }); + it('Range operator is not supported', function() { + expectTreeAsync( + 'git checkout -b side C0; git cherry-pick C1..C0', + '{"branches":{"master":{"target": "C1","id": "master"},"side":{"target":"C0","id": "side"}},"commits":{"C0":{"parents":[],"id": "C0","rootCommit": true},"C1":{"parents":["C0"],"id": "C1"}},"HEAD":{"id": "HEAD","target":"side"}}' + ); + }); + it('Forces branches', function() { expectTreeAsync( 'git checkout -b side; git branch -f side C0', diff --git a/src/js/git/index.js b/src/js/git/index.js index d03a2075..dcac6ea9 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -1665,7 +1665,7 @@ GitEngine.prototype.resolveStringRef = function(ref) { // Attempt to split ref string into a reference and a string of ~ and ^ modifiers. var startRef = null; var relative = null; - var regex = /^([a-zA-Z0-9]+)(([~\^]\d*)*)/; + var regex = /^([a-zA-Z0-9]+)(([~\^]\d*)*)$/; var matches = regex.exec(ref); if (matches) { startRef = matches[1]; From 6e5d6a64e99d6e580471199279e5dfd55e791f10 Mon Sep 17 00:00:00 2001 From: David Nelson Date: Thu, 18 Apr 2019 17:55:02 -0500 Subject: [PATCH 084/359] Add tests for currently supported log arguments --- __tests__/base.js | 26 +++++++++++++++++++++++++- __tests__/git.spec.js | 40 ++++++++++++++++++++++++++++++++++++++++ src/js/git/headless.js | 5 ++++- 3 files changed, 69 insertions(+), 2 deletions(-) diff --git a/__tests__/base.js b/__tests__/base.js index 76a6ec7f..ba3cf434 100644 --- a/__tests__/base.js +++ b/__tests__/base.js @@ -1,3 +1,5 @@ +var Q = require('q'); + var HeadlessGit = require('../src/js/git/headless').HeadlessGit; var TreeCompare = require('../src/js/graph/treeCompare.js'); @@ -95,6 +97,27 @@ var expectLevelSolved = function(levelBlob) { expectLevelAsync(headless, levelBlob); }; +var runCommand = function(command, resultHandler) { + var headless = new HeadlessGit(); + var deferred = Q.defer(); + var msg = null; + + deferred.promise.then(function(commands) { + msg = commands[commands.length - 1].get('error').get('msg'); + }); + + runs(function() { + headless.sendCommand(command, deferred); + }); + waitsFor(function() { + if(null == msg) { + return false; + } + resultHandler(msg); + return true; + }, 'commands should be finished', 500); +}; + var TIME = 150; // useful for throwing garbage and then expecting one commit var ONE_COMMIT_TREE = '{"branches":{"master":{"target":"C2","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}'; @@ -105,6 +128,7 @@ module.exports = { TIME: TIME, expectTreeAsync: expectTreeAsync, expectLevelSolved: expectLevelSolved, - ONE_COMMIT_TREE: ONE_COMMIT_TREE + ONE_COMMIT_TREE: ONE_COMMIT_TREE, + runCommand: runCommand }; diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js index 656d197e..810f4e9f 100644 --- a/__tests__/git.spec.js +++ b/__tests__/git.spec.js @@ -1,5 +1,6 @@ var base = require('./base'); var expectTreeAsync = base.expectTreeAsync; +var runCommand = base.runCommand; describe('Git', function() { it('Commits', function() { @@ -275,4 +276,43 @@ describe('Git', function() { ); }); + describe('Log supports', function() { + var SETUP = 'git co -b left C0; gc; git merge master; git co -b right C0; gc; git merge master; git co -b all left; git merge right; '; + + it('implied HEAD', function() { + runCommand(SETUP + '; git co right; git log', function(commandMsg) { + expect(commandMsg).toContain('Commit: C0\n'); + expect(commandMsg).toContain('Commit: C1\n'); + expect(commandMsg).not.toContain('Commit: C2\n'); + expect(commandMsg).not.toContain('Commit: C3\n'); + expect(commandMsg).toContain('Commit: C4\n'); + expect(commandMsg).toContain('Commit: C5\n'); + expect(commandMsg).not.toContain('Commit: C6\n'); + }); + }); + + it('single included revision', function() { + runCommand(SETUP + 'git log right', function(commandMsg) { + expect(commandMsg).toContain('Commit: C0\n'); + expect(commandMsg).toContain('Commit: C1\n'); + expect(commandMsg).not.toContain('Commit: C2\n'); + expect(commandMsg).not.toContain('Commit: C3\n'); + expect(commandMsg).toContain('Commit: C4\n'); + expect(commandMsg).toContain('Commit: C5\n'); + expect(commandMsg).not.toContain('Commit: C6\n'); + }); + }); + + it('single excluded revision', function() { + runCommand(SETUP + 'git log all ^right', function(commandMsg) { + expect(commandMsg).not.toContain('Commit: C0\n'); + expect(commandMsg).not.toContain('Commit: C1\n'); + expect(commandMsg).toContain('Commit: C2\n'); + expect(commandMsg).toContain('Commit: C3\n'); + expect(commandMsg).not.toContain('Commit: C4\n'); + expect(commandMsg).not.toContain('Commit: C5\n'); + expect(commandMsg).toContain('Commit: C6\n'); + }); + }); + }); }); diff --git a/src/js/git/headless.js b/src/js/git/headless.js index a82081b9..f2b2c0bc 100644 --- a/src/js/git/headless.js +++ b/src/js/git/headless.js @@ -109,6 +109,8 @@ HeadlessGit.prototype.sendCommand = function(value, entireCommandPromise) { var chain = deferred.promise; var startTime = new Date().getTime(); + var commands = []; + util.splitTextCommand(value, function(commandStr) { chain = chain.then(function() { var commandObj = new Command({ @@ -117,6 +119,7 @@ HeadlessGit.prototype.sendCommand = function(value, entireCommandPromise) { var thisDeferred = Q.defer(); this.gitEngine.dispatch(commandObj, thisDeferred); + commands.push(commandObj); return thisDeferred.promise; }.bind(this)); }, this); @@ -124,7 +127,7 @@ HeadlessGit.prototype.sendCommand = function(value, entireCommandPromise) { chain.then(function() { var nowTime = new Date().getTime(); if (entireCommandPromise) { - entireCommandPromise.resolve(); + entireCommandPromise.resolve(commands); } }); From 8529a3aac76eece97f7dc0ebbf86152ae26ccfbb Mon Sep 17 00:00:00 2001 From: David Nelson Date: Thu, 18 Apr 2019 20:57:06 -0500 Subject: [PATCH 085/359] Implement rev-list This commit introduces the RevisionRange, which more closely follows real git in terms of identifying a range of revisions than the current implementation of log. RevisionRange is being used in the new rev-list command first because it is easy to test for ordering. A future commit will replace the existing implementation of log with RevisionRange. --- __tests__/git.spec.js | 37 ++++++++++++++++++++ src/js/git/commands.js | 12 +++++++ src/js/git/index.js | 79 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+) diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js index 810f4e9f..73c46a82 100644 --- a/__tests__/git.spec.js +++ b/__tests__/git.spec.js @@ -276,6 +276,43 @@ describe('Git', function() { ); }); + describe('RevList', function() { + + it('requires at least 1 argument', function() { + runCommand('git rev-list', function(commandMsg) { + expect(commandMsg).toContain('at least 1'); + }); + }); + + describe('supports', function() { + var SETUP = 'git co -b left C0; gc; git merge master; git co -b right C0; gc; git merge master; git co -b all left; git merge right; '; + + it('single included revision', function() { + runCommand(SETUP + 'git rev-list all', function(commandMsg) { + expect(commandMsg).toBe('C6\nC5\nC4\nC3\nC2\nC1\nC0\n'); + }); + }); + + it('single excluded revision', function() { + runCommand(SETUP + 'git rev-list all ^right', function(commandMsg) { + expect(commandMsg).toBe('C6\nC3\nC2\n'); + }); + }); + + it('multiple included revisions', function() { + runCommand(SETUP + 'git rev-list right left', function(commandMsg) { + expect(commandMsg).toBe('C5\nC4\nC3\nC2\nC1\nC0\n'); + }); + }); + + it('multiple excluded revisions', function() { + runCommand(SETUP + 'git rev-list all ^right ^left', function(commandMsg) { + expect(commandMsg).toBe('C6\n'); + }); + }); + }); + }); + describe('Log supports', function() { var SETUP = 'git co -b left C0; gc; git merge master; git co -b right C0; gc; git merge master; git co -b all left; git merge right; '; diff --git a/src/js/git/commands.js b/src/js/git/commands.js index 4c083d5e..83e21e80 100644 --- a/src/js/git/commands.js +++ b/src/js/git/commands.js @@ -574,6 +574,18 @@ var commandConfig = { } }, + revlist: { + dontCountForGolf: true, + displayName: 'rev-list', + regex: /^git +rev-list($|\s)/, + execute: function(engine, command) { + var generalArgs = command.getGeneralArgs(); + command.validateArgBounds(generalArgs, 1); + + engine.revlist(generalArgs); + } + }, + log: { dontCountForGolf: true, regex: /^git +log($|\s)/, diff --git a/src/js/git/index.js b/src/js/git/index.js index d03a2075..ff811f8e 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -2740,6 +2740,20 @@ GitEngine.prototype.logWithout = function(ref, omitBranch) { this.log(ref, Graph.getUpstreamSet(this, omitBranch)); }; +GitEngine.prototype.revlist = function(refs) { + var range = new RevisionRange(this, refs); + + // now go through and collect ids + var bigLogStr = ''; + range.revisions.forEach(function(c) { + bigLogStr += c.id + '\n'; + }); + + throw new CommandResult({ + msg: bigLogStr + }); +}; + GitEngine.prototype.log = function(ref, omitSet) { // omit set is for doing stuff like git log branchA ^branchB omitSet = omitSet || {}; @@ -3079,6 +3093,71 @@ var Tag = Ref.extend({ } }); +function RevisionRange(engine, specifiers) { + this.engine = engine; + this.included = {}; + this.excluded = {}; + this.revisions = []; + + this.processSpecifiers(specifiers); +} + +RevisionRange.prototype.isExclusion = function(specifier) { + return specifier.startsWith('^'); +}; + +RevisionRange.prototype.processSpecifiers = function(specifiers) { + var self = this; + var inclusions = []; + var exclusions = []; + + specifiers.forEach(function(specifier) { + if(self.isExclusion(specifier)) { + exclusions.push(specifier.slice(1)); + } else { + inclusions.push(specifier); + } + }); + + exclusions.forEach(function(exclusion) { + self.addExcluded(Graph.getUpstreamSet(self.engine, exclusion)); + }); + + inclusions.forEach(function(inclusion) { + self.addIncluded(Graph.getUpstreamSet(self.engine, inclusion)); + }); + + var includedKeys = Array.from(Object.keys(self.included)); + + self.revisions = includedKeys.map(function(revision) { + return self.engine.resolveStringRef(revision); + }); + self.revisions.sort(self.engine.dateSortFunc); + self.revisions.reverse(); +}; + +RevisionRange.prototype.isExcluded = function(revision) { + return this.excluded.hasOwnProperty(revision); +}; + +RevisionRange.prototype.addExcluded = function(setToExclude) { + var self = this; + Object.keys(setToExclude).forEach(function(toExclude) { + if(!self.isExcluded(toExclude)) { + self.excluded[toExclude] = true; + } + }); +}; + +RevisionRange.prototype.addIncluded = function(setToInclude) { + var self = this; + Object.keys(setToInclude).forEach(function(toInclude) { + if(!self.isExcluded(toInclude)) { + self.included[toInclude] = true; + } + }); +}; + exports.GitEngine = GitEngine; exports.Commit = Commit; exports.Branch = Branch; From b9f8e191628693b94c0fa4ee96b32442ea6c6878 Mon Sep 17 00:00:00 2001 From: David Nelson Date: Thu, 18 Apr 2019 20:57:29 -0500 Subject: [PATCH 086/359] Implement log using RevisionRange This changes the implementation of the "log" command to use the RevisionRange functionality. RevisionRange sorts the results in order of reverse create time, to match real git. This is a change from the previous implementation of log, which essentially produced a breadth-first ordering. --- __tests__/git.spec.js | 24 ++++++++++++++++++ src/js/git/commands.js | 15 ++--------- src/js/git/index.js | 47 +++++++++++------------------------ src/js/models/commandModel.js | 14 ++++++----- 4 files changed, 49 insertions(+), 51 deletions(-) diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js index 73c46a82..fd10ad41 100644 --- a/__tests__/git.spec.js +++ b/__tests__/git.spec.js @@ -351,5 +351,29 @@ describe('Git', function() { expect(commandMsg).toContain('Commit: C6\n'); }); }); + + it('multiple included revisions', function() { + runCommand(SETUP + 'git log right left', function(commandMsg) { + expect(commandMsg).toContain('Commit: C0\n'); + expect(commandMsg).toContain('Commit: C1\n'); + expect(commandMsg).toContain('Commit: C2\n'); + expect(commandMsg).toContain('Commit: C3\n'); + expect(commandMsg).toContain('Commit: C4\n'); + expect(commandMsg).toContain('Commit: C5\n'); + expect(commandMsg).not.toContain('Commit: C6\n'); + }); + }); + + it('multiple excluded revisions', function() { + runCommand(SETUP + 'git log all ^right ^left', function(commandMsg) { + expect(commandMsg).not.toContain('Commit: C0\n'); + expect(commandMsg).not.toContain('Commit: C1\n'); + expect(commandMsg).not.toContain('Commit: C2\n'); + expect(commandMsg).not.toContain('Commit: C3\n'); + expect(commandMsg).not.toContain('Commit: C4\n'); + expect(commandMsg).not.toContain('Commit: C5\n'); + expect(commandMsg).toContain('Commit: C6\n'); + }); + }); }); }); diff --git a/src/js/git/commands.js b/src/js/git/commands.js index 83e21e80..50e93d5a 100644 --- a/src/js/git/commands.js +++ b/src/js/git/commands.js @@ -592,19 +592,8 @@ var commandConfig = { execute: function(engine, command) { var generalArgs = command.getGeneralArgs(); - if (generalArgs.length == 2) { - // do fancy git log branchA ^branchB - if (generalArgs[1][0] == '^') { - engine.logWithout(generalArgs[0], generalArgs[1]); - } else { - throw new GitError({ - msg: intl.str('git-error-options') - }); - } - } - - command.oneArgImpliedHead(generalArgs); - engine.log(generalArgs[0]); + command.impliedHead(generalArgs, 0); + engine.log(generalArgs); } }, diff --git a/src/js/git/index.js b/src/js/git/index.js index ff811f8e..c0c64024 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -2744,9 +2744,8 @@ GitEngine.prototype.revlist = function(refs) { var range = new RevisionRange(this, refs); // now go through and collect ids - var bigLogStr = ''; - range.revisions.forEach(function(c) { - bigLogStr += c.id + '\n'; + var bigLogStr = range.formatRevisions(function(c) { + return c.id + '\n'; }); throw new CommandResult({ @@ -2754,37 +2753,13 @@ GitEngine.prototype.revlist = function(refs) { }); }; -GitEngine.prototype.log = function(ref, omitSet) { - // omit set is for doing stuff like git log branchA ^branchB - omitSet = omitSet || {}; - // first get the commit we referenced - var commit = this.getCommitFromRef(ref); - - // then get as many far back as we can from here, order by commit date - var toDump = []; - var pQueue = [commit]; - - var seen = {}; - - while (pQueue.length) { - var popped = pQueue.shift(0); - if (seen[popped.get('id')] || omitSet[popped.get('id')]) { - continue; - } - seen[popped.get('id')] = true; - - toDump.push(popped); - - if (popped.get('parents') && popped.get('parents').length) { - pQueue = pQueue.concat(popped.get('parents')); - } - } +GitEngine.prototype.log = function(refs) { + var range = new RevisionRange(this, refs); // now go through and collect logs - var bigLogStr = ''; - toDump.forEach(function (c) { - bigLogStr += c.getLogEntry(); - }, this); + var bigLogStr = range.formatRevisions(function(c) { + return c.getLogEntry(); + }); throw new CommandResult({ msg: bigLogStr @@ -3158,6 +3133,14 @@ RevisionRange.prototype.addIncluded = function(setToInclude) { }); }; +RevisionRange.prototype.formatRevisions = function(revisionFormatter) { + var output = ""; + this.revisions.forEach(function(c) { + output += revisionFormatter(c); + }); + return output; +}; + exports.GitEngine = GitEngine; exports.Commit = Commit; exports.Branch = Branch; diff --git a/src/js/models/commandModel.js b/src/js/models/commandModel.js index 76e94d61..138f9024 100644 --- a/src/js/models/commandModel.js +++ b/src/js/models/commandModel.js @@ -126,18 +126,14 @@ var Command = Backbone.Model.extend({ oneArgImpliedHead: function(args, option) { this.validateArgBounds(args, 0, 1, option); // and if it's one, add a HEAD to the back - if (args.length === 0) { - args.push('HEAD'); - } + this.impliedHead(args, 0); }, twoArgsImpliedHead: function(args, option) { // our args we expect to be between 1 and 2 this.validateArgBounds(args, 1, 2, option); // and if it's one, add a HEAD to the back - if (args.length == 1) { - args.push('HEAD'); - } + this.impliedHead(args, 1); }, oneArgImpliedOrigin: function(args) { @@ -151,6 +147,12 @@ var Command = Backbone.Model.extend({ this.validateArgBounds(args, 0, 2); }, + impliedHead: function(args, min) { + if(args.length == min) { + args.push('HEAD'); + } + }, + // this is a little utility class to help arg validation that happens over and over again validateArgBounds: function(args, lower, upper, option) { var what = (option === undefined) ? From ff2adc069037cd921d1f3571ea5b924694a19d75 Mon Sep 17 00:00:00 2001 From: Hongarc Date: Fri, 19 Apr 2019 20:19:16 +0700 Subject: [PATCH 087/359] chore: add PRs wellcome to `README.md` --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9c187699..9737ca2f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # LearnGitBranching [![Build Status](https://travis-ci.org/pcottle/learnGitBranching.svg?branch=master)](https://travis-ci.org/pcottle/learnGitBranching) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?)](https://github.com/pcottle/learnGitBranching/pulls) LearnGitBranching is a git repository visualizer, sandbox, and a series of educational tutorials and challenges. Its primary purpose is to help developers understand git through the power of visualization (something that's absent when working on the command line). This is achieved through a game with different levels to get acquainted with the different git commands. From 58f2dc41560f56b502066494124a1dbc6b679e1a Mon Sep 17 00:00:00 2001 From: Hongarc Date: Mon, 22 Apr 2019 06:42:33 +0700 Subject: [PATCH 088/359] Use `Object.assign` instead of module `assign` --- src/js/stores/CommandLineStore.js | 4 +--- src/js/stores/GlobalStateStore.js | 4 +--- src/js/stores/LevelStore.js | 5 ++--- src/js/stores/LocaleStore.js | 8 +++----- 4 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/js/stores/CommandLineStore.js b/src/js/stores/CommandLineStore.js index c97e80d6..a2cf9fa1 100644 --- a/src/js/stores/CommandLineStore.js +++ b/src/js/stores/CommandLineStore.js @@ -4,8 +4,6 @@ var AppConstants = require('../constants/AppConstants'); var AppDispatcher = require('../dispatcher/AppDispatcher'); var EventEmitter = require('events').EventEmitter; -var assign = require('object-assign'); - var ActionTypes = AppConstants.ActionTypes; var COMMAND_HISTORY_KEY = 'lgb_CommandHistory'; var COMMAND_HISTORY_MAX_LENGTH = 100; @@ -38,7 +36,7 @@ function _saveToLocalStorage() { } } -var CommandLineStore = assign( +var CommandLineStore = Object.assign( {}, EventEmitter.prototype, AppConstants.StoreSubscribePrototype, diff --git a/src/js/stores/GlobalStateStore.js b/src/js/stores/GlobalStateStore.js index 35897d2d..50f764bb 100644 --- a/src/js/stores/GlobalStateStore.js +++ b/src/js/stores/GlobalStateStore.js @@ -4,15 +4,13 @@ var AppConstants = require('../constants/AppConstants'); var AppDispatcher = require('../dispatcher/AppDispatcher'); var EventEmitter = require('events').EventEmitter; -var assign = require('object-assign'); - var ActionTypes = AppConstants.ActionTypes; var _isAnimating = false; var _flipTreeY = false; var _numLevelsSolved = 0; -var GlobalStateStore = assign( +var GlobalStateStore = Object.assign( {}, EventEmitter.prototype, AppConstants.StoreSubscribePrototype, diff --git a/src/js/stores/LevelStore.js b/src/js/stores/LevelStore.js index 57ce98f8..e486dac8 100644 --- a/src/js/stores/LevelStore.js +++ b/src/js/stores/LevelStore.js @@ -3,7 +3,6 @@ var AppConstants = require('../constants/AppConstants'); var AppDispatcher = require('../dispatcher/AppDispatcher'); var EventEmitter = require('events').EventEmitter; -var assign = require('object-assign'); var levelSequences = require('../../levels').levelSequences; var sequenceInfo = require('../../levels').sequenceInfo; @@ -62,7 +61,7 @@ Object.keys(levelSequences).forEach(function(levelSequenceName) { validateLevel(level); var id = levelSequenceName + String(index + 1); - var compiledLevel = assign( + var compiledLevel = Object.assign( {}, level, { @@ -78,7 +77,7 @@ Object.keys(levelSequences).forEach(function(levelSequenceName) { }); }); -var LevelStore = assign( +var LevelStore = Object.assign( {}, EventEmitter.prototype, AppConstants.StoreSubscribePrototype, diff --git a/src/js/stores/LocaleStore.js b/src/js/stores/LocaleStore.js index 544a5af7..2be9c38b 100644 --- a/src/js/stores/LocaleStore.js +++ b/src/js/stores/LocaleStore.js @@ -4,8 +4,6 @@ var AppConstants = require('../constants/AppConstants'); var AppDispatcher = require('../dispatcher/AppDispatcher'); var EventEmitter = require('events').EventEmitter; -var assign = require('object-assign'); - var ActionTypes = AppConstants.ActionTypes; var DEFAULT_LOCALE = 'en_US'; @@ -55,7 +53,7 @@ function _getLocaleFromHeader(langString) { } var _locale = DEFAULT_LOCALE; -var LocaleStore = assign( +var LocaleStore = Object.assign( {}, EventEmitter.prototype, AppConstants.StoreSubscribePrototype, @@ -66,11 +64,11 @@ AppConstants.StoreSubscribePrototype, }, getLangLocaleMap: function() { - return assign({}, langLocaleMap); + return Object.assign({}, langLocaleMap); }, getHeaderLocaleMap: function() { - return assign({}, headerLocaleMap); + return Object.assign({}, headerLocaleMap); }, getLocale: function() { From 10bcc0a02fe01823fa40708a948153a017100704 Mon Sep 17 00:00:00 2001 From: Hongarc Date: Mon, 22 Apr 2019 06:44:05 +0700 Subject: [PATCH 089/359] Remove all white space at end of line --- assets/emoji_table.rtf | 1674 +++++++++++------------ src/js/commands/index.js | 2 +- src/js/intl/index.js | 2 +- src/js/mercurial/commands.js | 2 +- src/js/models/commandModel.js | 2 +- src/js/react_views/LevelToolbarView.jsx | 2 +- src/js/util/constants.js | 2 +- src/js/util/throttle.js | 2 +- src/js/views/index.js | 2 +- src/levels/mixed/tags.js | 2 +- src/levels/rampup/cherryPick.js | 2 +- src/levels/rampup/interactiveRebase.js | 2 +- src/levels/remote/fetchArgs.js | 2 +- src/levels/remote/pushArgs2.js | 2 +- src/levels/remote/tracking.js | 2 +- src/style/rainbows.css | 36 +- src/template.index.html | 2 +- 17 files changed, 870 insertions(+), 870 deletions(-) diff --git a/assets/emoji_table.rtf b/assets/emoji_table.rtf index 6704f314..14ccbdc8 100644 --- a/assets/emoji_table.rtf +++ b/assets/emoji_table.rtf @@ -6,2518 +6,2518 @@ \margl1440\margr1440\vieww18700\viewh19820\viewkind0 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural -\f0\fs24 \cf0 \uc0\u55357 \u56833 +\f0\fs24 \cf0 \uc0\u55357 \u56833 \f1 \\ud83d\\ude01 grinning face with smiling eyes\ -\f0 \uc0\u55357 \u56834 +\f0 \uc0\u55357 \u56834 \f1 \\ud83d\\ude02 face with tears of joy\ -\f0 \uc0\u55357 \u56835 +\f0 \uc0\u55357 \u56835 \f1 \\ud83d\\ude03 smiling face with open mouth\ -\f0 \uc0\u55357 \u56836 +\f0 \uc0\u55357 \u56836 \f1 \\ud83d\\ude04 smiling face with open mouth and smiling eyes\ -\f0 \uc0\u55357 \u56837 +\f0 \uc0\u55357 \u56837 \f1 \\ud83d\\ude05 smiling face with open mouth and cold sweat\ -\f0 \uc0\u55357 \u56838 +\f0 \uc0\u55357 \u56838 \f1 \\ud83d\\ude06 smiling face with open mouth and tightly-closed eyes\ -\f0 \uc0\u55357 \u56841 +\f0 \uc0\u55357 \u56841 \f1 \\ud83d\\ude09 winking face\ -\f0 \uc0\u55357 \u56842 +\f0 \uc0\u55357 \u56842 \f1 \\ud83d\\ude0a smiling face with smiling eyes\ -\f0 \uc0\u55357 \u56843 +\f0 \uc0\u55357 \u56843 \f1 \\ud83d\\ude0b face savouring delicious food\ -\f0 \uc0\u55357 \u56844 +\f0 \uc0\u55357 \u56844 \f1 \\ud83d\\ude0c relieved face\ -\f0 \uc0\u55357 \u56845 +\f0 \uc0\u55357 \u56845 \f1 \\ud83d\\ude0d smiling face with heart-shaped eyes\ -\f0 \uc0\u55357 \u56847 +\f0 \uc0\u55357 \u56847 \f1 \\ud83d\\ude0f smirking face\ -\f0 \uc0\u55357 \u56850 +\f0 \uc0\u55357 \u56850 \f1 \\ud83d\\ude12 unamused face\ -\f0 \uc0\u55357 \u56851 +\f0 \uc0\u55357 \u56851 \f1 \\ud83d\\ude13 face with cold sweat\ -\f0 \uc0\u55357 \u56852 +\f0 \uc0\u55357 \u56852 \f1 \\ud83d\\ude14 pensive face\ -\f0 \uc0\u55357 \u56854 +\f0 \uc0\u55357 \u56854 \f1 \\ud83d\\ude16 confounded face\ -\f0 \uc0\u55357 \u56856 +\f0 \uc0\u55357 \u56856 \f1 \\ud83d\\ude18 face throwing a kiss\ -\f0 \uc0\u55357 \u56858 +\f0 \uc0\u55357 \u56858 \f1 \\ud83d\\ude1a kissing face with closed eyes\ -\f0 \uc0\u55357 \u56860 +\f0 \uc0\u55357 \u56860 \f1 \\ud83d\\ude1c face with stuck-out tongue and winking eye\ -\f0 \uc0\u55357 \u56861 +\f0 \uc0\u55357 \u56861 \f1 \\ud83d\\ude1d face with stuck-out tongue and tightly-closed eyes\ -\f0 \uc0\u55357 \u56862 +\f0 \uc0\u55357 \u56862 \f1 \\ud83d\\ude1e disappointed face\ -\f0 \uc0\u55357 \u56864 +\f0 \uc0\u55357 \u56864 \f1 \\ud83d\\ude20 angry face\ -\f0 \uc0\u55357 \u56865 +\f0 \uc0\u55357 \u56865 \f1 \\ud83d\\ude21 pouting face\ -\f0 \uc0\u55357 \u56866 +\f0 \uc0\u55357 \u56866 \f1 \\ud83d\\ude22 crying face\ -\f0 \uc0\u55357 \u56867 +\f0 \uc0\u55357 \u56867 \f1 \\ud83d\\ude23 persevering face\ -\f0 \uc0\u55357 \u56868 +\f0 \uc0\u55357 \u56868 \f1 \\ud83d\\ude24 face with look of triumph\ -\f0 \uc0\u55357 \u56869 +\f0 \uc0\u55357 \u56869 \f1 \\ud83d\\ude25 disappointed but relieved face\ -\f0 \uc0\u55357 \u56872 +\f0 \uc0\u55357 \u56872 \f1 \\ud83d\\ude28 fearful face\ -\f0 \uc0\u55357 \u56873 +\f0 \uc0\u55357 \u56873 \f1 \\ud83d\\ude29 weary face\ -\f0 \uc0\u55357 \u56874 +\f0 \uc0\u55357 \u56874 \f1 \\ud83d\\ude2a sleepy face\ -\f0 \uc0\u55357 \u56875 +\f0 \uc0\u55357 \u56875 \f1 \\ud83d\\ude2b tired face\ -\f0 \uc0\u55357 \u56877 +\f0 \uc0\u55357 \u56877 \f1 \\ud83d\\ude2d loudly crying face\ -\f0 \uc0\u55357 \u56880 +\f0 \uc0\u55357 \u56880 \f1 \\ud83d\\ude30 face with open mouth and cold sweat\ -\f0 \uc0\u55357 \u56881 +\f0 \uc0\u55357 \u56881 \f1 \\ud83d\\ude31 face screaming in fear\ -\f0 \uc0\u55357 \u56882 +\f0 \uc0\u55357 \u56882 \f1 \\ud83d\\ude32 astonished face\ -\f0 \uc0\u55357 \u56883 +\f0 \uc0\u55357 \u56883 \f1 \\ud83d\\ude33 flushed face\ -\f0 \uc0\u55357 \u56885 +\f0 \uc0\u55357 \u56885 \f1 \\ud83d\\ude35 dizzy face\ -\f0 \uc0\u55357 \u56887 +\f0 \uc0\u55357 \u56887 \f1 \\ud83d\\ude37 face with medical mask\ -\f0 \uc0\u55357 \u56888 +\f0 \uc0\u55357 \u56888 \f1 \\ud83d\\ude38 grinning cat face with smiling eyes\ -\f0 \uc0\u55357 \u56889 +\f0 \uc0\u55357 \u56889 \f1 \\ud83d\\ude39 cat face with tears of joy\ -\f0 \uc0\u55357 \u56890 +\f0 \uc0\u55357 \u56890 \f1 \\ud83d\\ude3a smiling cat face with open mouth\ -\f0 \uc0\u55357 \u56891 +\f0 \uc0\u55357 \u56891 \f1 \\ud83d\\ude3b smiling cat face with heart-shaped eyes\ -\f0 \uc0\u55357 \u56892 +\f0 \uc0\u55357 \u56892 \f1 \\ud83d\\ude3c cat face with wry smile\ -\f0 \uc0\u55357 \u56893 +\f0 \uc0\u55357 \u56893 \f1 \\ud83d\\ude3d kissing cat face with closed eyes\ -\f0 \uc0\u55357 \u56894 +\f0 \uc0\u55357 \u56894 \f1 \\ud83d\\ude3e pouting cat face\ -\f0 \uc0\u55357 \u56895 +\f0 \uc0\u55357 \u56895 \f1 \\ud83d\\ude3f crying cat face\ -\f0 \uc0\u55357 \u56896 +\f0 \uc0\u55357 \u56896 \f1 \\ud83d\\ude40 weary cat face\ -\f0 \uc0\u55357 \u56901 +\f0 \uc0\u55357 \u56901 \f1 \\ud83d\\ude45 face with no good gesture\ -\f0 \uc0\u55357 \u56902 +\f0 \uc0\u55357 \u56902 \f1 \\ud83d\\ude46 face with ok gesture\ -\f0 \uc0\u55357 \u56903 +\f0 \uc0\u55357 \u56903 \f1 \\ud83d\\ude47 person bowing deeply\ -\f0 \uc0\u55357 \u56904 +\f0 \uc0\u55357 \u56904 \f1 \\ud83d\\ude48 see-no-evil monkey\ -\f0 \uc0\u55357 \u56905 +\f0 \uc0\u55357 \u56905 \f1 \\ud83d\\ude49 hear-no-evil monkey\ -\f0 \uc0\u55357 \u56906 +\f0 \uc0\u55357 \u56906 \f1 \\ud83d\\ude4a speak-no-evil monkey\ -\f0 \uc0\u55357 \u56907 +\f0 \uc0\u55357 \u56907 \f1 \\ud83d\\ude4b happy person raising one hand\ -\f0 \uc0\u55357 \u56908 +\f0 \uc0\u55357 \u56908 \f1 \\ud83d\\ude4c person raising both hands in celebration\ -\f0 \uc0\u55357 \u56909 +\f0 \uc0\u55357 \u56909 \f1 \\ud83d\\ude4d person frowning\ -\f0 \uc0\u55357 \u56910 +\f0 \uc0\u55357 \u56910 \f1 \\ud83d\\ude4e person with pouting face\ -\f0 \uc0\u55357 \u56911 +\f0 \uc0\u55357 \u56911 \f1 \\ud83d\\ude4f person with folded hands\ -\f2 \uc0\u9986 +\f2 \uc0\u9986 \f1 \\u2702 black scissors\ -\f0 \uc0\u9989 +\f0 \uc0\u9989 \f1 \\u2705 white heavy check mark\ -\f2 \uc0\u9992 +\f2 \uc0\u9992 \f1 \\u2708 airplane\ -\f2 \uc0\u9993 +\f2 \uc0\u9993 \f1 \\u2709 envelope\ -\f0 \uc0\u9994 +\f0 \uc0\u9994 \f1 \\u270a raised fist\ -\f0 \uc0\u9995 +\f0 \uc0\u9995 \f1 \\u270b raised hand\ -\f2 \uc0\u9996 +\f2 \uc0\u9996 \f1 \\u270c victory hand\ -\f2 \uc0\u9999 +\f2 \uc0\u9999 \f1 \\u270f pencil\ -\f2 \uc0\u10002 +\f2 \uc0\u10002 \f1 \\u2712 black nib\ -\f2 \uc0\u10004 +\f2 \uc0\u10004 \f1 \\u2714 heavy check mark\ -\f2 \uc0\u10006 +\f2 \uc0\u10006 \f1 \\u2716 heavy multiplication x\ -\f0 \uc0\u10024 +\f0 \uc0\u10024 \f1 \\u2728 sparkles\ -\f2 \uc0\u10035 +\f2 \uc0\u10035 \f1 \\u2733 eight spoked asterisk\ -\f2 \uc0\u10036 +\f2 \uc0\u10036 \f1 \\u2734 eight pointed black star\ -\f2 \uc0\u10052 +\f2 \uc0\u10052 \f1 \\u2744 snowflake\ -\f2 \uc0\u10055 +\f2 \uc0\u10055 \f1 \\u2747 sparkle\ -\f0 \uc0\u10060 +\f0 \uc0\u10060 \f1 \\u274c cross mark\ -\f0 \uc0\u10062 +\f0 \uc0\u10062 \f1 \\u274e negative squared cross mark\ -\f0 \uc0\u10067 +\f0 \uc0\u10067 \f1 \\u2753 black question mark ornament\ -\f0 \uc0\u10068 +\f0 \uc0\u10068 \f1 \\u2754 white question mark ornament\ -\f0 \uc0\u10069 +\f0 \uc0\u10069 \f1 \\u2755 white exclamation mark ornament\ -\f0 \uc0\u10071 +\f0 \uc0\u10071 \f1 \\u2757 heavy exclamation mark symbol\ -\f2 \uc0\u10084 +\f2 \uc0\u10084 \f1 \\u2764 heavy black heart\ -\f0 \uc0\u10133 +\f0 \uc0\u10133 \f1 \\u2795 heavy plus sign\ -\f0 \uc0\u10134 +\f0 \uc0\u10134 \f1 \\u2796 heavy minus sign\ -\f0 \uc0\u10135 +\f0 \uc0\u10135 \f1 \\u2797 heavy division sign\ -\f2 \uc0\u10145 +\f2 \uc0\u10145 \f1 \\u27a1 black rightwards arrow\ -\f0 \uc0\u10160 +\f0 \uc0\u10160 \f1 \\u27b0 curly loop\ -\f0 \uc0\u55357 \u56960 +\f0 \uc0\u55357 \u56960 \f1 \\ud83d\\ude80 rocket\ -\f0 \uc0\u55357 \u56963 +\f0 \uc0\u55357 \u56963 \f1 \\ud83d\\ude83 railway car\ -\f0 \uc0\u55357 \u56964 +\f0 \uc0\u55357 \u56964 \f1 \\ud83d\\ude84 high-speed train\ -\f0 \uc0\u55357 \u56965 +\f0 \uc0\u55357 \u56965 \f1 \\ud83d\\ude85 high-speed train with bullet nose\ -\f0 \uc0\u55357 \u56967 +\f0 \uc0\u55357 \u56967 \f1 \\ud83d\\ude87 metro\ -\f0 \uc0\u55357 \u56969 +\f0 \uc0\u55357 \u56969 \f1 \\ud83d\\ude89 station\ -\f0 \uc0\u55357 \u56972 +\f0 \uc0\u55357 \u56972 \f1 \\ud83d\\ude8c bus\ -\f0 \uc0\u55357 \u56975 +\f0 \uc0\u55357 \u56975 \f1 \\ud83d\\ude8f bus stop\ -\f0 \uc0\u55357 \u56977 +\f0 \uc0\u55357 \u56977 \f1 \\ud83d\\ude91 ambulance\ -\f0 \uc0\u55357 \u56978 +\f0 \uc0\u55357 \u56978 \f1 \\ud83d\\ude92 fire engine\ -\f0 \uc0\u55357 \u56979 +\f0 \uc0\u55357 \u56979 \f1 \\ud83d\\ude93 police car\ -\f0 \uc0\u55357 \u56981 +\f0 \uc0\u55357 \u56981 \f1 \\ud83d\\ude95 taxi\ -\f0 \uc0\u55357 \u56983 +\f0 \uc0\u55357 \u56983 \f1 \\ud83d\\ude97 automobile\ -\f0 \uc0\u55357 \u56985 +\f0 \uc0\u55357 \u56985 \f1 \\ud83d\\ude99 recreational vehicle\ -\f0 \uc0\u55357 \u56986 +\f0 \uc0\u55357 \u56986 \f1 \\ud83d\\ude9a delivery truck\ -\f0 \uc0\u55357 \u56994 +\f0 \uc0\u55357 \u56994 \f1 \\ud83d\\udea2 ship\ -\f0 \uc0\u55357 \u56996 +\f0 \uc0\u55357 \u56996 \f1 \\ud83d\\udea4 speedboat\ -\f0 \uc0\u55357 \u56997 +\f0 \uc0\u55357 \u56997 \f1 \\ud83d\\udea5 horizontal traffic light\ -\f0 \uc0\u55357 \u56999 +\f0 \uc0\u55357 \u56999 \f1 \\ud83d\\udea7 construction sign\ -\f0 \uc0\u55357 \u57000 +\f0 \uc0\u55357 \u57000 \f1 \\ud83d\\udea8 police cars revolving light\ -\f0 \uc0\u55357 \u57001 +\f0 \uc0\u55357 \u57001 \f1 \\ud83d\\udea9 triangular flag on post\ -\f0 \uc0\u55357 \u57002 +\f0 \uc0\u55357 \u57002 \f1 \\ud83d\\udeaa door\ -\f0 \uc0\u55357 \u57003 +\f0 \uc0\u55357 \u57003 \f1 \\ud83d\\udeab no entry sign\ -\f0 \uc0\u55357 \u57004 +\f0 \uc0\u55357 \u57004 \f1 \\ud83d\\udeac smoking symbol\ -\f0 \uc0\u55357 \u57005 +\f0 \uc0\u55357 \u57005 \f1 \\ud83d\\udead no smoking symbol\ -\f0 \uc0\u55357 \u57010 +\f0 \uc0\u55357 \u57010 \f1 \\ud83d\\udeb2 bicycle\ -\f0 \uc0\u55357 \u57014 +\f0 \uc0\u55357 \u57014 \f1 \\ud83d\\udeb6 pedestrian\ -\f0 \uc0\u55357 \u57017 +\f0 \uc0\u55357 \u57017 \f1 \\ud83d\\udeb9 mens symbol\ -\f0 \uc0\u55357 \u57018 +\f0 \uc0\u55357 \u57018 \f1 \\ud83d\\udeba womens symbol\ -\f0 \uc0\u55357 \u57019 +\f0 \uc0\u55357 \u57019 \f1 \\ud83d\\udebb restroom\ -\f0 \uc0\u55357 \u57020 +\f0 \uc0\u55357 \u57020 \f1 \\ud83d\\udebc baby symbol\ -\f0 \uc0\u55357 \u57021 +\f0 \uc0\u55357 \u57021 \f1 \\ud83d\\udebd toilet\ -\f0 \uc0\u55357 \u57022 +\f0 \uc0\u55357 \u57022 \f1 \\ud83d\\udebe water closet\ -\f0 \uc0\u55357 \u57024 +\f0 \uc0\u55357 \u57024 \f1 \\ud83d\\udec0 bath\ -\f3 \uc0\u9410 +\f3 \uc0\u9410 \f1 \\u24c2 circled latin capital letter m\ -\f3 \uc0\u55356 \u56688 +\f3 \uc0\u55356 \u56688 \f1 \\ud83c\\udd70 negative squared latin capital letter a\ -\f3 \uc0\u55356 \u56689 +\f3 \uc0\u55356 \u56689 \f1 \\ud83c\\udd71 negative squared latin capital letter b\ -\f3 \uc0\u55356 \u56702 +\f3 \uc0\u55356 \u56702 \f1 \\ud83c\\udd7e negative squared latin capital letter o\ -\f3 \uc0\u55356 \u56703 +\f3 \uc0\u55356 \u56703 \f1 \\ud83c\\udd7f negative squared latin capital letter p\ -\f0 \uc0\u55356 \u56718 +\f0 \uc0\u55356 \u56718 \f1 \\ud83c\\udd8e negative squared ab\ -\f0 \uc0\u55356 \u56721 +\f0 \uc0\u55356 \u56721 \f1 \\ud83c\\udd91 squared cl\ -\f0 \uc0\u55356 \u56722 +\f0 \uc0\u55356 \u56722 \f1 \\ud83c\\udd92 squared cool\ -\f0 \uc0\u55356 \u56723 +\f0 \uc0\u55356 \u56723 \f1 \\ud83c\\udd93 squared free\ -\f0 \uc0\u55356 \u56724 +\f0 \uc0\u55356 \u56724 \f1 \\ud83c\\udd94 squared id\ -\f0 \uc0\u55356 \u56725 +\f0 \uc0\u55356 \u56725 \f1 \\ud83c\\udd95 squared new\ -\f0 \uc0\u55356 \u56726 +\f0 \uc0\u55356 \u56726 \f1 \\ud83c\\udd96 squared ng\ -\f0 \uc0\u55356 \u56727 +\f0 \uc0\u55356 \u56727 \f1 \\ud83c\\udd97 squared ok\ -\f0 \uc0\u55356 \u56728 +\f0 \uc0\u55356 \u56728 \f1 \\ud83c\\udd98 squared sos\ -\f0 \uc0\u55356 \u56729 +\f0 \uc0\u55356 \u56729 \f1 \\ud83c\\udd99 squared up with exclamation mark\ -\f0 \uc0\u55356 \u56730 +\f0 \uc0\u55356 \u56730 \f1 \\ud83c\\udd9a squared vs\ -\f0 \uc0\u55356 \u56809 \u55356 \u56810 +\f0 \uc0\u55356 \u56809 \u55356 \u56810 \f1 \\ud83c\\udde9\\ud83c\\uddea regional indicator symbol letter d + regional indicator symbol letter e\ -\f0 \uc0\u55356 \u56812 \u55356 \u56807 +\f0 \uc0\u55356 \u56812 \u55356 \u56807 \f1 \\ud83c\\uddec\\ud83c\\udde7 regional indicator symbol letter g + regional indicator symbol letter b\ -\f0 \uc0\u55356 \u56808 \u55356 \u56819 +\f0 \uc0\u55356 \u56808 \u55356 \u56819 \f1 \\ud83c\\udde8\\ud83c\\uddf3 regional indicator symbol letter c + regional indicator symbol letter n\ -\f0 \uc0\u55356 \u56815 \u55356 \u56821 +\f0 \uc0\u55356 \u56815 \u55356 \u56821 \f1 \\ud83c\\uddef\\ud83c\\uddf5 regional indicator symbol letter j + regional indicator symbol letter p\ -\f0 \uc0\u55356 \u56816 \u55356 \u56823 +\f0 \uc0\u55356 \u56816 \u55356 \u56823 \f1 \\ud83c\\uddf0\\ud83c\\uddf7 regional indicator symbol letter k + regional indicator symbol letter r\ -\f0 \uc0\u55356 \u56811 \u55356 \u56823 +\f0 \uc0\u55356 \u56811 \u55356 \u56823 \f1 \\ud83c\\uddeb\\ud83c\\uddf7 regional indicator symbol letter f + regional indicator symbol letter r\ -\f0 \uc0\u55356 \u56810 \u55356 \u56824 +\f0 \uc0\u55356 \u56810 \u55356 \u56824 \f1 \\ud83c\\uddea\\ud83c\\uddf8 regional indicator symbol letter e + regional indicator symbol letter s\ -\f0 \uc0\u55356 \u56814 \u55356 \u56825 +\f0 \uc0\u55356 \u56814 \u55356 \u56825 \f1 \\ud83c\\uddee\\ud83c\\uddf9 regional indicator symbol letter i + regional indicator symbol letter t\ -\f0 \uc0\u55356 \u56826 \u55356 \u56824 +\f0 \uc0\u55356 \u56826 \u55356 \u56824 \f1 \\ud83c\\uddfa\\ud83c\\uddf8 regional indicator symbol letter u + regional indicator symbol letter s\ -\f0 \uc0\u55356 \u56823 \u55356 \u56826 +\f0 \uc0\u55356 \u56823 \u55356 \u56826 \f1 \\ud83c\\uddf7\\ud83c\\uddfa regional indicator symbol letter r + regional indicator symbol letter u\ -\f0 \uc0\u55356 \u56833 +\f0 \uc0\u55356 \u56833 \f1 \\ud83c\\ude01 squared katakana koko\ -\f3 \uc0\u55356 \u56834 +\f3 \uc0\u55356 \u56834 \f1 \\ud83c\\ude02 squared katakana sa\ -\f0 \uc0\u55356 \u56858 +\f0 \uc0\u55356 \u56858 \f1 \\ud83c\\ude1a squared cjk unified ideograph-7121\ -\f0 \uc0\u55356 \u56879 +\f0 \uc0\u55356 \u56879 \f1 \\ud83c\\ude2f squared cjk unified ideograph-6307\ -\f0 \uc0\u55356 \u56882 +\f0 \uc0\u55356 \u56882 \f1 \\ud83c\\ude32 squared cjk unified ideograph-7981\ -\f0 \uc0\u55356 \u56883 +\f0 \uc0\u55356 \u56883 \f1 \\ud83c\\ude33 squared cjk unified ideograph-7a7a\ -\f0 \uc0\u55356 \u56884 +\f0 \uc0\u55356 \u56884 \f1 \\ud83c\\ude34 squared cjk unified ideograph-5408\ -\f0 \uc0\u55356 \u56885 +\f0 \uc0\u55356 \u56885 \f1 \\ud83c\\ude35 squared cjk unified ideograph-6e80\ -\f0 \uc0\u55356 \u56886 +\f0 \uc0\u55356 \u56886 \f1 \\ud83c\\ude36 squared cjk unified ideograph-6709\ -\f3 \uc0\u55356 \u56887 +\f3 \uc0\u55356 \u56887 \f1 \\ud83c\\ude37 squared cjk unified ideograph-6708\ -\f0 \uc0\u55356 \u56888 +\f0 \uc0\u55356 \u56888 \f1 \\ud83c\\ude38 squared cjk unified ideograph-7533\ -\f0 \uc0\u55356 \u56889 +\f0 \uc0\u55356 \u56889 \f1 \\ud83c\\ude39 squared cjk unified ideograph-5272\ -\f0 \uc0\u55356 \u56890 +\f0 \uc0\u55356 \u56890 \f1 \\ud83c\\ude3a squared cjk unified ideograph-55b6\ -\f0 \uc0\u55356 \u56912 +\f0 \uc0\u55356 \u56912 \f1 \\ud83c\\ude50 circled ideograph advantage\ -\f0 \uc0\u55356 \u56913 +\f0 \uc0\u55356 \u56913 \f1 \\ud83c\\ude51 circled ideograph accept\ \'a9 \\ua9 copyright sign\ \'ae \\uae registered sign\ \uc0\u8252 \\u203c double exclamation mark\ \uc0\u8265 \\u2049 exclamation question mark\ -\f4 8\uc0\u8419 +\f4 8\uc0\u8419 \f1 \\u38\\u20e3 digit eight + combining enclosing keycap\ -\f4 9\uc0\u8419 +\f4 9\uc0\u8419 \f1 \\u39\\u20e3 digit nine + combining enclosing keycap\ -\f4 7\uc0\u8419 +\f4 7\uc0\u8419 \f1 \\u37\\u20e3 digit seven + combining enclosing keycap\ -\f4 6\uc0\u8419 +\f4 6\uc0\u8419 \f1 \\u36\\u20e3 digit six + combining enclosing keycap\ -\f4 1\uc0\u8419 +\f4 1\uc0\u8419 \f1 \\u31\\u20e3 digit one + combining enclosing keycap\ -\f4 0\uc0\u8419 +\f4 0\uc0\u8419 \f1 \\u30\\u20e3 digit zero + combining enclosing keycap\ -\f4 2\uc0\u8419 +\f4 2\uc0\u8419 \f1 \\u32\\u20e3 digit two + combining enclosing keycap\ -\f4 3\uc0\u8419 +\f4 3\uc0\u8419 \f1 \\u33\\u20e3 digit three + combining enclosing keycap\ -\f4 5\uc0\u8419 +\f4 5\uc0\u8419 \f1 \\u35\\u20e3 digit five + combining enclosing keycap\ -\f4 4\uc0\u8419 +\f4 4\uc0\u8419 \f1 \\u34\\u20e3 digit four + combining enclosing keycap\ -\f4 #\uc0\u8419 +\f4 #\uc0\u8419 \f1 \\u23\\u20e3 number sign + combining enclosing keycap\ \'99 \\u2122 trade mark sign\ -\f5 \uc0\u8505 +\f5 \uc0\u8505 \f1 \\u2139 information source\ -\f3 \uc0\u8596 +\f3 \uc0\u8596 \f1 \\u2194 left right arrow\ -\f6 \uc0\u8597 +\f6 \uc0\u8597 \f1 \\u2195 up down arrow\ -\f4 \uc0\u8598 +\f4 \uc0\u8598 \f1 \\u2196 north west arrow\ -\f3 \uc0\u8599 +\f3 \uc0\u8599 \f1 \\u2197 north east arrow\ -\f4 \uc0\u8600 +\f4 \uc0\u8600 \f1 \\u2198 south east arrow\ -\f3 \uc0\u8601 +\f3 \uc0\u8601 \f1 \\u2199 south west arrow\ -\f4 \uc0\u8617 +\f4 \uc0\u8617 \f1 \\u21a9 leftwards arrow with hook\ -\f4 \uc0\u8618 +\f4 \uc0\u8618 \f1 \\u21aa rightwards arrow with hook\ -\f0 \uc0\u8986 +\f0 \uc0\u8986 \f1 \\u231a watch\ -\f0 \uc0\u8987 +\f0 \uc0\u8987 \f1 \\u231b hourglass\ -\f0 \uc0\u9193 +\f0 \uc0\u9193 \f1 \\u23e9 black right-pointing double triangle\ -\f0 \uc0\u9194 +\f0 \uc0\u9194 \f1 \\u23ea black left-pointing double triangle\ -\f0 \uc0\u9195 +\f0 \uc0\u9195 \f1 \\u23eb black up-pointing double triangle\ -\f0 \uc0\u9196 +\f0 \uc0\u9196 \f1 \\u23ec black down-pointing double triangle\ -\f0 \uc0\u9200 +\f0 \uc0\u9200 \f1 \\u23f0 alarm clock\ -\f0 \uc0\u9203 +\f0 \uc0\u9203 \f1 \\u23f3 hourglass with flowing sand\ -\f4 \uc0\u9642 +\f4 \uc0\u9642 \f1 \\u25aa black small square\ -\f4 \uc0\u9643 +\f4 \uc0\u9643 \f1 \\u25ab white small square\ -\f4 \uc0\u9654 +\f4 \uc0\u9654 \f1 \\u25b6 black right-pointing triangle\ -\f3 \uc0\u9664 +\f3 \uc0\u9664 \f1 \\u25c0 black left-pointing triangle\ -\f7 \uc0\u9723 +\f7 \uc0\u9723 \f1 \\u25fb white medium square\ -\f7 \uc0\u9724 +\f7 \uc0\u9724 \f1 \\u25fc black medium square\ -\f0 \uc0\u9725 +\f0 \uc0\u9725 \f1 \\u25fd white medium small square\ -\f0 \uc0\u9726 +\f0 \uc0\u9726 \f1 \\u25fe black medium small square\ -\f3 \uc0\u9728 +\f3 \uc0\u9728 \f1 \\u2600 black sun with rays\ -\f3 \uc0\u9729 +\f3 \uc0\u9729 \f1 \\u2601 cloud\ -\f3 \uc0\u9742 +\f3 \uc0\u9742 \f1 \\u260e black telephone\ -\f5 \uc0\u9745 +\f5 \uc0\u9745 \f1 \\u2611 ballot box with check\ -\f0 \uc0\u9748 +\f0 \uc0\u9748 \f1 \\u2614 umbrella with rain drops\ -\f0 \uc0\u9749 +\f0 \uc0\u9749 \f1 \\u2615 hot beverage\ -\f3 \uc0\u9757 +\f3 \uc0\u9757 \f1 \\u261d white up pointing index\ -\f6 \uc0\u9786 +\f6 \uc0\u9786 \f1 \\u263a white smiling face\ -\f0 \uc0\u9800 +\f0 \uc0\u9800 \f1 \\u2648 aries\ -\f0 \uc0\u9801 +\f0 \uc0\u9801 \f1 \\u2649 taurus\ -\f0 \uc0\u9802 +\f0 \uc0\u9802 \f1 \\u264a gemini\ -\f0 \uc0\u9803 +\f0 \uc0\u9803 \f1 \\u264b cancer\ -\f0 \uc0\u9804 +\f0 \uc0\u9804 \f1 \\u264c leo\ -\f0 \uc0\u9805 +\f0 \uc0\u9805 \f1 \\u264d virgo\ -\f0 \uc0\u9806 +\f0 \uc0\u9806 \f1 \\u264e libra\ -\f0 \uc0\u9807 +\f0 \uc0\u9807 \f1 \\u264f scorpius\ -\f0 \uc0\u9808 +\f0 \uc0\u9808 \f1 \\u2650 sagittarius\ -\f0 \uc0\u9809 +\f0 \uc0\u9809 \f1 \\u2651 capricorn\ -\f0 \uc0\u9810 +\f0 \uc0\u9810 \f1 \\u2652 aquarius\ -\f0 \uc0\u9811 +\f0 \uc0\u9811 \f1 \\u2653 pisces\ -\f3 \uc0\u9824 +\f3 \uc0\u9824 \f1 \\u2660 black spade suit\ -\f3 \uc0\u9827 +\f3 \uc0\u9827 \f1 \\u2663 black club suit\ -\f3 \uc0\u9829 +\f3 \uc0\u9829 \f1 \\u2665 black heart suit\ -\f3 \uc0\u9830 +\f3 \uc0\u9830 \f1 \\u2666 black diamond suit\ -\f3 \uc0\u9832 +\f3 \uc0\u9832 \f1 \\u2668 hot springs\ -\f3 \uc0\u9851 +\f3 \uc0\u9851 \f1 \\u267b black universal recycling symbol\ -\f0 \uc0\u9855 +\f0 \uc0\u9855 \f1 \\u267f wheelchair symbol\ -\f0 \uc0\u9875 +\f0 \uc0\u9875 \f1 \\u2693 anchor\ -\f3 \uc0\u9888 +\f3 \uc0\u9888 \f1 \\u26a0 warning sign\ -\f0 \uc0\u9889 +\f0 \uc0\u9889 \f1 \\u26a1 high voltage sign\ -\f0 \uc0\u9898 +\f0 \uc0\u9898 \f1 \\u26aa medium white circle\ -\f0 \uc0\u9899 +\f0 \uc0\u9899 \f1 \\u26ab medium black circle\ -\f0 \uc0\u9917 +\f0 \uc0\u9917 \f1 \\u26bd soccer ball\ -\f3 \uc0\u9918 +\f3 \uc0\u9918 \f1 \\u26be baseball\ -\f0 \uc0\u9924 +\f0 \uc0\u9924 \f1 \\u26c4 snowman without snow\ -\f0 \uc0\u9925 +\f0 \uc0\u9925 \f1 \\u26c5 sun behind cloud\ -\f0 \uc0\u9934 +\f0 \uc0\u9934 \f1 \\u26ce ophiuchus\ -\f0 \uc0\u9940 +\f0 \uc0\u9940 \f1 \\u26d4 no entry\ -\f0 \uc0\u9962 +\f0 \uc0\u9962 \f1 \\u26ea church\ -\f0 \uc0\u9970 +\f0 \uc0\u9970 \f1 \\u26f2 fountain\ -\f0 \uc0\u9971 +\f0 \uc0\u9971 \f1 \\u26f3 flag in hole\ -\f0 \uc0\u9973 +\f0 \uc0\u9973 \f1 \\u26f5 sailboat\ -\f0 \uc0\u9978 +\f0 \uc0\u9978 \f1 \\u26fa tent\ -\f0 \uc0\u9981 +\f0 \uc0\u9981 \f1 \\u26fd fuel pump\ -\f3 \uc0\u10548 +\f3 \uc0\u10548 \f1 \\u2934 arrow pointing rightwards then curving upwards\ -\f3 \uc0\u10549 +\f3 \uc0\u10549 \f1 \\u2935 arrow pointing rightwards then curving downwards\ -\f3 \uc0\u11013 +\f3 \uc0\u11013 \f1 \\u2b05 leftwards black arrow\ -\f3 \uc0\u11014 +\f3 \uc0\u11014 \f1 \\u2b06 upwards black arrow\ -\f3 \uc0\u11015 +\f3 \uc0\u11015 \f1 \\u2b07 downwards black arrow\ -\f0 \uc0\u11035 +\f0 \uc0\u11035 \f1 \\u2b1b black large square\ -\f0 \uc0\u11036 +\f0 \uc0\u11036 \f1 \\u2b1c white large square\ -\f0 \uc0\u11088 +\f0 \uc0\u11088 \f1 \\u2b50 white medium star\ -\f0 \uc0\u11093 +\f0 \uc0\u11093 \f1 \\u2b55 heavy large circle\ -\f3 \uc0\u12336 +\f3 \uc0\u12336 \f1 \\u3030 wavy dash\ -\f3 \uc0\u12349 +\f3 \uc0\u12349 \f1 \\u303d part alternation mark\ -\f3 \uc0\u12951 +\f3 \uc0\u12951 \f1 \\u3297 circled ideograph congratulation\ -\f3 \uc0\u12953 +\f3 \uc0\u12953 \f1 \\u3299 circled ideograph secret\ -\f0 \uc0\u55356 \u56324 +\f0 \uc0\u55356 \u56324 \f1 \\ud83c\\udc04 mahjong tile red dragon\ -\f0 \uc0\u55356 \u56527 +\f0 \uc0\u55356 \u56527 \f1 \\ud83c\\udccf playing card black joker\ -\f0 \uc0\u55356 \u57088 +\f0 \uc0\u55356 \u57088 \f1 \\ud83c\\udf00 cyclone\ -\f0 \uc0\u55356 \u57089 +\f0 \uc0\u55356 \u57089 \f1 \\ud83c\\udf01 foggy\ -\f0 \uc0\u55356 \u57090 +\f0 \uc0\u55356 \u57090 \f1 \\ud83c\\udf02 closed umbrella\ -\f0 \uc0\u55356 \u57091 +\f0 \uc0\u55356 \u57091 \f1 \\ud83c\\udf03 night with stars\ -\f0 \uc0\u55356 \u57092 +\f0 \uc0\u55356 \u57092 \f1 \\ud83c\\udf04 sunrise over mountains\ -\f0 \uc0\u55356 \u57093 +\f0 \uc0\u55356 \u57093 \f1 \\ud83c\\udf05 sunrise\ -\f0 \uc0\u55356 \u57094 +\f0 \uc0\u55356 \u57094 \f1 \\ud83c\\udf06 cityscape at dusk\ -\f0 \uc0\u55356 \u57095 +\f0 \uc0\u55356 \u57095 \f1 \\ud83c\\udf07 sunset over buildings\ -\f0 \uc0\u55356 \u57096 +\f0 \uc0\u55356 \u57096 \f1 \\ud83c\\udf08 rainbow\ -\f0 \uc0\u55356 \u57097 +\f0 \uc0\u55356 \u57097 \f1 \\ud83c\\udf09 bridge at night\ -\f0 \uc0\u55356 \u57098 +\f0 \uc0\u55356 \u57098 \f1 \\ud83c\\udf0a water wave\ -\f0 \uc0\u55356 \u57099 +\f0 \uc0\u55356 \u57099 \f1 \\ud83c\\udf0b volcano\ -\f0 \uc0\u55356 \u57100 +\f0 \uc0\u55356 \u57100 \f1 \\ud83c\\udf0c milky way\ -\f0 \uc0\u55356 \u57103 +\f0 \uc0\u55356 \u57103 \f1 \\ud83c\\udf0f earth globe asia-australia\ -\f0 \uc0\u55356 \u57105 +\f0 \uc0\u55356 \u57105 \f1 \\ud83c\\udf11 new moon symbol\ -\f0 \uc0\u55356 \u57107 +\f0 \uc0\u55356 \u57107 \f1 \\ud83c\\udf13 first quarter moon symbol\ -\f0 \uc0\u55356 \u57108 +\f0 \uc0\u55356 \u57108 \f1 \\ud83c\\udf14 waxing gibbous moon symbol\ -\f0 \uc0\u55356 \u57109 +\f0 \uc0\u55356 \u57109 \f1 \\ud83c\\udf15 full moon symbol\ -\f0 \uc0\u55356 \u57113 +\f0 \uc0\u55356 \u57113 \f1 \\ud83c\\udf19 crescent moon\ -\f0 \uc0\u55356 \u57115 +\f0 \uc0\u55356 \u57115 \f1 \\ud83c\\udf1b first quarter moon with face\ -\f0 \uc0\u55356 \u57119 +\f0 \uc0\u55356 \u57119 \f1 \\ud83c\\udf1f glowing star\ -\f0 \uc0\u55356 \u57120 +\f0 \uc0\u55356 \u57120 \f1 \\ud83c\\udf20 shooting star\ -\f0 \uc0\u55356 \u57136 +\f0 \uc0\u55356 \u57136 \f1 \\ud83c\\udf30 chestnut\ -\f0 \uc0\u55356 \u57137 +\f0 \uc0\u55356 \u57137 \f1 \\ud83c\\udf31 seedling\ -\f0 \uc0\u55356 \u57140 +\f0 \uc0\u55356 \u57140 \f1 \\ud83c\\udf34 palm tree\ -\f0 \uc0\u55356 \u57141 +\f0 \uc0\u55356 \u57141 \f1 \\ud83c\\udf35 cactus\ -\f0 \uc0\u55356 \u57143 +\f0 \uc0\u55356 \u57143 \f1 \\ud83c\\udf37 tulip\ -\f0 \uc0\u55356 \u57144 +\f0 \uc0\u55356 \u57144 \f1 \\ud83c\\udf38 cherry blossom\ -\f0 \uc0\u55356 \u57145 +\f0 \uc0\u55356 \u57145 \f1 \\ud83c\\udf39 rose\ -\f0 \uc0\u55356 \u57146 +\f0 \uc0\u55356 \u57146 \f1 \\ud83c\\udf3a hibiscus\ -\f0 \uc0\u55356 \u57147 +\f0 \uc0\u55356 \u57147 \f1 \\ud83c\\udf3b sunflower\ -\f0 \uc0\u55356 \u57148 +\f0 \uc0\u55356 \u57148 \f1 \\ud83c\\udf3c blossom\ -\f0 \uc0\u55356 \u57149 +\f0 \uc0\u55356 \u57149 \f1 \\ud83c\\udf3d ear of maize\ -\f0 \uc0\u55356 \u57150 +\f0 \uc0\u55356 \u57150 \f1 \\ud83c\\udf3e ear of rice\ -\f0 \uc0\u55356 \u57151 +\f0 \uc0\u55356 \u57151 \f1 \\ud83c\\udf3f herb\ -\f0 \uc0\u55356 \u57152 +\f0 \uc0\u55356 \u57152 \f1 \\ud83c\\udf40 four leaf clover\ -\f0 \uc0\u55356 \u57153 +\f0 \uc0\u55356 \u57153 \f1 \\ud83c\\udf41 maple leaf\ -\f0 \uc0\u55356 \u57154 +\f0 \uc0\u55356 \u57154 \f1 \\ud83c\\udf42 fallen leaf\ -\f0 \uc0\u55356 \u57155 +\f0 \uc0\u55356 \u57155 \f1 \\ud83c\\udf43 leaf fluttering in wind\ -\f0 \uc0\u55356 \u57156 +\f0 \uc0\u55356 \u57156 \f1 \\ud83c\\udf44 mushroom\ -\f0 \uc0\u55356 \u57157 +\f0 \uc0\u55356 \u57157 \f1 \\ud83c\\udf45 tomato\ -\f0 \uc0\u55356 \u57158 +\f0 \uc0\u55356 \u57158 \f1 \\ud83c\\udf46 aubergine\ -\f0 \uc0\u55356 \u57159 +\f0 \uc0\u55356 \u57159 \f1 \\ud83c\\udf47 grapes\ -\f0 \uc0\u55356 \u57160 +\f0 \uc0\u55356 \u57160 \f1 \\ud83c\\udf48 melon\ -\f0 \uc0\u55356 \u57161 +\f0 \uc0\u55356 \u57161 \f1 \\ud83c\\udf49 watermelon\ -\f0 \uc0\u55356 \u57162 +\f0 \uc0\u55356 \u57162 \f1 \\ud83c\\udf4a tangerine\ -\f0 \uc0\u55356 \u57164 +\f0 \uc0\u55356 \u57164 \f1 \\ud83c\\udf4c banana\ -\f0 \uc0\u55356 \u57165 +\f0 \uc0\u55356 \u57165 \f1 \\ud83c\\udf4d pineapple\ -\f0 \uc0\u55356 \u57166 +\f0 \uc0\u55356 \u57166 \f1 \\ud83c\\udf4e red apple\ -\f0 \uc0\u55356 \u57167 +\f0 \uc0\u55356 \u57167 \f1 \\ud83c\\udf4f green apple\ -\f0 \uc0\u55356 \u57169 +\f0 \uc0\u55356 \u57169 \f1 \\ud83c\\udf51 peach\ -\f0 \uc0\u55356 \u57170 +\f0 \uc0\u55356 \u57170 \f1 \\ud83c\\udf52 cherries\ -\f0 \uc0\u55356 \u57171 +\f0 \uc0\u55356 \u57171 \f1 \\ud83c\\udf53 strawberry\ -\f0 \uc0\u55356 \u57172 +\f0 \uc0\u55356 \u57172 \f1 \\ud83c\\udf54 hamburger\ -\f0 \uc0\u55356 \u57173 +\f0 \uc0\u55356 \u57173 \f1 \\ud83c\\udf55 slice of pizza\ -\f0 \uc0\u55356 \u57174 +\f0 \uc0\u55356 \u57174 \f1 \\ud83c\\udf56 meat on bone\ -\f0 \uc0\u55356 \u57175 +\f0 \uc0\u55356 \u57175 \f1 \\ud83c\\udf57 poultry leg\ -\f0 \uc0\u55356 \u57176 +\f0 \uc0\u55356 \u57176 \f1 \\ud83c\\udf58 rice cracker\ -\f0 \uc0\u55356 \u57177 +\f0 \uc0\u55356 \u57177 \f1 \\ud83c\\udf59 rice ball\ -\f0 \uc0\u55356 \u57178 +\f0 \uc0\u55356 \u57178 \f1 \\ud83c\\udf5a cooked rice\ -\f0 \uc0\u55356 \u57179 +\f0 \uc0\u55356 \u57179 \f1 \\ud83c\\udf5b curry and rice\ -\f0 \uc0\u55356 \u57180 +\f0 \uc0\u55356 \u57180 \f1 \\ud83c\\udf5c steaming bowl\ -\f0 \uc0\u55356 \u57181 +\f0 \uc0\u55356 \u57181 \f1 \\ud83c\\udf5d spaghetti\ -\f0 \uc0\u55356 \u57182 +\f0 \uc0\u55356 \u57182 \f1 \\ud83c\\udf5e bread\ -\f0 \uc0\u55356 \u57183 +\f0 \uc0\u55356 \u57183 \f1 \\ud83c\\udf5f french fries\ -\f0 \uc0\u55356 \u57184 +\f0 \uc0\u55356 \u57184 \f1 \\ud83c\\udf60 roasted sweet potato\ -\f0 \uc0\u55356 \u57185 +\f0 \uc0\u55356 \u57185 \f1 \\ud83c\\udf61 dango\ -\f0 \uc0\u55356 \u57186 +\f0 \uc0\u55356 \u57186 \f1 \\ud83c\\udf62 oden\ -\f0 \uc0\u55356 \u57187 +\f0 \uc0\u55356 \u57187 \f1 \\ud83c\\udf63 sushi\ -\f0 \uc0\u55356 \u57188 +\f0 \uc0\u55356 \u57188 \f1 \\ud83c\\udf64 fried shrimp\ -\f0 \uc0\u55356 \u57189 +\f0 \uc0\u55356 \u57189 \f1 \\ud83c\\udf65 fish cake with swirl design\ -\f0 \uc0\u55356 \u57190 +\f0 \uc0\u55356 \u57190 \f1 \\ud83c\\udf66 soft ice cream\ -\f0 \uc0\u55356 \u57191 +\f0 \uc0\u55356 \u57191 \f1 \\ud83c\\udf67 shaved ice\ -\f0 \uc0\u55356 \u57192 +\f0 \uc0\u55356 \u57192 \f1 \\ud83c\\udf68 ice cream\ -\f0 \uc0\u55356 \u57193 +\f0 \uc0\u55356 \u57193 \f1 \\ud83c\\udf69 doughnut\ -\f0 \uc0\u55356 \u57194 +\f0 \uc0\u55356 \u57194 \f1 \\ud83c\\udf6a cookie\ -\f0 \uc0\u55356 \u57195 +\f0 \uc0\u55356 \u57195 \f1 \\ud83c\\udf6b chocolate bar\ -\f0 \uc0\u55356 \u57196 +\f0 \uc0\u55356 \u57196 \f1 \\ud83c\\udf6c candy\ -\f0 \uc0\u55356 \u57197 +\f0 \uc0\u55356 \u57197 \f1 \\ud83c\\udf6d lollipop\ -\f0 \uc0\u55356 \u57198 +\f0 \uc0\u55356 \u57198 \f1 \\ud83c\\udf6e custard\ -\f0 \uc0\u55356 \u57199 +\f0 \uc0\u55356 \u57199 \f1 \\ud83c\\udf6f honey pot\ -\f0 \uc0\u55356 \u57200 +\f0 \uc0\u55356 \u57200 \f1 \\ud83c\\udf70 shortcake\ -\f0 \uc0\u55356 \u57201 +\f0 \uc0\u55356 \u57201 \f1 \\ud83c\\udf71 bento box\ -\f0 \uc0\u55356 \u57202 +\f0 \uc0\u55356 \u57202 \f1 \\ud83c\\udf72 pot of food\ -\f0 \uc0\u55356 \u57203 +\f0 \uc0\u55356 \u57203 \f1 \\ud83c\\udf73 cooking\ -\f0 \uc0\u55356 \u57204 +\f0 \uc0\u55356 \u57204 \f1 \\ud83c\\udf74 fork and knife\ -\f0 \uc0\u55356 \u57205 +\f0 \uc0\u55356 \u57205 \f1 \\ud83c\\udf75 teacup without handle\ -\f0 \uc0\u55356 \u57206 +\f0 \uc0\u55356 \u57206 \f1 \\ud83c\\udf76 sake bottle and cup\ -\f0 \uc0\u55356 \u57207 +\f0 \uc0\u55356 \u57207 \f1 \\ud83c\\udf77 wine glass\ -\f0 \uc0\u55356 \u57208 +\f0 \uc0\u55356 \u57208 \f1 \\ud83c\\udf78 cocktail glass\ -\f0 \uc0\u55356 \u57209 +\f0 \uc0\u55356 \u57209 \f1 \\ud83c\\udf79 tropical drink\ -\f0 \uc0\u55356 \u57210 +\f0 \uc0\u55356 \u57210 \f1 \\ud83c\\udf7a beer mug\ -\f0 \uc0\u55356 \u57211 +\f0 \uc0\u55356 \u57211 \f1 \\ud83c\\udf7b clinking beer mugs\ -\f0 \uc0\u55356 \u57216 +\f0 \uc0\u55356 \u57216 \f1 \\ud83c\\udf80 ribbon\ -\f0 \uc0\u55356 \u57217 +\f0 \uc0\u55356 \u57217 \f1 \\ud83c\\udf81 wrapped present\ -\f0 \uc0\u55356 \u57218 +\f0 \uc0\u55356 \u57218 \f1 \\ud83c\\udf82 birthday cake\ -\f0 \uc0\u55356 \u57219 +\f0 \uc0\u55356 \u57219 \f1 \\ud83c\\udf83 jack-o-lantern\ -\f0 \uc0\u55356 \u57220 +\f0 \uc0\u55356 \u57220 \f1 \\ud83c\\udf84 christmas tree\ -\f0 \uc0\u55356 \u57221 +\f0 \uc0\u55356 \u57221 \f1 \\ud83c\\udf85 father christmas\ -\f0 \uc0\u55356 \u57222 +\f0 \uc0\u55356 \u57222 \f1 \\ud83c\\udf86 fireworks\ -\f0 \uc0\u55356 \u57223 +\f0 \uc0\u55356 \u57223 \f1 \\ud83c\\udf87 firework sparkler\ -\f0 \uc0\u55356 \u57224 +\f0 \uc0\u55356 \u57224 \f1 \\ud83c\\udf88 balloon\ -\f0 \uc0\u55356 \u57225 +\f0 \uc0\u55356 \u57225 \f1 \\ud83c\\udf89 party popper\ -\f0 \uc0\u55356 \u57226 +\f0 \uc0\u55356 \u57226 \f1 \\ud83c\\udf8a confetti ball\ -\f0 \uc0\u55356 \u57227 +\f0 \uc0\u55356 \u57227 \f1 \\ud83c\\udf8b tanabata tree\ -\f0 \uc0\u55356 \u57228 +\f0 \uc0\u55356 \u57228 \f1 \\ud83c\\udf8c crossed flags\ -\f0 \uc0\u55356 \u57229 +\f0 \uc0\u55356 \u57229 \f1 \\ud83c\\udf8d pine decoration\ -\f0 \uc0\u55356 \u57230 +\f0 \uc0\u55356 \u57230 \f1 \\ud83c\\udf8e japanese dolls\ -\f0 \uc0\u55356 \u57231 +\f0 \uc0\u55356 \u57231 \f1 \\ud83c\\udf8f carp streamer\ -\f0 \uc0\u55356 \u57232 +\f0 \uc0\u55356 \u57232 \f1 \\ud83c\\udf90 wind chime\ -\f0 \uc0\u55356 \u57233 +\f0 \uc0\u55356 \u57233 \f1 \\ud83c\\udf91 moon viewing ceremony\ -\f0 \uc0\u55356 \u57234 +\f0 \uc0\u55356 \u57234 \f1 \\ud83c\\udf92 school satchel\ -\f0 \uc0\u55356 \u57235 +\f0 \uc0\u55356 \u57235 \f1 \\ud83c\\udf93 graduation cap\ -\f0 \uc0\u55356 \u57248 +\f0 \uc0\u55356 \u57248 \f1 \\ud83c\\udfa0 carousel horse\ -\f0 \uc0\u55356 \u57249 +\f0 \uc0\u55356 \u57249 \f1 \\ud83c\\udfa1 ferris wheel\ -\f0 \uc0\u55356 \u57250 +\f0 \uc0\u55356 \u57250 \f1 \\ud83c\\udfa2 roller coaster\ -\f0 \uc0\u55356 \u57251 +\f0 \uc0\u55356 \u57251 \f1 \\ud83c\\udfa3 fishing pole and fish\ -\f0 \uc0\u55356 \u57252 +\f0 \uc0\u55356 \u57252 \f1 \\ud83c\\udfa4 microphone\ -\f0 \uc0\u55356 \u57253 +\f0 \uc0\u55356 \u57253 \f1 \\ud83c\\udfa5 movie camera\ -\f0 \uc0\u55356 \u57254 +\f0 \uc0\u55356 \u57254 \f1 \\ud83c\\udfa6 cinema\ -\f0 \uc0\u55356 \u57255 +\f0 \uc0\u55356 \u57255 \f1 \\ud83c\\udfa7 headphone\ -\f0 \uc0\u55356 \u57256 +\f0 \uc0\u55356 \u57256 \f1 \\ud83c\\udfa8 artist palette\ -\f0 \uc0\u55356 \u57257 +\f0 \uc0\u55356 \u57257 \f1 \\ud83c\\udfa9 top hat\ -\f0 \uc0\u55356 \u57258 +\f0 \uc0\u55356 \u57258 \f1 \\ud83c\\udfaa circus tent\ -\f0 \uc0\u55356 \u57259 +\f0 \uc0\u55356 \u57259 \f1 \\ud83c\\udfab ticket\ -\f0 \uc0\u55356 \u57260 +\f0 \uc0\u55356 \u57260 \f1 \\ud83c\\udfac clapper board\ -\f0 \uc0\u55356 \u57261 +\f0 \uc0\u55356 \u57261 \f1 \\ud83c\\udfad performing arts\ -\f0 \uc0\u55356 \u57262 +\f0 \uc0\u55356 \u57262 \f1 \\ud83c\\udfae video game\ -\f0 \uc0\u55356 \u57263 +\f0 \uc0\u55356 \u57263 \f1 \\ud83c\\udfaf direct hit\ -\f0 \uc0\u55356 \u57264 +\f0 \uc0\u55356 \u57264 \f1 \\ud83c\\udfb0 slot machine\ -\f0 \uc0\u55356 \u57265 +\f0 \uc0\u55356 \u57265 \f1 \\ud83c\\udfb1 billiards\ -\f0 \uc0\u55356 \u57266 +\f0 \uc0\u55356 \u57266 \f1 \\ud83c\\udfb2 game die\ -\f0 \uc0\u55356 \u57267 +\f0 \uc0\u55356 \u57267 \f1 \\ud83c\\udfb3 bowling\ -\f0 \uc0\u55356 \u57268 +\f0 \uc0\u55356 \u57268 \f1 \\ud83c\\udfb4 flower playing cards\ -\f0 \uc0\u55356 \u57269 +\f0 \uc0\u55356 \u57269 \f1 \\ud83c\\udfb5 musical note\ -\f0 \uc0\u55356 \u57270 +\f0 \uc0\u55356 \u57270 \f1 \\ud83c\\udfb6 multiple musical notes\ -\f0 \uc0\u55356 \u57271 +\f0 \uc0\u55356 \u57271 \f1 \\ud83c\\udfb7 saxophone\ -\f0 \uc0\u55356 \u57272 +\f0 \uc0\u55356 \u57272 \f1 \\ud83c\\udfb8 guitar\ -\f0 \uc0\u55356 \u57273 +\f0 \uc0\u55356 \u57273 \f1 \\ud83c\\udfb9 musical keyboard\ -\f0 \uc0\u55356 \u57274 +\f0 \uc0\u55356 \u57274 \f1 \\ud83c\\udfba trumpet\ -\f0 \uc0\u55356 \u57275 +\f0 \uc0\u55356 \u57275 \f1 \\ud83c\\udfbb violin\ -\f0 \uc0\u55356 \u57276 +\f0 \uc0\u55356 \u57276 \f1 \\ud83c\\udfbc musical score\ -\f0 \uc0\u55356 \u57277 +\f0 \uc0\u55356 \u57277 \f1 \\ud83c\\udfbd running shirt with sash\ -\f0 \uc0\u55356 \u57278 +\f0 \uc0\u55356 \u57278 \f1 \\ud83c\\udfbe tennis racquet and ball\ -\f0 \uc0\u55356 \u57279 +\f0 \uc0\u55356 \u57279 \f1 \\ud83c\\udfbf ski and ski boot\ -\f0 \uc0\u55356 \u57280 +\f0 \uc0\u55356 \u57280 \f1 \\ud83c\\udfc0 basketball and hoop\ -\f0 \uc0\u55356 \u57281 +\f0 \uc0\u55356 \u57281 \f1 \\ud83c\\udfc1 chequered flag\ -\f0 \uc0\u55356 \u57282 +\f0 \uc0\u55356 \u57282 \f1 \\ud83c\\udfc2 snowboarder\ -\f0 \uc0\u55356 \u57283 +\f0 \uc0\u55356 \u57283 \f1 \\ud83c\\udfc3 runner\ -\f0 \uc0\u55356 \u57284 +\f0 \uc0\u55356 \u57284 \f1 \\ud83c\\udfc4 surfer\ -\f0 \uc0\u55356 \u57286 +\f0 \uc0\u55356 \u57286 \f1 \\ud83c\\udfc6 trophy\ -\f0 \uc0\u55356 \u57288 +\f0 \uc0\u55356 \u57288 \f1 \\ud83c\\udfc8 american football\ -\f0 \uc0\u55356 \u57290 +\f0 \uc0\u55356 \u57290 \f1 \\ud83c\\udfca swimmer\ -\f0 \uc0\u55356 \u57312 +\f0 \uc0\u55356 \u57312 \f1 \\ud83c\\udfe0 house building\ -\f0 \uc0\u55356 \u57313 +\f0 \uc0\u55356 \u57313 \f1 \\ud83c\\udfe1 house with garden\ -\f0 \uc0\u55356 \u57314 +\f0 \uc0\u55356 \u57314 \f1 \\ud83c\\udfe2 office building\ -\f0 \uc0\u55356 \u57315 +\f0 \uc0\u55356 \u57315 \f1 \\ud83c\\udfe3 japanese post office\ -\f0 \uc0\u55356 \u57317 +\f0 \uc0\u55356 \u57317 \f1 \\ud83c\\udfe5 hospital\ -\f0 \uc0\u55356 \u57318 +\f0 \uc0\u55356 \u57318 \f1 \\ud83c\\udfe6 bank\ -\f0 \uc0\u55356 \u57319 +\f0 \uc0\u55356 \u57319 \f1 \\ud83c\\udfe7 automated teller machine\ -\f0 \uc0\u55356 \u57320 +\f0 \uc0\u55356 \u57320 \f1 \\ud83c\\udfe8 hotel\ -\f0 \uc0\u55356 \u57321 +\f0 \uc0\u55356 \u57321 \f1 \\ud83c\\udfe9 love hotel\ -\f0 \uc0\u55356 \u57322 +\f0 \uc0\u55356 \u57322 \f1 \\ud83c\\udfea convenience store\ -\f0 \uc0\u55356 \u57323 +\f0 \uc0\u55356 \u57323 \f1 \\ud83c\\udfeb school\ -\f0 \uc0\u55356 \u57324 +\f0 \uc0\u55356 \u57324 \f1 \\ud83c\\udfec department store\ -\f0 \uc0\u55356 \u57325 +\f0 \uc0\u55356 \u57325 \f1 \\ud83c\\udfed factory\ -\f0 \uc0\u55356 \u57326 +\f0 \uc0\u55356 \u57326 \f1 \\ud83c\\udfee izakaya lantern\ -\f0 \uc0\u55356 \u57327 +\f0 \uc0\u55356 \u57327 \f1 \\ud83c\\udfef japanese castle\ -\f0 \uc0\u55356 \u57328 +\f0 \uc0\u55356 \u57328 \f1 \\ud83c\\udff0 european castle\ -\f0 \uc0\u55357 \u56332 +\f0 \uc0\u55357 \u56332 \f1 \\ud83d\\udc0c snail\ -\f0 \uc0\u55357 \u56333 +\f0 \uc0\u55357 \u56333 \f1 \\ud83d\\udc0d snake\ -\f0 \uc0\u55357 \u56334 +\f0 \uc0\u55357 \u56334 \f1 \\ud83d\\udc0e horse\ -\f0 \uc0\u55357 \u56337 +\f0 \uc0\u55357 \u56337 \f1 \\ud83d\\udc11 sheep\ -\f0 \uc0\u55357 \u56338 +\f0 \uc0\u55357 \u56338 \f1 \\ud83d\\udc12 monkey\ -\f0 \uc0\u55357 \u56340 +\f0 \uc0\u55357 \u56340 \f1 \\ud83d\\udc14 chicken\ -\f0 \uc0\u55357 \u56343 +\f0 \uc0\u55357 \u56343 \f1 \\ud83d\\udc17 boar\ -\f0 \uc0\u55357 \u56344 +\f0 \uc0\u55357 \u56344 \f1 \\ud83d\\udc18 elephant\ -\f0 \uc0\u55357 \u56345 +\f0 \uc0\u55357 \u56345 \f1 \\ud83d\\udc19 octopus\ -\f0 \uc0\u55357 \u56346 +\f0 \uc0\u55357 \u56346 \f1 \\ud83d\\udc1a spiral shell\ -\f0 \uc0\u55357 \u56347 +\f0 \uc0\u55357 \u56347 \f1 \\ud83d\\udc1b bug\ -\f0 \uc0\u55357 \u56348 +\f0 \uc0\u55357 \u56348 \f1 \\ud83d\\udc1c ant\ -\f0 \uc0\u55357 \u56349 +\f0 \uc0\u55357 \u56349 \f1 \\ud83d\\udc1d honeybee\ -\f0 \uc0\u55357 \u56350 +\f0 \uc0\u55357 \u56350 \f1 \\ud83d\\udc1e lady beetle\ -\f0 \uc0\u55357 \u56351 +\f0 \uc0\u55357 \u56351 \f1 \\ud83d\\udc1f fish\ -\f0 \uc0\u55357 \u56352 +\f0 \uc0\u55357 \u56352 \f1 \\ud83d\\udc20 tropical fish\ -\f0 \uc0\u55357 \u56353 +\f0 \uc0\u55357 \u56353 \f1 \\ud83d\\udc21 blowfish\ -\f0 \uc0\u55357 \u56354 +\f0 \uc0\u55357 \u56354 \f1 \\ud83d\\udc22 turtle\ -\f0 \uc0\u55357 \u56355 +\f0 \uc0\u55357 \u56355 \f1 \\ud83d\\udc23 hatching chick\ -\f0 \uc0\u55357 \u56356 +\f0 \uc0\u55357 \u56356 \f1 \\ud83d\\udc24 baby chick\ -\f0 \uc0\u55357 \u56357 +\f0 \uc0\u55357 \u56357 \f1 \\ud83d\\udc25 front-facing baby chick\ -\f0 \uc0\u55357 \u56358 +\f0 \uc0\u55357 \u56358 \f1 \\ud83d\\udc26 bird\ -\f0 \uc0\u55357 \u56359 +\f0 \uc0\u55357 \u56359 \f1 \\ud83d\\udc27 penguin\ -\f0 \uc0\u55357 \u56360 +\f0 \uc0\u55357 \u56360 \f1 \\ud83d\\udc28 koala\ -\f0 \uc0\u55357 \u56361 +\f0 \uc0\u55357 \u56361 \f1 \\ud83d\\udc29 poodle\ -\f0 \uc0\u55357 \u56363 +\f0 \uc0\u55357 \u56363 \f1 \\ud83d\\udc2b bactrian camel\ -\f0 \uc0\u55357 \u56364 +\f0 \uc0\u55357 \u56364 \f1 \\ud83d\\udc2c dolphin\ -\f0 \uc0\u55357 \u56365 +\f0 \uc0\u55357 \u56365 \f1 \\ud83d\\udc2d mouse face\ -\f0 \uc0\u55357 \u56366 +\f0 \uc0\u55357 \u56366 \f1 \\ud83d\\udc2e cow face\ -\f0 \uc0\u55357 \u56367 +\f0 \uc0\u55357 \u56367 \f1 \\ud83d\\udc2f tiger face\ -\f0 \uc0\u55357 \u56368 +\f0 \uc0\u55357 \u56368 \f1 \\ud83d\\udc30 rabbit face\ -\f0 \uc0\u55357 \u56369 +\f0 \uc0\u55357 \u56369 \f1 \\ud83d\\udc31 cat face\ -\f0 \uc0\u55357 \u56370 +\f0 \uc0\u55357 \u56370 \f1 \\ud83d\\udc32 dragon face\ -\f0 \uc0\u55357 \u56371 +\f0 \uc0\u55357 \u56371 \f1 \\ud83d\\udc33 spouting whale\ -\f0 \uc0\u55357 \u56372 +\f0 \uc0\u55357 \u56372 \f1 \\ud83d\\udc34 horse face\ -\f0 \uc0\u55357 \u56373 +\f0 \uc0\u55357 \u56373 \f1 \\ud83d\\udc35 monkey face\ -\f0 \uc0\u55357 \u56374 +\f0 \uc0\u55357 \u56374 \f1 \\ud83d\\udc36 dog face\ -\f0 \uc0\u55357 \u56375 +\f0 \uc0\u55357 \u56375 \f1 \\ud83d\\udc37 pig face\ -\f0 \uc0\u55357 \u56376 +\f0 \uc0\u55357 \u56376 \f1 \\ud83d\\udc38 frog face\ -\f0 \uc0\u55357 \u56377 +\f0 \uc0\u55357 \u56377 \f1 \\ud83d\\udc39 hamster face\ -\f0 \uc0\u55357 \u56378 +\f0 \uc0\u55357 \u56378 \f1 \\ud83d\\udc3a wolf face\ -\f0 \uc0\u55357 \u56379 +\f0 \uc0\u55357 \u56379 \f1 \\ud83d\\udc3b bear face\ -\f0 \uc0\u55357 \u56380 +\f0 \uc0\u55357 \u56380 \f1 \\ud83d\\udc3c panda face\ -\f0 \uc0\u55357 \u56381 +\f0 \uc0\u55357 \u56381 \f1 \\ud83d\\udc3d pig nose\ -\f0 \uc0\u55357 \u56382 +\f0 \uc0\u55357 \u56382 \f1 \\ud83d\\udc3e paw prints\ -\f0 \uc0\u55357 \u56384 +\f0 \uc0\u55357 \u56384 \f1 \\ud83d\\udc40 eyes\ -\f0 \uc0\u55357 \u56386 +\f0 \uc0\u55357 \u56386 \f1 \\ud83d\\udc42 ear\ -\f0 \uc0\u55357 \u56387 +\f0 \uc0\u55357 \u56387 \f1 \\ud83d\\udc43 nose\ -\f0 \uc0\u55357 \u56388 +\f0 \uc0\u55357 \u56388 \f1 \\ud83d\\udc44 mouth\ -\f0 \uc0\u55357 \u56389 +\f0 \uc0\u55357 \u56389 \f1 \\ud83d\\udc45 tongue\ -\f0 \uc0\u55357 \u56390 +\f0 \uc0\u55357 \u56390 \f1 \\ud83d\\udc46 white up pointing backhand index\ -\f0 \uc0\u55357 \u56391 +\f0 \uc0\u55357 \u56391 \f1 \\ud83d\\udc47 white down pointing backhand index\ -\f0 \uc0\u55357 \u56392 +\f0 \uc0\u55357 \u56392 \f1 \\ud83d\\udc48 white left pointing backhand index\ -\f0 \uc0\u55357 \u56393 +\f0 \uc0\u55357 \u56393 \f1 \\ud83d\\udc49 white right pointing backhand index\ -\f0 \uc0\u55357 \u56394 +\f0 \uc0\u55357 \u56394 \f1 \\ud83d\\udc4a fisted hand sign\ -\f0 \uc0\u55357 \u56395 +\f0 \uc0\u55357 \u56395 \f1 \\ud83d\\udc4b waving hand sign\ -\f0 \uc0\u55357 \u56396 +\f0 \uc0\u55357 \u56396 \f1 \\ud83d\\udc4c ok hand sign\ -\f0 \uc0\u55357 \u56397 +\f0 \uc0\u55357 \u56397 \f1 \\ud83d\\udc4d thumbs up sign\ -\f0 \uc0\u55357 \u56398 +\f0 \uc0\u55357 \u56398 \f1 \\ud83d\\udc4e thumbs down sign\ -\f0 \uc0\u55357 \u56399 +\f0 \uc0\u55357 \u56399 \f1 \\ud83d\\udc4f clapping hands sign\ -\f0 \uc0\u55357 \u56400 +\f0 \uc0\u55357 \u56400 \f1 \\ud83d\\udc50 open hands sign\ -\f0 \uc0\u55357 \u56401 +\f0 \uc0\u55357 \u56401 \f1 \\ud83d\\udc51 crown\ -\f0 \uc0\u55357 \u56402 +\f0 \uc0\u55357 \u56402 \f1 \\ud83d\\udc52 womans hat\ -\f0 \uc0\u55357 \u56403 +\f0 \uc0\u55357 \u56403 \f1 \\ud83d\\udc53 eyeglasses\ -\f0 \uc0\u55357 \u56404 +\f0 \uc0\u55357 \u56404 \f1 \\ud83d\\udc54 necktie\ -\f0 \uc0\u55357 \u56405 +\f0 \uc0\u55357 \u56405 \f1 \\ud83d\\udc55 t-shirt\ -\f0 \uc0\u55357 \u56406 +\f0 \uc0\u55357 \u56406 \f1 \\ud83d\\udc56 jeans\ -\f0 \uc0\u55357 \u56407 +\f0 \uc0\u55357 \u56407 \f1 \\ud83d\\udc57 dress\ -\f0 \uc0\u55357 \u56408 +\f0 \uc0\u55357 \u56408 \f1 \\ud83d\\udc58 kimono\ -\f0 \uc0\u55357 \u56409 +\f0 \uc0\u55357 \u56409 \f1 \\ud83d\\udc59 bikini\ -\f0 \uc0\u55357 \u56410 +\f0 \uc0\u55357 \u56410 \f1 \\ud83d\\udc5a womans clothes\ -\f0 \uc0\u55357 \u56411 +\f0 \uc0\u55357 \u56411 \f1 \\ud83d\\udc5b purse\ -\f0 \uc0\u55357 \u56412 +\f0 \uc0\u55357 \u56412 \f1 \\ud83d\\udc5c handbag\ -\f0 \uc0\u55357 \u56413 +\f0 \uc0\u55357 \u56413 \f1 \\ud83d\\udc5d pouch\ -\f0 \uc0\u55357 \u56414 +\f0 \uc0\u55357 \u56414 \f1 \\ud83d\\udc5e mans shoe\ -\f0 \uc0\u55357 \u56415 +\f0 \uc0\u55357 \u56415 \f1 \\ud83d\\udc5f athletic shoe\ -\f0 \uc0\u55357 \u56416 +\f0 \uc0\u55357 \u56416 \f1 \\ud83d\\udc60 high-heeled shoe\ -\f0 \uc0\u55357 \u56417 +\f0 \uc0\u55357 \u56417 \f1 \\ud83d\\udc61 womans sandal\ -\f0 \uc0\u55357 \u56418 +\f0 \uc0\u55357 \u56418 \f1 \\ud83d\\udc62 womans boots\ -\f0 \uc0\u55357 \u56419 +\f0 \uc0\u55357 \u56419 \f1 \\ud83d\\udc63 footprints\ -\f0 \uc0\u55357 \u56420 +\f0 \uc0\u55357 \u56420 \f1 \\ud83d\\udc64 bust in silhouette\ -\f0 \uc0\u55357 \u56422 +\f0 \uc0\u55357 \u56422 \f1 \\ud83d\\udc66 boy\ -\f0 \uc0\u55357 \u56423 +\f0 \uc0\u55357 \u56423 \f1 \\ud83d\\udc67 girl\ -\f0 \uc0\u55357 \u56424 +\f0 \uc0\u55357 \u56424 \f1 \\ud83d\\udc68 man\ -\f0 \uc0\u55357 \u56425 +\f0 \uc0\u55357 \u56425 \f1 \\ud83d\\udc69 woman\ -\f0 \uc0\u55357 \u56426 +\f0 \uc0\u55357 \u56426 \f1 \\ud83d\\udc6a family\ -\f0 \uc0\u55357 \u56427 +\f0 \uc0\u55357 \u56427 \f1 \\ud83d\\udc6b man and woman holding hands\ -\f0 \uc0\u55357 \u56430 +\f0 \uc0\u55357 \u56430 \f1 \\ud83d\\udc6e police officer\ -\f0 \uc0\u55357 \u56431 +\f0 \uc0\u55357 \u56431 \f1 \\ud83d\\udc6f woman with bunny ears\ -\f0 \uc0\u55357 \u56432 +\f0 \uc0\u55357 \u56432 \f1 \\ud83d\\udc70 bride with veil\ -\f0 \uc0\u55357 \u56433 +\f0 \uc0\u55357 \u56433 \f1 \\ud83d\\udc71 person with blond hair\ -\f0 \uc0\u55357 \u56434 +\f0 \uc0\u55357 \u56434 \f1 \\ud83d\\udc72 man with gua pi mao\ -\f0 \uc0\u55357 \u56435 +\f0 \uc0\u55357 \u56435 \f1 \\ud83d\\udc73 man with turban\ -\f0 \uc0\u55357 \u56436 +\f0 \uc0\u55357 \u56436 \f1 \\ud83d\\udc74 older man\ -\f0 \uc0\u55357 \u56437 +\f0 \uc0\u55357 \u56437 \f1 \\ud83d\\udc75 older woman\ -\f0 \uc0\u55357 \u56438 +\f0 \uc0\u55357 \u56438 \f1 \\ud83d\\udc76 baby\ -\f0 \uc0\u55357 \u56439 +\f0 \uc0\u55357 \u56439 \f1 \\ud83d\\udc77 construction worker\ -\f0 \uc0\u55357 \u56440 +\f0 \uc0\u55357 \u56440 \f1 \\ud83d\\udc78 princess\ -\f0 \uc0\u55357 \u56441 +\f0 \uc0\u55357 \u56441 \f1 \\ud83d\\udc79 japanese ogre\ -\f0 \uc0\u55357 \u56442 +\f0 \uc0\u55357 \u56442 \f1 \\ud83d\\udc7a japanese goblin\ -\f0 \uc0\u55357 \u56443 +\f0 \uc0\u55357 \u56443 \f1 \\ud83d\\udc7b ghost\ -\f0 \uc0\u55357 \u56444 +\f0 \uc0\u55357 \u56444 \f1 \\ud83d\\udc7c baby angel\ -\f0 \uc0\u55357 \u56445 +\f0 \uc0\u55357 \u56445 \f1 \\ud83d\\udc7d extraterrestrial alien\ -\f0 \uc0\u55357 \u56446 +\f0 \uc0\u55357 \u56446 \f1 \\ud83d\\udc7e alien monster\ -\f0 \uc0\u55357 \u56447 +\f0 \uc0\u55357 \u56447 \f1 \\ud83d\\udc7f imp\ -\f0 \uc0\u55357 \u56448 +\f0 \uc0\u55357 \u56448 \f1 \\ud83d\\udc80 skull\ -\f0 \uc0\u55357 \u56449 +\f0 \uc0\u55357 \u56449 \f1 \\ud83d\\udc81 information desk person\ -\f0 \uc0\u55357 \u56450 +\f0 \uc0\u55357 \u56450 \f1 \\ud83d\\udc82 guardsman\ -\f0 \uc0\u55357 \u56451 +\f0 \uc0\u55357 \u56451 \f1 \\ud83d\\udc83 dancer\ -\f0 \uc0\u55357 \u56452 +\f0 \uc0\u55357 \u56452 \f1 \\ud83d\\udc84 lipstick\ -\f0 \uc0\u55357 \u56453 +\f0 \uc0\u55357 \u56453 \f1 \\ud83d\\udc85 nail polish\ -\f0 \uc0\u55357 \u56454 +\f0 \uc0\u55357 \u56454 \f1 \\ud83d\\udc86 face massage\ -\f0 \uc0\u55357 \u56455 +\f0 \uc0\u55357 \u56455 \f1 \\ud83d\\udc87 haircut\ -\f0 \uc0\u55357 \u56456 +\f0 \uc0\u55357 \u56456 \f1 \\ud83d\\udc88 barber pole\ -\f0 \uc0\u55357 \u56457 +\f0 \uc0\u55357 \u56457 \f1 \\ud83d\\udc89 syringe\ -\f0 \uc0\u55357 \u56458 +\f0 \uc0\u55357 \u56458 \f1 \\ud83d\\udc8a pill\ -\f0 \uc0\u55357 \u56459 +\f0 \uc0\u55357 \u56459 \f1 \\ud83d\\udc8b kiss mark\ -\f0 \uc0\u55357 \u56460 +\f0 \uc0\u55357 \u56460 \f1 \\ud83d\\udc8c love letter\ -\f0 \uc0\u55357 \u56461 +\f0 \uc0\u55357 \u56461 \f1 \\ud83d\\udc8d ring\ -\f0 \uc0\u55357 \u56462 +\f0 \uc0\u55357 \u56462 \f1 \\ud83d\\udc8e gem stone\ -\f0 \uc0\u55357 \u56463 +\f0 \uc0\u55357 \u56463 \f1 \\ud83d\\udc8f kiss\ -\f0 \uc0\u55357 \u56464 +\f0 \uc0\u55357 \u56464 \f1 \\ud83d\\udc90 bouquet\ -\f0 \uc0\u55357 \u56465 +\f0 \uc0\u55357 \u56465 \f1 \\ud83d\\udc91 couple with heart\ -\f0 \uc0\u55357 \u56466 +\f0 \uc0\u55357 \u56466 \f1 \\ud83d\\udc92 wedding\ -\f0 \uc0\u55357 \u56467 +\f0 \uc0\u55357 \u56467 \f1 \\ud83d\\udc93 beating heart\ -\f0 \uc0\u55357 \u56468 +\f0 \uc0\u55357 \u56468 \f1 \\ud83d\\udc94 broken heart\ -\f0 \uc0\u55357 \u56469 +\f0 \uc0\u55357 \u56469 \f1 \\ud83d\\udc95 two hearts\ -\f0 \uc0\u55357 \u56470 +\f0 \uc0\u55357 \u56470 \f1 \\ud83d\\udc96 sparkling heart\ -\f0 \uc0\u55357 \u56471 +\f0 \uc0\u55357 \u56471 \f1 \\ud83d\\udc97 growing heart\ -\f0 \uc0\u55357 \u56472 +\f0 \uc0\u55357 \u56472 \f1 \\ud83d\\udc98 heart with arrow\ -\f0 \uc0\u55357 \u56473 +\f0 \uc0\u55357 \u56473 \f1 \\ud83d\\udc99 blue heart\ -\f0 \uc0\u55357 \u56474 +\f0 \uc0\u55357 \u56474 \f1 \\ud83d\\udc9a green heart\ -\f0 \uc0\u55357 \u56475 +\f0 \uc0\u55357 \u56475 \f1 \\ud83d\\udc9b yellow heart\ -\f0 \uc0\u55357 \u56476 +\f0 \uc0\u55357 \u56476 \f1 \\ud83d\\udc9c purple heart\ -\f0 \uc0\u55357 \u56477 +\f0 \uc0\u55357 \u56477 \f1 \\ud83d\\udc9d heart with ribbon\ -\f0 \uc0\u55357 \u56478 +\f0 \uc0\u55357 \u56478 \f1 \\ud83d\\udc9e revolving hearts\ -\f0 \uc0\u55357 \u56479 +\f0 \uc0\u55357 \u56479 \f1 \\ud83d\\udc9f heart decoration\ -\f0 \uc0\u55357 \u56480 +\f0 \uc0\u55357 \u56480 \f1 \\ud83d\\udca0 diamond shape with a dot inside\ -\f0 \uc0\u55357 \u56481 +\f0 \uc0\u55357 \u56481 \f1 \\ud83d\\udca1 electric light bulb\ -\f0 \uc0\u55357 \u56482 +\f0 \uc0\u55357 \u56482 \f1 \\ud83d\\udca2 anger symbol\ -\f0 \uc0\u55357 \u56483 +\f0 \uc0\u55357 \u56483 \f1 \\ud83d\\udca3 bomb\ -\f0 \uc0\u55357 \u56484 +\f0 \uc0\u55357 \u56484 \f1 \\ud83d\\udca4 sleeping symbol\ -\f0 \uc0\u55357 \u56485 +\f0 \uc0\u55357 \u56485 \f1 \\ud83d\\udca5 collision symbol\ -\f0 \uc0\u55357 \u56486 +\f0 \uc0\u55357 \u56486 \f1 \\ud83d\\udca6 splashing sweat symbol\ -\f0 \uc0\u55357 \u56487 +\f0 \uc0\u55357 \u56487 \f1 \\ud83d\\udca7 droplet\ -\f0 \uc0\u55357 \u56488 +\f0 \uc0\u55357 \u56488 \f1 \\ud83d\\udca8 dash symbol\ -\f0 \uc0\u55357 \u56489 +\f0 \uc0\u55357 \u56489 \f1 \\ud83d\\udca9 pile of poo\ -\f0 \uc0\u55357 \u56490 +\f0 \uc0\u55357 \u56490 \f1 \\ud83d\\udcaa flexed biceps\ -\f0 \uc0\u55357 \u56491 +\f0 \uc0\u55357 \u56491 \f1 \\ud83d\\udcab dizzy symbol\ -\f0 \uc0\u55357 \u56492 +\f0 \uc0\u55357 \u56492 \f1 \\ud83d\\udcac speech balloon\ -\f0 \uc0\u55357 \u56494 +\f0 \uc0\u55357 \u56494 \f1 \\ud83d\\udcae white flower\ -\f0 \uc0\u55357 \u56495 +\f0 \uc0\u55357 \u56495 \f1 \\ud83d\\udcaf hundred points symbol\ -\f0 \uc0\u55357 \u56496 +\f0 \uc0\u55357 \u56496 \f1 \\ud83d\\udcb0 money bag\ -\f0 \uc0\u55357 \u56497 +\f0 \uc0\u55357 \u56497 \f1 \\ud83d\\udcb1 currency exchange\ -\f0 \uc0\u55357 \u56498 +\f0 \uc0\u55357 \u56498 \f1 \\ud83d\\udcb2 heavy dollar sign\ -\f0 \uc0\u55357 \u56499 +\f0 \uc0\u55357 \u56499 \f1 \\ud83d\\udcb3 credit card\ -\f0 \uc0\u55357 \u56500 +\f0 \uc0\u55357 \u56500 \f1 \\ud83d\\udcb4 banknote with yen sign\ -\f0 \uc0\u55357 \u56501 +\f0 \uc0\u55357 \u56501 \f1 \\ud83d\\udcb5 banknote with dollar sign\ -\f0 \uc0\u55357 \u56504 +\f0 \uc0\u55357 \u56504 \f1 \\ud83d\\udcb8 money with wings\ -\f0 \uc0\u55357 \u56505 +\f0 \uc0\u55357 \u56505 \f1 \\ud83d\\udcb9 chart with upwards trend and yen sign\ -\f0 \uc0\u55357 \u56506 +\f0 \uc0\u55357 \u56506 \f1 \\ud83d\\udcba seat\ -\f0 \uc0\u55357 \u56507 +\f0 \uc0\u55357 \u56507 \f1 \\ud83d\\udcbb personal computer\ -\f0 \uc0\u55357 \u56508 +\f0 \uc0\u55357 \u56508 \f1 \\ud83d\\udcbc briefcase\ -\f0 \uc0\u55357 \u56509 +\f0 \uc0\u55357 \u56509 \f1 \\ud83d\\udcbd minidisc\ -\f0 \uc0\u55357 \u56510 +\f0 \uc0\u55357 \u56510 \f1 \\ud83d\\udcbe floppy disk\ -\f0 \uc0\u55357 \u56511 +\f0 \uc0\u55357 \u56511 \f1 \\ud83d\\udcbf optical disc\ -\f0 \uc0\u55357 \u56512 +\f0 \uc0\u55357 \u56512 \f1 \\ud83d\\udcc0 dvd\ -\f0 \uc0\u55357 \u56513 +\f0 \uc0\u55357 \u56513 \f1 \\ud83d\\udcc1 file folder\ -\f0 \uc0\u55357 \u56514 +\f0 \uc0\u55357 \u56514 \f1 \\ud83d\\udcc2 open file folder\ -\f0 \uc0\u55357 \u56515 +\f0 \uc0\u55357 \u56515 \f1 \\ud83d\\udcc3 page with curl\ -\f0 \uc0\u55357 \u56516 +\f0 \uc0\u55357 \u56516 \f1 \\ud83d\\udcc4 page facing up\ -\f0 \uc0\u55357 \u56517 +\f0 \uc0\u55357 \u56517 \f1 \\ud83d\\udcc5 calendar\ -\f0 \uc0\u55357 \u56518 +\f0 \uc0\u55357 \u56518 \f1 \\ud83d\\udcc6 tear-off calendar\ -\f0 \uc0\u55357 \u56519 +\f0 \uc0\u55357 \u56519 \f1 \\ud83d\\udcc7 card index\ -\f0 \uc0\u55357 \u56520 +\f0 \uc0\u55357 \u56520 \f1 \\ud83d\\udcc8 chart with upwards trend\ -\f0 \uc0\u55357 \u56521 +\f0 \uc0\u55357 \u56521 \f1 \\ud83d\\udcc9 chart with downwards trend\ -\f0 \uc0\u55357 \u56522 +\f0 \uc0\u55357 \u56522 \f1 \\ud83d\\udcca bar chart\ -\f0 \uc0\u55357 \u56523 +\f0 \uc0\u55357 \u56523 \f1 \\ud83d\\udccb clipboard\ -\f0 \uc0\u55357 \u56524 +\f0 \uc0\u55357 \u56524 \f1 \\ud83d\\udccc pushpin\ -\f0 \uc0\u55357 \u56525 +\f0 \uc0\u55357 \u56525 \f1 \\ud83d\\udccd round pushpin\ -\f0 \uc0\u55357 \u56526 +\f0 \uc0\u55357 \u56526 \f1 \\ud83d\\udcce paperclip\ -\f0 \uc0\u55357 \u56527 +\f0 \uc0\u55357 \u56527 \f1 \\ud83d\\udccf straight ruler\ -\f0 \uc0\u55357 \u56528 +\f0 \uc0\u55357 \u56528 \f1 \\ud83d\\udcd0 triangular ruler\ -\f0 \uc0\u55357 \u56529 +\f0 \uc0\u55357 \u56529 \f1 \\ud83d\\udcd1 bookmark tabs\ -\f0 \uc0\u55357 \u56530 +\f0 \uc0\u55357 \u56530 \f1 \\ud83d\\udcd2 ledger\ -\f0 \uc0\u55357 \u56531 +\f0 \uc0\u55357 \u56531 \f1 \\ud83d\\udcd3 notebook\ -\f0 \uc0\u55357 \u56532 +\f0 \uc0\u55357 \u56532 \f1 \\ud83d\\udcd4 notebook with decorative cover\ -\f0 \uc0\u55357 \u56533 +\f0 \uc0\u55357 \u56533 \f1 \\ud83d\\udcd5 closed book\ -\f0 \uc0\u55357 \u56534 +\f0 \uc0\u55357 \u56534 \f1 \\ud83d\\udcd6 open book\ -\f0 \uc0\u55357 \u56535 +\f0 \uc0\u55357 \u56535 \f1 \\ud83d\\udcd7 green book\ -\f0 \uc0\u55357 \u56536 +\f0 \uc0\u55357 \u56536 \f1 \\ud83d\\udcd8 blue book\ -\f0 \uc0\u55357 \u56537 +\f0 \uc0\u55357 \u56537 \f1 \\ud83d\\udcd9 orange book\ -\f0 \uc0\u55357 \u56538 +\f0 \uc0\u55357 \u56538 \f1 \\ud83d\\udcda books\ -\f0 \uc0\u55357 \u56539 +\f0 \uc0\u55357 \u56539 \f1 \\ud83d\\udcdb name badge\ -\f0 \uc0\u55357 \u56540 +\f0 \uc0\u55357 \u56540 \f1 \\ud83d\\udcdc scroll\ -\f0 \uc0\u55357 \u56541 +\f0 \uc0\u55357 \u56541 \f1 \\ud83d\\udcdd memo\ -\f0 \uc0\u55357 \u56542 +\f0 \uc0\u55357 \u56542 \f1 \\ud83d\\udcde telephone receiver\ -\f0 \uc0\u55357 \u56543 +\f0 \uc0\u55357 \u56543 \f1 \\ud83d\\udcdf pager\ -\f0 \uc0\u55357 \u56544 +\f0 \uc0\u55357 \u56544 \f1 \\ud83d\\udce0 fax machine\ -\f0 \uc0\u55357 \u56545 +\f0 \uc0\u55357 \u56545 \f1 \\ud83d\\udce1 satellite antenna\ -\f0 \uc0\u55357 \u56546 +\f0 \uc0\u55357 \u56546 \f1 \\ud83d\\udce2 public address loudspeaker\ -\f0 \uc0\u55357 \u56547 +\f0 \uc0\u55357 \u56547 \f1 \\ud83d\\udce3 cheering megaphone\ -\f0 \uc0\u55357 \u56548 +\f0 \uc0\u55357 \u56548 \f1 \\ud83d\\udce4 outbox tray\ -\f0 \uc0\u55357 \u56549 +\f0 \uc0\u55357 \u56549 \f1 \\ud83d\\udce5 inbox tray\ -\f0 \uc0\u55357 \u56550 +\f0 \uc0\u55357 \u56550 \f1 \\ud83d\\udce6 package\ -\f0 \uc0\u55357 \u56551 +\f0 \uc0\u55357 \u56551 \f1 \\ud83d\\udce7 e-mail symbol\ -\f0 \uc0\u55357 \u56552 +\f0 \uc0\u55357 \u56552 \f1 \\ud83d\\udce8 incoming envelope\ -\f0 \uc0\u55357 \u56553 +\f0 \uc0\u55357 \u56553 \f1 \\ud83d\\udce9 envelope with downwards arrow above\ -\f0 \uc0\u55357 \u56554 +\f0 \uc0\u55357 \u56554 \f1 \\ud83d\\udcea closed mailbox with lowered flag\ -\f0 \uc0\u55357 \u56555 +\f0 \uc0\u55357 \u56555 \f1 \\ud83d\\udceb closed mailbox with raised flag\ -\f0 \uc0\u55357 \u56558 +\f0 \uc0\u55357 \u56558 \f1 \\ud83d\\udcee postbox\ -\f0 \uc0\u55357 \u56560 +\f0 \uc0\u55357 \u56560 \f1 \\ud83d\\udcf0 newspaper\ -\f0 \uc0\u55357 \u56561 +\f0 \uc0\u55357 \u56561 \f1 \\ud83d\\udcf1 mobile phone\ -\f0 \uc0\u55357 \u56562 +\f0 \uc0\u55357 \u56562 \f1 \\ud83d\\udcf2 mobile phone with rightwards arrow at left\ -\f0 \uc0\u55357 \u56563 +\f0 \uc0\u55357 \u56563 \f1 \\ud83d\\udcf3 vibration mode\ -\f0 \uc0\u55357 \u56564 +\f0 \uc0\u55357 \u56564 \f1 \\ud83d\\udcf4 mobile phone off\ -\f0 \uc0\u55357 \u56566 +\f0 \uc0\u55357 \u56566 \f1 \\ud83d\\udcf6 antenna with bars\ -\f0 \uc0\u55357 \u56567 +\f0 \uc0\u55357 \u56567 \f1 \\ud83d\\udcf7 camera\ -\f0 \uc0\u55357 \u56569 +\f0 \uc0\u55357 \u56569 \f1 \\ud83d\\udcf9 video camera\ -\f0 \uc0\u55357 \u56570 +\f0 \uc0\u55357 \u56570 \f1 \\ud83d\\udcfa television\ -\f0 \uc0\u55357 \u56571 +\f0 \uc0\u55357 \u56571 \f1 \\ud83d\\udcfb radio\ -\f0 \uc0\u55357 \u56572 +\f0 \uc0\u55357 \u56572 \f1 \\ud83d\\udcfc videocassette\ -\f0 \uc0\u55357 \u56579 +\f0 \uc0\u55357 \u56579 \f1 \\ud83d\\udd03 clockwise downwards and upwards open circle arrows\ -\f0 \uc0\u55357 \u56586 +\f0 \uc0\u55357 \u56586 \f1 \\ud83d\\udd0a speaker with three sound waves\ -\f0 \uc0\u55357 \u56587 +\f0 \uc0\u55357 \u56587 \f1 \\ud83d\\udd0b battery\ -\f0 \uc0\u55357 \u56588 +\f0 \uc0\u55357 \u56588 \f1 \\ud83d\\udd0c electric plug\ -\f0 \uc0\u55357 \u56589 +\f0 \uc0\u55357 \u56589 \f1 \\ud83d\\udd0d left-pointing magnifying glass\ -\f0 \uc0\u55357 \u56590 +\f0 \uc0\u55357 \u56590 \f1 \\ud83d\\udd0e right-pointing magnifying glass\ -\f0 \uc0\u55357 \u56591 +\f0 \uc0\u55357 \u56591 \f1 \\ud83d\\udd0f lock with ink pen\ -\f0 \uc0\u55357 \u56592 +\f0 \uc0\u55357 \u56592 \f1 \\ud83d\\udd10 closed lock with key\ -\f0 \uc0\u55357 \u56593 +\f0 \uc0\u55357 \u56593 \f1 \\ud83d\\udd11 key\ -\f0 \uc0\u55357 \u56594 +\f0 \uc0\u55357 \u56594 \f1 \\ud83d\\udd12 lock\ -\f0 \uc0\u55357 \u56595 +\f0 \uc0\u55357 \u56595 \f1 \\ud83d\\udd13 open lock\ -\f0 \uc0\u55357 \u56596 +\f0 \uc0\u55357 \u56596 \f1 \\ud83d\\udd14 bell\ -\f0 \uc0\u55357 \u56598 +\f0 \uc0\u55357 \u56598 \f1 \\ud83d\\udd16 bookmark\ -\f0 \uc0\u55357 \u56599 +\f0 \uc0\u55357 \u56599 \f1 \\ud83d\\udd17 link symbol\ -\f0 \uc0\u55357 \u56600 +\f0 \uc0\u55357 \u56600 \f1 \\ud83d\\udd18 radio button\ -\f0 \uc0\u55357 \u56601 +\f0 \uc0\u55357 \u56601 \f1 \\ud83d\\udd19 back with leftwards arrow above\ -\f0 \uc0\u55357 \u56602 +\f0 \uc0\u55357 \u56602 \f1 \\ud83d\\udd1a end with leftwards arrow above\ -\f0 \uc0\u55357 \u56603 +\f0 \uc0\u55357 \u56603 \f1 \\ud83d\\udd1b on with exclamation mark with left right arrow above\ -\f0 \uc0\u55357 \u56604 +\f0 \uc0\u55357 \u56604 \f1 \\ud83d\\udd1c soon with rightwards arrow above\ -\f0 \uc0\u55357 \u56605 +\f0 \uc0\u55357 \u56605 \f1 \\ud83d\\udd1d top with upwards arrow above\ -\f0 \uc0\u55357 \u56606 +\f0 \uc0\u55357 \u56606 \f1 \\ud83d\\udd1e no one under eighteen symbol\ -\f0 \uc0\u55357 \u56607 +\f0 \uc0\u55357 \u56607 \f1 \\ud83d\\udd1f keycap ten\ -\f0 \uc0\u55357 \u56608 +\f0 \uc0\u55357 \u56608 \f1 \\ud83d\\udd20 input symbol for latin capital letters\ -\f0 \uc0\u55357 \u56609 +\f0 \uc0\u55357 \u56609 \f1 \\ud83d\\udd21 input symbol for latin small letters\ -\f0 \uc0\u55357 \u56610 +\f0 \uc0\u55357 \u56610 \f1 \\ud83d\\udd22 input symbol for numbers\ -\f0 \uc0\u55357 \u56611 +\f0 \uc0\u55357 \u56611 \f1 \\ud83d\\udd23 input symbol for symbols\ -\f0 \uc0\u55357 \u56612 +\f0 \uc0\u55357 \u56612 \f1 \\ud83d\\udd24 input symbol for latin letters\ -\f0 \uc0\u55357 \u56613 +\f0 \uc0\u55357 \u56613 \f1 \\ud83d\\udd25 fire\ -\f0 \uc0\u55357 \u56614 +\f0 \uc0\u55357 \u56614 \f1 \\ud83d\\udd26 electric torch\ -\f0 \uc0\u55357 \u56615 +\f0 \uc0\u55357 \u56615 \f1 \\ud83d\\udd27 wrench\ -\f0 \uc0\u55357 \u56616 +\f0 \uc0\u55357 \u56616 \f1 \\ud83d\\udd28 hammer\ -\f0 \uc0\u55357 \u56617 +\f0 \uc0\u55357 \u56617 \f1 \\ud83d\\udd29 nut and bolt\ -\f0 \uc0\u55357 \u56618 +\f0 \uc0\u55357 \u56618 \f1 \\ud83d\\udd2a hocho\ -\f0 \uc0\u55357 \u56619 +\f0 \uc0\u55357 \u56619 \f1 \\ud83d\\udd2b pistol\ -\f0 \uc0\u55357 \u56622 +\f0 \uc0\u55357 \u56622 \f1 \\ud83d\\udd2e crystal ball\ -\f0 \uc0\u55357 \u56623 +\f0 \uc0\u55357 \u56623 \f1 \\ud83d\\udd2f six pointed star with middle dot\ -\f0 \uc0\u55357 \u56624 +\f0 \uc0\u55357 \u56624 \f1 \\ud83d\\udd30 japanese symbol for beginner\ -\f0 \uc0\u55357 \u56625 +\f0 \uc0\u55357 \u56625 \f1 \\ud83d\\udd31 trident emblem\ -\f0 \uc0\u55357 \u56626 +\f0 \uc0\u55357 \u56626 \f1 \\ud83d\\udd32 black square button\ -\f0 \uc0\u55357 \u56627 +\f0 \uc0\u55357 \u56627 \f1 \\ud83d\\udd33 white square button\ -\f0 \uc0\u55357 \u56628 +\f0 \uc0\u55357 \u56628 \f1 \\ud83d\\udd34 large red circle\ -\f0 \uc0\u55357 \u56629 +\f0 \uc0\u55357 \u56629 \f1 \\ud83d\\udd35 large blue circle\ -\f0 \uc0\u55357 \u56630 +\f0 \uc0\u55357 \u56630 \f1 \\ud83d\\udd36 large orange diamond\ -\f0 \uc0\u55357 \u56631 +\f0 \uc0\u55357 \u56631 \f1 \\ud83d\\udd37 large blue diamond\ -\f0 \uc0\u55357 \u56632 +\f0 \uc0\u55357 \u56632 \f1 \\ud83d\\udd38 small orange diamond\ -\f0 \uc0\u55357 \u56633 +\f0 \uc0\u55357 \u56633 \f1 \\ud83d\\udd39 small blue diamond\ -\f0 \uc0\u55357 \u56634 +\f0 \uc0\u55357 \u56634 \f1 \\ud83d\\udd3a up-pointing red triangle\ -\f0 \uc0\u55357 \u56635 +\f0 \uc0\u55357 \u56635 \f1 \\ud83d\\udd3b down-pointing red triangle\ -\f0 \uc0\u55357 \u56636 +\f0 \uc0\u55357 \u56636 \f1 \\ud83d\\udd3c up-pointing small red triangle\ -\f0 \uc0\u55357 \u56637 +\f0 \uc0\u55357 \u56637 \f1 \\ud83d\\udd3d down-pointing small red triangle\ -\f0 \uc0\u55357 \u56656 +\f0 \uc0\u55357 \u56656 \f1 \\ud83d\\udd50 clock face one oclock\ -\f0 \uc0\u55357 \u56657 +\f0 \uc0\u55357 \u56657 \f1 \\ud83d\\udd51 clock face two oclock\ -\f0 \uc0\u55357 \u56658 +\f0 \uc0\u55357 \u56658 \f1 \\ud83d\\udd52 clock face three oclock\ -\f0 \uc0\u55357 \u56659 +\f0 \uc0\u55357 \u56659 \f1 \\ud83d\\udd53 clock face four oclock\ -\f0 \uc0\u55357 \u56660 +\f0 \uc0\u55357 \u56660 \f1 \\ud83d\\udd54 clock face five oclock\ -\f0 \uc0\u55357 \u56661 +\f0 \uc0\u55357 \u56661 \f1 \\ud83d\\udd55 clock face six oclock\ -\f0 \uc0\u55357 \u56662 +\f0 \uc0\u55357 \u56662 \f1 \\ud83d\\udd56 clock face seven oclock\ -\f0 \uc0\u55357 \u56663 +\f0 \uc0\u55357 \u56663 \f1 \\ud83d\\udd57 clock face eight oclock\ -\f0 \uc0\u55357 \u56664 +\f0 \uc0\u55357 \u56664 \f1 \\ud83d\\udd58 clock face nine oclock\ -\f0 \uc0\u55357 \u56665 +\f0 \uc0\u55357 \u56665 \f1 \\ud83d\\udd59 clock face ten oclock\ -\f0 \uc0\u55357 \u56666 +\f0 \uc0\u55357 \u56666 \f1 \\ud83d\\udd5a clock face eleven oclock\ -\f0 \uc0\u55357 \u56667 +\f0 \uc0\u55357 \u56667 \f1 \\ud83d\\udd5b clock face twelve oclock\ -\f0 \uc0\u55357 \u56827 +\f0 \uc0\u55357 \u56827 \f1 \\ud83d\\uddfb mount fuji\ -\f0 \uc0\u55357 \u56828 +\f0 \uc0\u55357 \u56828 \f1 \\ud83d\\uddfc tokyo tower\ -\f0 \uc0\u55357 \u56829 +\f0 \uc0\u55357 \u56829 \f1 \\ud83d\\uddfd statue of liberty\ -\f0 \uc0\u55357 \u56830 +\f0 \uc0\u55357 \u56830 \f1 \\ud83d\\uddfe silhouette of japan\ -\f0 \uc0\u55357 \u56831 +\f0 \uc0\u55357 \u56831 \f1 \\ud83d\\uddff moyai\ -\f0 \uc0\u55357 \u56832 +\f0 \uc0\u55357 \u56832 \f1 \\ud83d\\ude00 grinning face\ -\f0 \uc0\u55357 \u56839 +\f0 \uc0\u55357 \u56839 \f1 \\ud83d\\ude07 smiling face with halo\ -\f0 \uc0\u55357 \u56840 +\f0 \uc0\u55357 \u56840 \f1 \\ud83d\\ude08 smiling face with horns\ -\f0 \uc0\u55357 \u56846 +\f0 \uc0\u55357 \u56846 \f1 \\ud83d\\ude0e smiling face with sunglasses\ -\f0 \uc0\u55357 \u56848 +\f0 \uc0\u55357 \u56848 \f1 \\ud83d\\ude10 neutral face\ -\f0 \uc0\u55357 \u56849 +\f0 \uc0\u55357 \u56849 \f1 \\ud83d\\ude11 expressionless face\ -\f0 \uc0\u55357 \u56853 +\f0 \uc0\u55357 \u56853 \f1 \\ud83d\\ude15 confused face\ -\f0 \uc0\u55357 \u56855 +\f0 \uc0\u55357 \u56855 \f1 \\ud83d\\ude17 kissing face\ -\f0 \uc0\u55357 \u56857 +\f0 \uc0\u55357 \u56857 \f1 \\ud83d\\ude19 kissing face with smiling eyes\ -\f0 \uc0\u55357 \u56859 +\f0 \uc0\u55357 \u56859 \f1 \\ud83d\\ude1b face with stuck-out tongue\ -\f0 \uc0\u55357 \u56863 +\f0 \uc0\u55357 \u56863 \f1 \\ud83d\\ude1f worried face\ -\f0 \uc0\u55357 \u56870 +\f0 \uc0\u55357 \u56870 \f1 \\ud83d\\ude26 frowning face with open mouth\ -\f0 \uc0\u55357 \u56871 +\f0 \uc0\u55357 \u56871 \f1 \\ud83d\\ude27 anguished face\ -\f0 \uc0\u55357 \u56876 +\f0 \uc0\u55357 \u56876 \f1 \\ud83d\\ude2c grimacing face\ -\f0 \uc0\u55357 \u56878 +\f0 \uc0\u55357 \u56878 \f1 \\ud83d\\ude2e face with open mouth\ -\f0 \uc0\u55357 \u56879 +\f0 \uc0\u55357 \u56879 \f1 \\ud83d\\ude2f hushed face\ -\f0 \uc0\u55357 \u56884 +\f0 \uc0\u55357 \u56884 \f1 \\ud83d\\ude34 sleeping face\ -\f0 \uc0\u55357 \u56886 +\f0 \uc0\u55357 \u56886 \f1 \\ud83d\\ude36 face without mouth\ -\f0 \uc0\u55357 \u56961 +\f0 \uc0\u55357 \u56961 \f1 \\ud83d\\ude81 helicopter\ -\f0 \uc0\u55357 \u56962 +\f0 \uc0\u55357 \u56962 \f1 \\ud83d\\ude82 steam locomotive\ -\f0 \uc0\u55357 \u56966 +\f0 \uc0\u55357 \u56966 \f1 \\ud83d\\ude86 train\ -\f0 \uc0\u55357 \u56968 +\f0 \uc0\u55357 \u56968 \f1 \\ud83d\\ude88 light rail\ -\f0 \uc0\u55357 \u56970 +\f0 \uc0\u55357 \u56970 \f1 \\ud83d\\ude8a tram\ -\f0 \uc0\u55357 \u56973 +\f0 \uc0\u55357 \u56973 \f1 \\ud83d\\ude8d oncoming bus\ -\f0 \uc0\u55357 \u56974 +\f0 \uc0\u55357 \u56974 \f1 \\ud83d\\ude8e trolleybus\ -\f0 \uc0\u55357 \u56976 +\f0 \uc0\u55357 \u56976 \f1 \\ud83d\\ude90 minibus\ -\f0 \uc0\u55357 \u56980 +\f0 \uc0\u55357 \u56980 \f1 \\ud83d\\ude94 oncoming police car\ -\f0 \uc0\u55357 \u56982 +\f0 \uc0\u55357 \u56982 \f1 \\ud83d\\ude96 oncoming taxi\ -\f0 \uc0\u55357 \u56984 +\f0 \uc0\u55357 \u56984 \f1 \\ud83d\\ude98 oncoming automobile\ -\f0 \uc0\u55357 \u56987 +\f0 \uc0\u55357 \u56987 \f1 \\ud83d\\ude9b articulated lorry\ -\f0 \uc0\u55357 \u56988 +\f0 \uc0\u55357 \u56988 \f1 \\ud83d\\ude9c tractor\ -\f0 \uc0\u55357 \u56989 +\f0 \uc0\u55357 \u56989 \f1 \\ud83d\\ude9d monorail\ -\f0 \uc0\u55357 \u56990 +\f0 \uc0\u55357 \u56990 \f1 \\ud83d\\ude9e mountain railway\ -\f0 \uc0\u55357 \u56991 +\f0 \uc0\u55357 \u56991 \f1 \\ud83d\\ude9f suspension railway\ -\f0 \uc0\u55357 \u56992 +\f0 \uc0\u55357 \u56992 \f1 \\ud83d\\udea0 mountain cableway\ -\f0 \uc0\u55357 \u56993 +\f0 \uc0\u55357 \u56993 \f1 \\ud83d\\udea1 aerial tramway\ -\f0 \uc0\u55357 \u56995 +\f0 \uc0\u55357 \u56995 \f1 \\ud83d\\udea3 rowboat\ -\f0 \uc0\u55357 \u56998 +\f0 \uc0\u55357 \u56998 \f1 \\ud83d\\udea6 vertical traffic light\ -\f0 \uc0\u55357 \u57006 +\f0 \uc0\u55357 \u57006 \f1 \\ud83d\\udeae put litter in its place symbol\ -\f0 \uc0\u55357 \u57007 +\f0 \uc0\u55357 \u57007 \f1 \\ud83d\\udeaf do not litter symbol\ -\f0 \uc0\u55357 \u57008 +\f0 \uc0\u55357 \u57008 \f1 \\ud83d\\udeb0 potable water symbol\ -\f0 \uc0\u55357 \u57009 +\f0 \uc0\u55357 \u57009 \f1 \\ud83d\\udeb1 non-potable water symbol\ -\f0 \uc0\u55357 \u57011 +\f0 \uc0\u55357 \u57011 \f1 \\ud83d\\udeb3 no bicycles\ -\f0 \uc0\u55357 \u57012 +\f0 \uc0\u55357 \u57012 \f1 \\ud83d\\udeb4 bicyclist\ -\f0 \uc0\u55357 \u57013 +\f0 \uc0\u55357 \u57013 \f1 \\ud83d\\udeb5 mountain bicyclist\ -\f0 \uc0\u55357 \u57015 +\f0 \uc0\u55357 \u57015 \f1 \\ud83d\\udeb7 no pedestrians\ -\f0 \uc0\u55357 \u57016 +\f0 \uc0\u55357 \u57016 \f1 \\ud83d\\udeb8 children crossing\ -\f0 \uc0\u55357 \u57023 +\f0 \uc0\u55357 \u57023 \f1 \\ud83d\\udebf shower\ -\f0 \uc0\u55357 \u57025 +\f0 \uc0\u55357 \u57025 \f1 \\ud83d\\udec1 bathtub\ -\f0 \uc0\u55357 \u57026 +\f0 \uc0\u55357 \u57026 \f1 \\ud83d\\udec2 passport control\ -\f0 \uc0\u55357 \u57027 +\f0 \uc0\u55357 \u57027 \f1 \\ud83d\\udec3 customs\ -\f0 \uc0\u55357 \u57028 +\f0 \uc0\u55357 \u57028 \f1 \\ud83d\\udec4 baggage claim\ -\f0 \uc0\u55357 \u57029 +\f0 \uc0\u55357 \u57029 \f1 \\ud83d\\udec5 left luggage\ -\f0 \uc0\u55356 \u57101 +\f0 \uc0\u55356 \u57101 \f1 \\ud83c\\udf0d earth globe europe-africa\ -\f0 \uc0\u55356 \u57102 +\f0 \uc0\u55356 \u57102 \f1 \\ud83c\\udf0e earth globe americas\ -\f0 \uc0\u55356 \u57104 +\f0 \uc0\u55356 \u57104 \f1 \\ud83c\\udf10 globe with meridians\ -\f0 \uc0\u55356 \u57106 +\f0 \uc0\u55356 \u57106 \f1 \\ud83c\\udf12 waxing crescent moon symbol\ -\f0 \uc0\u55356 \u57110 +\f0 \uc0\u55356 \u57110 \f1 \\ud83c\\udf16 waning gibbous moon symbol\ -\f0 \uc0\u55356 \u57111 +\f0 \uc0\u55356 \u57111 \f1 \\ud83c\\udf17 last quarter moon symbol\ -\f0 \uc0\u55356 \u57112 +\f0 \uc0\u55356 \u57112 \f1 \\ud83c\\udf18 waning crescent moon symbol\ -\f0 \uc0\u55356 \u57114 +\f0 \uc0\u55356 \u57114 \f1 \\ud83c\\udf1a new moon with face\ -\f0 \uc0\u55356 \u57116 +\f0 \uc0\u55356 \u57116 \f1 \\ud83c\\udf1c last quarter moon with face\ -\f0 \uc0\u55356 \u57117 +\f0 \uc0\u55356 \u57117 \f1 \\ud83c\\udf1d full moon with face\ -\f0 \uc0\u55356 \u57118 +\f0 \uc0\u55356 \u57118 \f1 \\ud83c\\udf1e sun with face\ -\f0 \uc0\u55356 \u57138 +\f0 \uc0\u55356 \u57138 \f1 \\ud83c\\udf32 evergreen tree\ -\f0 \uc0\u55356 \u57139 +\f0 \uc0\u55356 \u57139 \f1 \\ud83c\\udf33 deciduous tree\ -\f0 \uc0\u55356 \u57163 +\f0 \uc0\u55356 \u57163 \f1 \\ud83c\\udf4b lemon\ -\f0 \uc0\u55356 \u57168 +\f0 \uc0\u55356 \u57168 \f1 \\ud83c\\udf50 pear\ -\f0 \uc0\u55356 \u57212 +\f0 \uc0\u55356 \u57212 \f1 \\ud83c\\udf7c baby bottle\ -\f0 \uc0\u55356 \u57287 +\f0 \uc0\u55356 \u57287 \f1 \\ud83c\\udfc7 horse racing\ -\f0 \uc0\u55356 \u57289 +\f0 \uc0\u55356 \u57289 \f1 \\ud83c\\udfc9 rugby football\ -\f0 \uc0\u55356 \u57316 +\f0 \uc0\u55356 \u57316 \f1 \\ud83c\\udfe4 european post office\ -\f0 \uc0\u55357 \u56320 +\f0 \uc0\u55357 \u56320 \f1 \\ud83d\\udc00 rat\ -\f0 \uc0\u55357 \u56321 +\f0 \uc0\u55357 \u56321 \f1 \\ud83d\\udc01 mouse\ -\f0 \uc0\u55357 \u56322 +\f0 \uc0\u55357 \u56322 \f1 \\ud83d\\udc02 ox\ -\f0 \uc0\u55357 \u56323 +\f0 \uc0\u55357 \u56323 \f1 \\ud83d\\udc03 water buffalo\ -\f0 \uc0\u55357 \u56324 +\f0 \uc0\u55357 \u56324 \f1 \\ud83d\\udc04 cow\ -\f0 \uc0\u55357 \u56325 +\f0 \uc0\u55357 \u56325 \f1 \\ud83d\\udc05 tiger\ -\f0 \uc0\u55357 \u56326 +\f0 \uc0\u55357 \u56326 \f1 \\ud83d\\udc06 leopard\ -\f0 \uc0\u55357 \u56327 +\f0 \uc0\u55357 \u56327 \f1 \\ud83d\\udc07 rabbit\ -\f0 \uc0\u55357 \u56328 +\f0 \uc0\u55357 \u56328 \f1 \\ud83d\\udc08 cat\ -\f0 \uc0\u55357 \u56329 +\f0 \uc0\u55357 \u56329 \f1 \\ud83d\\udc09 dragon\ -\f0 \uc0\u55357 \u56330 +\f0 \uc0\u55357 \u56330 \f1 \\ud83d\\udc0a crocodile\ -\f0 \uc0\u55357 \u56331 +\f0 \uc0\u55357 \u56331 \f1 \\ud83d\\udc0b whale\ -\f0 \uc0\u55357 \u56335 +\f0 \uc0\u55357 \u56335 \f1 \\ud83d\\udc0f ram\ -\f0 \uc0\u55357 \u56336 +\f0 \uc0\u55357 \u56336 \f1 \\ud83d\\udc10 goat\ -\f0 \uc0\u55357 \u56339 +\f0 \uc0\u55357 \u56339 \f1 \\ud83d\\udc13 rooster\ -\f0 \uc0\u55357 \u56341 +\f0 \uc0\u55357 \u56341 \f1 \\ud83d\\udc15 dog\ -\f0 \uc0\u55357 \u56342 +\f0 \uc0\u55357 \u56342 \f1 \\ud83d\\udc16 pig\ -\f0 \uc0\u55357 \u56362 +\f0 \uc0\u55357 \u56362 \f1 \\ud83d\\udc2a dromedary camel\ -\f0 \uc0\u55357 \u56421 +\f0 \uc0\u55357 \u56421 \f1 \\ud83d\\udc65 busts in silhouette\ -\f0 \uc0\u55357 \u56428 +\f0 \uc0\u55357 \u56428 \f1 \\ud83d\\udc6c two men holding hands\ -\f0 \uc0\u55357 \u56429 +\f0 \uc0\u55357 \u56429 \f1 \\ud83d\\udc6d two women holding hands\ -\f0 \uc0\u55357 \u56493 +\f0 \uc0\u55357 \u56493 \f1 \\ud83d\\udcad thought balloon\ -\f0 \uc0\u55357 \u56502 +\f0 \uc0\u55357 \u56502 \f1 \\ud83d\\udcb6 banknote with euro sign\ -\f0 \uc0\u55357 \u56503 +\f0 \uc0\u55357 \u56503 \f1 \\ud83d\\udcb7 banknote with pound sign\ -\f0 \uc0\u55357 \u56556 +\f0 \uc0\u55357 \u56556 \f1 \\ud83d\\udcec open mailbox with raised flag\ -\f0 \uc0\u55357 \u56557 +\f0 \uc0\u55357 \u56557 \f1 \\ud83d\\udced open mailbox with lowered flag\ -\f0 \uc0\u55357 \u56559 +\f0 \uc0\u55357 \u56559 \f1 \\ud83d\\udcef postal horn\ -\f0 \uc0\u55357 \u56565 +\f0 \uc0\u55357 \u56565 \f1 \\ud83d\\udcf5 no mobile phones\ -\f0 \uc0\u55357 \u56576 +\f0 \uc0\u55357 \u56576 \f1 \\ud83d\\udd00 twisted rightwards arrows\ -\f0 \uc0\u55357 \u56577 +\f0 \uc0\u55357 \u56577 \f1 \\ud83d\\udd01 clockwise rightwards and leftwards open circle arrows\ -\f0 \uc0\u55357 \u56578 +\f0 \uc0\u55357 \u56578 \f1 \\ud83d\\udd02 clockwise rightwards and leftwards open circle arrows with circled one overlay\ -\f0 \uc0\u55357 \u56580 +\f0 \uc0\u55357 \u56580 \f1 \\ud83d\\udd04 anticlockwise downwards and upwards open circle arrows\ -\f0 \uc0\u55357 \u56581 +\f0 \uc0\u55357 \u56581 \f1 \\ud83d\\udd05 low brightness symbol\ -\f0 \uc0\u55357 \u56582 +\f0 \uc0\u55357 \u56582 \f1 \\ud83d\\udd06 high brightness symbol\ -\f0 \uc0\u55357 \u56583 +\f0 \uc0\u55357 \u56583 \f1 \\ud83d\\udd07 speaker with cancellation stroke\ -\f0 \uc0\u55357 \u56585 +\f0 \uc0\u55357 \u56585 \f1 \\ud83d\\udd09 speaker with one sound wave\ -\f0 \uc0\u55357 \u56597 +\f0 \uc0\u55357 \u56597 \f1 \\ud83d\\udd15 bell with cancellation stroke\ -\f0 \uc0\u55357 \u56620 +\f0 \uc0\u55357 \u56620 \f1 \\ud83d\\udd2c microscope\ -\f0 \uc0\u55357 \u56621 +\f0 \uc0\u55357 \u56621 \f1 \\ud83d\\udd2d telescope\ -\f0 \uc0\u55357 \u56668 +\f0 \uc0\u55357 \u56668 \f1 \\ud83d\\udd5c clock face one-thirty\ -\f0 \uc0\u55357 \u56669 +\f0 \uc0\u55357 \u56669 \f1 \\ud83d\\udd5d clock face two-thirty\ -\f0 \uc0\u55357 \u56670 +\f0 \uc0\u55357 \u56670 \f1 \\ud83d\\udd5e clock face three-thirty\ -\f0 \uc0\u55357 \u56671 +\f0 \uc0\u55357 \u56671 \f1 \\ud83d\\udd5f clock face four-thirty\ -\f0 \uc0\u55357 \u56672 +\f0 \uc0\u55357 \u56672 \f1 \\ud83d\\udd60 clock face five-thirty\ -\f0 \uc0\u55357 \u56673 +\f0 \uc0\u55357 \u56673 \f1 \\ud83d\\udd61 clock face six-thirty\ -\f0 \uc0\u55357 \u56674 +\f0 \uc0\u55357 \u56674 \f1 \\ud83d\\udd62 clock face seven-thirty\ -\f0 \uc0\u55357 \u56675 +\f0 \uc0\u55357 \u56675 \f1 \\ud83d\\udd63 clock face eight-thirty\ -\f0 \uc0\u55357 \u56676 +\f0 \uc0\u55357 \u56676 \f1 \\ud83d\\udd64 clock face nine-thirty\ -\f0 \uc0\u55357 \u56677 +\f0 \uc0\u55357 \u56677 \f1 \\ud83d\\udd65 clock face ten-thirty\ -\f0 \uc0\u55357 \u56678 +\f0 \uc0\u55357 \u56678 \f1 \\ud83d\\udd66 clock face eleven-thirty\ -\f0 \uc0\u55357 \u56679 +\f0 \uc0\u55357 \u56679 \f1 \\ud83d\\udd67 clock face twelve-thirty} \ No newline at end of file diff --git a/src/js/commands/index.js b/src/js/commands/index.js index 851d70d9..995f1ea0 100644 --- a/src/js/commands/index.js +++ b/src/js/commands/index.js @@ -37,7 +37,7 @@ var commands = { // copy command, and then set opts commandObj.setOptionsMap(delConfig.options || {}); commandObj.setGeneralArgs(delConfig.args || []); - + commandConfigs[delConfig.vcs][delConfig.name].execute.call(this, engine, commandObj); }, this); } else { diff --git a/src/js/intl/index.js b/src/js/intl/index.js index bab78fe5..8247429a 100644 --- a/src/js/intl/index.js +++ b/src/js/intl/index.js @@ -107,7 +107,7 @@ exports.getStartDialog = function(level) { } }; var startCopy = Object.assign( - {}, + {}, level.startDialog[getDefaultLocale()] || level.startDialog ); startCopy.childViews.unshift(errorAlert); diff --git a/src/js/mercurial/commands.js b/src/js/mercurial/commands.js index acf14fcc..cc9140a6 100644 --- a/src/js/mercurial/commands.js +++ b/src/js/mercurial/commands.js @@ -206,7 +206,7 @@ var commandConfig = { }; } }, - + backout: { regex: /^hg +backout($|\s+)/, options: [ diff --git a/src/js/models/commandModel.js b/src/js/models/commandModel.js index 138f9024..df837412 100644 --- a/src/js/models/commandModel.js +++ b/src/js/models/commandModel.js @@ -76,7 +76,7 @@ var Command = Backbone.Model.extend({ mapDotToHead: function() { var generalArgs = this.getGeneralArgs(); var options = this.getOptionsMap(); - + generalArgs = generalArgs.map(function(arg) { return this.replaceDotWithHead(arg); }, this); diff --git a/src/js/react_views/LevelToolbarView.jsx b/src/js/react_views/LevelToolbarView.jsx index 48dd56dd..4c91b899 100644 --- a/src/js/react_views/LevelToolbarView.jsx +++ b/src/js/react_views/LevelToolbarView.jsx @@ -60,7 +60,7 @@ var LevelToolbarView = React.createClass({
); - }, + } - scrollDown: function() { + scrollDown() { var cD = document.getElementById('commandDisplay'); var t = document.getElementById('terminal'); @@ -81,9 +78,9 @@ var CommandHistoryView = React.createClass({ if (shouldScroll) { t.scrollTop = t.scrollHeight; } - }, + } - clearOldCommands: function() { + clearOldCommands() { // go through and get rid of every command that is "processed" or done var toDestroy = []; @@ -100,6 +97,11 @@ var CommandHistoryView = React.createClass({ this.scrollDown(); } -}); +} + +CommandHistoryView.propTypes = { + // the backbone command model collection + commandCollection: PropTypes.object.isRequired +}; module.exports = CommandHistoryView; diff --git a/src/js/react_views/CommandView.jsx b/src/js/react_views/CommandView.jsx index 4eb55ebf..df7b1f64 100644 --- a/src/js/react_views/CommandView.jsx +++ b/src/js/react_views/CommandView.jsx @@ -1,4 +1,5 @@ var React = require('react'); +var PropTypes = require('prop-types'); var reactUtil = require('../util/reactUtil'); var keyMirror = require('react/lib/keyMirror'); @@ -9,26 +10,20 @@ var STATUSES = keyMirror({ finished: null }); -var CommandView = React.createClass({ +class CommandView extends React.Component{ - propTypes: { - // the backbone command model - command: React.PropTypes.object.isRequired, - id: React.PropTypes.string, - }, - - componentDidMount: function() { + componentDidMount() { this.props.command.on('change', this.updateStateFromModel, this); this.props.command.on('destroy', this.onModelDestroy, this); this.updateStateFromModel(); - }, + } - componentWillUnmount: function() { + componentWillUnmount() { this.props.command.off('change', this.updateStateFromModel, this); this.props.command.off('destroy', this.onModelDestroy, this); - }, + } - onModelDestroy: function() { + onModelDestroy() { if (!this.isMounted()) { return; } @@ -39,9 +34,9 @@ var CommandView = React.createClass({ } React.unmountComponentAtNode(this.getDOMNode().parentNode); - }, + } - updateStateFromModel: function() { + updateStateFromModel() { var commandJSON = this.props.command.toJSON(); this.setState({ status: commandJSON.status, @@ -49,18 +44,19 @@ var CommandView = React.createClass({ warnings: commandJSON.warnings, result: commandJSON.result }); - }, + } - getInitialState: function() { - return { + constructor(props, context) { + super(props, context); + this.state = { status: STATUSES.inqueue, rawStr: 'git commit', warnings: [], result: '' }; - }, + } - render: function() { + render() { var commandClass = reactUtil.joinClasses([ this.state.status, 'commandLine', @@ -89,9 +85,9 @@ var CommandView = React.createClass({ ); - }, + } - renderResult: function() { + renderResult() { if (!this.state.result) { return null; } @@ -126,9 +122,9 @@ var CommandView = React.createClass({ {result} ); - }, + } - renderFormattedWarnings: function() { + renderFormattedWarnings() { var warnings = this.state.warnings; var result = []; for (var i = 0; i < warnings.length; i++) { @@ -141,6 +137,12 @@ var CommandView = React.createClass({ } return result; } -}); +}; + +CommandView.propTypes = { + // the backbone command model + command: PropTypes.object.isRequired, + id: PropTypes.string, +}; module.exports = CommandView; diff --git a/src/js/react_views/CommandsHelperBarView.jsx b/src/js/react_views/CommandsHelperBarView.jsx index 4982d56e..a3c43fe0 100644 --- a/src/js/react_views/CommandsHelperBarView.jsx +++ b/src/js/react_views/CommandsHelperBarView.jsx @@ -1,31 +1,27 @@ +var React = require('react'); +var PropTypes = require('prop-types'); var HelperBarView = require('../react_views/HelperBarView.jsx'); var Main = require('../app'); -var React = require('react'); var log = require('../log'); -var CommandsHelperBarView = React.createClass({ +class CommandsHelperBarView extends React.Component { - propTypes: { - shown: React.PropTypes.bool.isRequired, - onExit: React.PropTypes.func.isRequired - }, - - render: function() { + render() { return ( ); - }, + } - fireCommand: function(command) { + fireCommand(command) { log.viewInteracted('commandHelperBar'); Main.getEventBaton().trigger('commandSubmitted', command); - }, + } - getItems: function() { + getItems() { return [{ text: 'Levels', onClick: function() { @@ -64,6 +60,11 @@ var CommandsHelperBarView = React.createClass({ }]; } -}); +}; + +CommandsHelperBarView.propTypes = { + shown: PropTypes.bool.isRequired, + onExit: PropTypes.func.isRequired +}; module.exports = CommandsHelperBarView; diff --git a/src/js/react_views/HelperBarView.jsx b/src/js/react_views/HelperBarView.jsx index 7f1f4016..1e63df73 100644 --- a/src/js/react_views/HelperBarView.jsx +++ b/src/js/react_views/HelperBarView.jsx @@ -1,16 +1,11 @@ var React = require('react'); +var PropTypes = require('prop-types'); var reactUtil = require('../util/reactUtil'); -var HelperBarView = React.createClass({ +class HelperBarView extends React.Component { - propTypes: { - className: React.PropTypes.string, - shown: React.PropTypes.bool.isRequired, - items: React.PropTypes.array.isRequired - }, - - render: function() { + render() { var topClassName = reactUtil.joinClasses([ 'helperBar', 'transitionAll', @@ -32,9 +27,9 @@ var HelperBarView = React.createClass({ }.bind(this))} ); - }, + } - renderItem: function(item, index) { + renderItem(item, index) { var testID = item.icon || item.testID || item.text.toLowerCase(); if (item.newPageLink) { @@ -63,6 +58,13 @@ var HelperBarView = React.createClass({ ); } -}); +}; + +HelperBarView.propTypes = { + className: PropTypes.string, + shown: PropTypes.bool.isRequired, + items: PropTypes.array.isRequired +}; + module.exports = HelperBarView; diff --git a/src/js/react_views/IntlHelperBarView.jsx b/src/js/react_views/IntlHelperBarView.jsx index e0756dcc..4ec0b17c 100644 --- a/src/js/react_views/IntlHelperBarView.jsx +++ b/src/js/react_views/IntlHelperBarView.jsx @@ -1,32 +1,29 @@ +var PropTypes = require('prop-types'); + var HelperBarView = require('../react_views/HelperBarView.jsx'); var Main = require('../app'); var React = require('react'); var log = require('../log'); -var IntlHelperBarView = React.createClass({ +class IntlHelperBarView extends React.Component{ - propTypes: { - shown: React.PropTypes.bool.isRequired, - onExit: React.PropTypes.func.isRequired - }, - - render: function() { + render() { return ( ); - }, + } - fireCommand: function(command) { + fireCommand(command) { log.viewInteracted('intlSelect'); Main.getEventBaton().trigger('commandSubmitted', command); this.props.onExit(); - }, + } - getItems: function() { + getItems() { return [{ text: 'Git Branching', testID: 'english', @@ -107,6 +104,11 @@ var IntlHelperBarView = React.createClass({ }]; } -}); +}; + +IntlHelperBarView.propTypes = { + shown: PropTypes.bool.isRequired, + onExit: PropTypes.func.isRequired +} module.exports = IntlHelperBarView; diff --git a/src/js/react_views/LevelToolbarView.jsx b/src/js/react_views/LevelToolbarView.jsx index 4c91b899..e3dfe77f 100644 --- a/src/js/react_views/LevelToolbarView.jsx +++ b/src/js/react_views/LevelToolbarView.jsx @@ -1,26 +1,20 @@ var React = require('react'); -var PropTypes = React.PropTypes; +var PropTypes = require('prop-types'); var intl = require('../intl'); var reactUtil = require('../util/reactUtil'); -var LevelToolbarView = React.createClass({ +class LevelToolbarView extends React.Component { - propTypes: { - name: PropTypes.string.isRequired, - onGoalClick: PropTypes.func.isRequired, - onObjectiveClick: PropTypes.func.isRequired, - parent: PropTypes.object.isRequired - }, - - getInitialState: function() { - return { + constructor(props, context) { + super(props, context); + this.state = { isHidden: true, isGoalExpanded: this.props.parent.getIsGoalExpanded() }; - }, + } - componentDidMount: function() { + componentDidMount() { this.setState({ isHidden: this.props.parent.getIsGoalExpanded() }); @@ -33,9 +27,9 @@ var LevelToolbarView = React.createClass({ isGoalExpanded: this.props.parent.getIsGoalExpanded() }); }.bind(this)); - }, + } - render: function() { + render() { return (
); - }, + } - showSelf: function() { + showSelf() { this.setState({ shownBar: BARS.SELF }); - }, + } - getItems: function() { + getItems() { return [{ icon: 'question-sign', onClick: function() { @@ -74,6 +75,6 @@ var MainHelperBarView = React.createClass({ }]; } -}); +}; module.exports = MainHelperBarView; diff --git a/src/js/visuals/animation/index.js b/src/js/visuals/animation/index.js index cd0784c4..1fa30291 100644 --- a/src/js/visuals/animation/index.js +++ b/src/js/visuals/animation/index.js @@ -55,7 +55,7 @@ var AnimationQueue = Backbone.Model.extend({ }, add: function(animation) { - if (!animation instanceof Animation) { + if (!(animation instanceof Animation)) { throw new Error("Need animation not something else"); } From 9b4b6627b60e08e3ff672402cf67a83df07ded2a Mon Sep 17 00:00:00 2001 From: David Nelson Date: Mon, 22 Apr 2019 14:17:08 -0500 Subject: [PATCH 094/359] Convert revision range processing to pipeline model --- src/js/git/index.js | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/src/js/git/index.js b/src/js/git/index.js index 233d82cd..a780426f 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -3070,39 +3070,49 @@ var Tag = Ref.extend({ function RevisionRange(engine, specifiers) { this.engine = engine; - this.included = {}; - this.excluded = {}; + this.tipsToInclude = []; + this.tipsToExclude = []; + this.includedRefs = {}; + this.excludedRefs = {}; this.revisions = []; this.processSpecifiers(specifiers); } -RevisionRange.prototype.isExclusion = function(specifier) { - return specifier.startsWith('^'); +RevisionRange.prototype.processAsExclusion = function(specifier) { + if(!specifier.startsWith('^')) { + return false; + } + this.tipsToExclude.push(specifier.slice(1)); + return true; +}; + +RevisionRange.prototype.processAsInclusion = function(specifier) { + this.tipsToInclude.push(specifier); + return true; }; RevisionRange.prototype.processSpecifiers = function(specifiers) { var self = this; - var inclusions = []; - var exclusions = []; + var processors = [ + this.processAsExclusion + ]; specifiers.forEach(function(specifier) { - if(self.isExclusion(specifier)) { - exclusions.push(specifier.slice(1)); - } else { - inclusions.push(specifier); + if(!processors.some(function(processor) { return processor.bind(self)(specifier); })) { + self.processAsInclusion(specifier); } }); - exclusions.forEach(function(exclusion) { + this.tipsToExclude.forEach(function(exclusion) { self.addExcluded(Graph.getUpstreamSet(self.engine, exclusion)); }); - inclusions.forEach(function(inclusion) { + this.tipsToInclude.forEach(function(inclusion) { self.addIncluded(Graph.getUpstreamSet(self.engine, inclusion)); }); - var includedKeys = Array.from(Object.keys(self.included)); + var includedKeys = Array.from(Object.keys(self.includedRefs)); self.revisions = includedKeys.map(function(revision) { return self.engine.resolveStringRef(revision); @@ -3112,14 +3122,14 @@ RevisionRange.prototype.processSpecifiers = function(specifiers) { }; RevisionRange.prototype.isExcluded = function(revision) { - return this.excluded.hasOwnProperty(revision); + return this.excludedRefs.hasOwnProperty(revision); }; RevisionRange.prototype.addExcluded = function(setToExclude) { var self = this; Object.keys(setToExclude).forEach(function(toExclude) { if(!self.isExcluded(toExclude)) { - self.excluded[toExclude] = true; + self.excludedRefs[toExclude] = true; } }); }; @@ -3128,7 +3138,7 @@ RevisionRange.prototype.addIncluded = function(setToInclude) { var self = this; Object.keys(setToInclude).forEach(function(toInclude) { if(!self.isExcluded(toInclude)) { - self.included[toInclude] = true; + self.includedRefs[toInclude] = true; } }); }; From 44e7596381df0811b2ed289618849682b23f00cb Mon Sep 17 00:00:00 2001 From: David Nelson Date: Mon, 22 Apr 2019 13:11:52 -0500 Subject: [PATCH 095/359] Support range operator in revision range (log and rev-list) --- __tests__/git.spec.js | 12 ++++++++++++ src/js/git/index.js | 13 +++++++++++++ 2 files changed, 25 insertions(+) diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js index 5669168c..e098ce07 100644 --- a/__tests__/git.spec.js +++ b/__tests__/git.spec.js @@ -317,6 +317,18 @@ describe('Git', function() { expect(commandMsg).toBe('C6\n'); }); }); + + it('range between branches', function() { + runCommand(SETUP + 'git rev-list left..right', function(commandMsg) { + expect(commandMsg).toBe('C5\nC4\n'); + }); + }); + + it('range between commits', function() { + runCommand(SETUP + 'git rev-list C3..C5', function(commandMsg) { + expect(commandMsg).toBe('C5\nC4\n'); + }); + }); }); }); diff --git a/src/js/git/index.js b/src/js/git/index.js index a780426f..036f9db4 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -3079,6 +3079,18 @@ function RevisionRange(engine, specifiers) { this.processSpecifiers(specifiers); } +var rangeRegex = /^(.*)\.\.(.*)$/; + +RevisionRange.prototype.processAsRange = function(specifier) { + var match = specifier.match(rangeRegex); + if(!match) { + return false; + } + this.tipsToExclude.push(match[1]); + this.tipsToInclude.push(match[2]); + return true; +}; + RevisionRange.prototype.processAsExclusion = function(specifier) { if(!specifier.startsWith('^')) { return false; @@ -3095,6 +3107,7 @@ RevisionRange.prototype.processAsInclusion = function(specifier) { RevisionRange.prototype.processSpecifiers = function(specifiers) { var self = this; var processors = [ + this.processAsRange, this.processAsExclusion ]; From 3de9f2eec425f2070df0d6ec66cb95eab412f561 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Tue, 23 Apr 2019 07:17:45 -0700 Subject: [PATCH 096/359] Revert "Update package" PR #568 This reverts commit edd03633923b5b35475a40117fd63967ce7ff78f. --- package.json | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 7ded23c8..54f69cec 100644 --- a/package.json +++ b/package.json @@ -13,30 +13,28 @@ "url": "https://github.com/pcottle/learnGitBranching" }, "devDependencies": { - "babel-core": "^6.26.3", - "babel-plugin-transform-react-jsx": "^6.24.1", - "browserify": "^16.2.3", + "browserify": "^13.0.0", "contributor-faces": "^1.0.2", "grunt": "^1.0.4", - "grunt-browserify": "^5.3.0", - "grunt-contrib-clean": "^2.0.0", - "grunt-contrib-jshint": "^2.1.0", - "grunt-contrib-uglify": "^4.0.1", + "grunt-browserify": "^4.0.1", + "grunt-contrib-clean": "~0.5.0", + "grunt-contrib-jshint": "~0.7.2", + "grunt-contrib-uglify": "~0.2.7", "grunt-env": "^0.4.4", - "grunt-hash": "^0.5.0", + "grunt-hash": "~0.5.0", "grunt-jasmine-node": "~0.1.0", - "grunt-jsxhint": "^0.8.0", - "grunt-react": "^0.12.3", - "grunt-shell-spawn": "^0.4.0", - "jasmine-node": "^1.16.2", + "grunt-jsxhint": "^0.5.0", + "grunt-react": "^0.12.1", + "grunt-shell-spawn": "~0.3.0", + "jasmine-node": "~1.12.0", "prompt": "^1.0.0" }, "dependencies": { - "backbone": "^1.4.0", - "flux": "^3.1.3", - "markdown": "^0.5.0", - "q": "^1.5.1", - "react": "^16.8.6", + "backbone": "~1.1.2", + "flux": "^2.0.1", + "markdown": "~0.4.0", + "q": "~0.8.11", + "react": "^0.13.1", "underscore": "~1.4.3" } } From a42158664f929f25abbe76da8e9ea3526a58b696 Mon Sep 17 00:00:00 2001 From: Hongarc Date: Tue, 23 Apr 2019 21:26:06 +0700 Subject: [PATCH 097/359] Update test in travis-ci --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 55656971..8fa89666 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,4 +11,4 @@ cache: directories: - "node_modules" script: - - yarn test + - yarn grunt From 208a6c843a69182e79151659ad5f2c10c1c2fdec Mon Sep 17 00:00:00 2001 From: Hongarc Date: Thu, 25 Apr 2019 10:02:00 +0700 Subject: [PATCH 098/359] fix: correct module instead of `react` --- package.json | 1 + src/js/level/index.js | 7 ++++--- src/js/react_views/CommandHistoryView.jsx | 4 ++-- src/js/react_views/CommandView.jsx | 14 +++----------- src/js/react_views/LevelToolbarView.jsx | 9 +++++++-- 5 files changed, 17 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 0946b25c..539367dc 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ }, "dependencies": { "backbone": "^1.4.0", + "fbjs": "^1.0.0", "flux": "^3.1.3", "jquery": "^3.4.0", "markdown": "^0.5.0", diff --git a/src/js/level/index.js b/src/js/level/index.js index 4bac1b5b..43540760 100644 --- a/src/js/level/index.js +++ b/src/js/level/index.js @@ -1,11 +1,12 @@ var Q = require('q'); +var React = require('react'); +var ReactDOM = require('react-dom'); var util = require('../util'); var Main = require('../app'); var intl = require('../intl'); var log = require('../log'); -var React = require('react'); var Errors = require('../util/errors'); var Sandbox = require('../sandbox/').Sandbox; var GlobalStateActions = require('../actions/GlobalStateActions'); @@ -139,7 +140,7 @@ var Level = Sandbox.extend({ parent: this } ); - React.render( + ReactDOM.render( this.levelToolbar, document.getElementById('levelToolbarMount') ); @@ -543,7 +544,7 @@ var Level = Sandbox.extend({ }, die: function() { - React.unmountComponentAtNode( + ReactDOM.unmountComponentAtNode( document.getElementById('levelToolbarMount') ); diff --git a/src/js/react_views/CommandHistoryView.jsx b/src/js/react_views/CommandHistoryView.jsx index eda82fce..a5f1240b 100644 --- a/src/js/react_views/CommandHistoryView.jsx +++ b/src/js/react_views/CommandHistoryView.jsx @@ -13,7 +13,7 @@ var _subscribeEvents = [ class CommandHistoryView extends React.Component { - componentDidMount() { + componentDidMount() { for (var i = 0; i < _subscribeEvents.length; i++) { this.props.commandCollection.on( _subscribeEvents[i], @@ -24,7 +24,7 @@ class CommandHistoryView extends React.Component { this.props.commandCollection.on('change', this.scrollDown, this); Main.getEvents().on('commandScrollDown', this.scrollDown, this); - Main.getEvents().on('clearOldCommands', this.clearOldCommands, this); + Main.getEvents().on('clearOldCommands', () => this.clearOldCommands(), this); } componentWillUnmount() { diff --git a/src/js/react_views/CommandView.jsx b/src/js/react_views/CommandView.jsx index df7b1f64..d887af3c 100644 --- a/src/js/react_views/CommandView.jsx +++ b/src/js/react_views/CommandView.jsx @@ -1,8 +1,9 @@ var React = require('react'); +var ReactDOM = require('react-dom'); var PropTypes = require('prop-types'); var reactUtil = require('../util/reactUtil'); -var keyMirror = require('react/lib/keyMirror'); +var keyMirror = require('fbjs/lib/keyMirror'); var STATUSES = keyMirror({ inqueue: null, @@ -24,16 +25,7 @@ class CommandView extends React.Component{ } onModelDestroy() { - if (!this.isMounted()) { - return; - } - if (!this.getDOMNode) { - // WTF -- only happens in casperjs tests weirdly - console.error('this.getDOMNode not a function?'); - return; - } - - React.unmountComponentAtNode(this.getDOMNode().parentNode); + ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(this).parentNode); } updateStateFromModel() { diff --git a/src/js/react_views/LevelToolbarView.jsx b/src/js/react_views/LevelToolbarView.jsx index e3dfe77f..b498df63 100644 --- a/src/js/react_views/LevelToolbarView.jsx +++ b/src/js/react_views/LevelToolbarView.jsx @@ -14,12 +14,17 @@ class LevelToolbarView extends React.Component { }; } + componentWillUnmount() { + this._isMounted = false; + } componentDidMount() { + this._isMounted = true; this.setState({ - isHidden: this.props.parent.getIsGoalExpanded() + isHidden: this.props.parent.getIsGoalExpanded(), + isGoalExpanded: this.props.parent.getIsGoalExpanded() }); this.props.parent.on('goalToggled', function() { - if (!this.isMounted()) { + if (!this._isMounted) { return; } From a44d05e2652db39a03684ce2d187854a1113be41 Mon Sep 17 00:00:00 2001 From: Hongarc Date: Thu, 25 Apr 2019 11:28:28 +0700 Subject: [PATCH 099/359] Change esversion to 6 --- Gruntfile.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Gruntfile.js b/Gruntfile.js index 52c8147e..ddd728d7 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -111,6 +111,7 @@ module.exports = function(grunt) { 'src/levels/**/*.js' ], options: { + esversion: 6, curly: true, // sometimes triple equality is just redundant and unnecessary eqeqeq: false, @@ -226,7 +227,7 @@ module.exports = function(grunt) { }); // all my npm helpers - grunt.loadNpmTasks('grunt-jsxhint'); + grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-browserify'); grunt.loadNpmTasks('grunt-hash'); grunt.loadNpmTasks('grunt-contrib-clean'); From ce516d9c9b4cf37f81e97dedcaef77158658a5cd Mon Sep 17 00:00:00 2001 From: Hongarc Date: Thu, 25 Apr 2019 11:29:10 +0700 Subject: [PATCH 100/359] Fix resize width and height to -1 --- src/js/visuals/visualization.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/js/visuals/visualization.js b/src/js/visuals/visualization.js index 739af574..44bc4b0d 100644 --- a/src/js/visuals/visualization.js +++ b/src/js/visuals/visualization.js @@ -68,9 +68,7 @@ var Visualization = Backbone.View.extend({ this.myResize(); - $(window).on('resize', function() { - this.myResize(); - }.bind(this)); + $(window).on('resize', () => this.myResize()); // If the visualization is within a draggable container, we need to update the // position whenever the container is moved. @@ -257,12 +255,11 @@ var Visualization = Backbone.View.extend({ myResize: function() { if (!this.paper) { return; } - var smaller = 1; var el = this.el; var elSize = el.getBoundingClientRect(); - var width = elSize.width - smaller; - var height = elSize.height - smaller; + var width = elSize.width; + var height = elSize.height; // if we don't have a container, we need to set our // position absolutely to whatever we are tracking From eaa42ce6c02d966df9b6b07ca594a5143530f30a Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Mon, 29 Apr 2019 14:13:59 -0700 Subject: [PATCH 101/359] Resolves #574 -- move npm to yarn everywhere else --- .gitpod.yml | 2 +- README.md | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.gitpod.yml b/.gitpod.yml index 325d71a3..7b1989a1 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -2,7 +2,7 @@ ports: - port: 8000 onOpen: open-preview tasks: -- init: npm install && npm install -g grunt-cli +- init: yarn install && yarn global add grunt-cli command: > grunt fastBuild && printf "\nWelcome to Learn Git Branching\nTo rebuild the app, simply run 'grunt fastBuild' and reload index.html.\n\n" && diff --git a/README.md b/README.md index 9737ca2f..8cdaa4bf 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ The general workflow / steps are below: ```bash git clone cd learnGitBranching -npm install # to install all the node modules I depend on +yarn install git checkout -b newAwesomeFeature vim ./src/js/git/index.js # some changes @@ -165,4 +165,3 @@ And the following heroes for assisting in translating: Also huge shoutout for everyone who has put up a pull request that was pulled! Check out the 30+ contributors we have in the [Contributors View](https://github.com/pcottle/learnGitBranching/graphs/contributors) And everyone who has reported an issue that was successfully closed! - From b5f18c4b2b86e87a5bdc5ab143a8bc64c05eea0f Mon Sep 17 00:00:00 2001 From: David Nelson Date: Mon, 29 Apr 2019 16:14:51 -0500 Subject: [PATCH 102/359] Update yarn.lock file A number of recent commits have updated versions in package.json without updating the yarn.lock file. This commit brings the yarn.lock file up to date. --- yarn.lock | 1676 ++++++++++++++++++++++++++++------------------------- 1 file changed, 879 insertions(+), 797 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3c158e95..b50fbcb2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,26 @@ # yarn lockfile v1 +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +JSONStream@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.10.0.tgz#74349d0d89522b71f30f0a03ff9bd20ca6f12ac0" + integrity sha1-dDSdDYlSK3HzDwoD/5vSDKbxKsA= + dependencies: + jsonparse "0.0.5" + through ">=2.2.7 <3" + JSONStream@^1.0.3: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -35,11 +55,6 @@ acorn-walk@^6.1.0: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== -acorn@^4.0.3: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= - acorn@^5.2.1: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" @@ -65,6 +80,11 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -72,13 +92,13 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" + micromatch "^3.1.4" + normalize-path "^2.1.1" aproba@^1.0.3: version "1.2.0" @@ -93,21 +113,13 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -argparse@^1.0.2: +argparse@^1.0.2, argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" -"argparse@~ 0.1.11": - version "0.1.16" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-0.1.16.tgz#cfd01e0fbba3d6caed049fbd758d40f65196f57c" - integrity sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw= - dependencies: - underscore "~1.7.0" - underscore.string "~2.4.0" - arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" @@ -181,13 +193,6 @@ assert@^1.4.0: dependencies: util "0.10.3" -assert@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.3.0.tgz#03939a622582a812cc202320a0b9a56c9b815849" - integrity sha1-A5OaYiWCqBLMICMgoLmlbJuBWEk= - dependencies: - util "0.10.3" - assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -198,54 +203,44 @@ ast-types@0.9.6: resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk= -astw@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/astw/-/astw-2.2.0.tgz#7bd41784d32493987aeb239b6b4e1c57a873b917" - integrity sha1-e9QXhNMkk5h66yOba04cV6hzuRc= +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async@^1.5.2, async@~1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + +async@^2.5.0, async@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== dependencies: - acorn "^4.0.3" + lodash "^4.17.11" -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - integrity sha1-GdOGodntxufByF04iu28xW0zYC0= - -async@^0.9.0, async@~0.9.0: +async@~0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= -async@~0.1.22: - version "0.1.22" - resolved "https://registry.yarnpkg.com/async/-/async-0.1.22.tgz#0fc1aaa088a0e3ef0ebe2d8831bab0dcf8845061" - integrity sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE= - -async@~0.2.6: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= - async@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k= -async@~1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= - atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -backbone@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.1.2.tgz#c2c04c66bf87268fb82c177acebeff7d37ba6f2d" - integrity sha1-wsBMZr+HJo+4LBd6zr7/fTe6by0= +backbone@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.4.0.tgz#54db4de9df7c3811c3f032f34749a4cd27f3bd12" + integrity sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ== dependencies: - underscore ">=1.5.0" + underscore ">=1.8.3" balanced-match@^1.0.0: version "1.0.0" @@ -257,16 +252,6 @@ base62@0.1.1: resolved "https://registry.yarnpkg.com/base62/-/base62-0.1.1.tgz#7b4174c2f94449753b11c2651c083da841a7b084" integrity sha1-e0F0wvlESXU7EcJlHAg9qEGnsIQ= -base62@^1.1.0: - version "1.2.8" - resolved "https://registry.yarnpkg.com/base62/-/base62-1.2.8.tgz#1264cb0fb848d875792877479dbe8bae6bae3428" - integrity sha512-V6YHUbjLxN1ymqNLb1DPHoU1CpfdL7d2YTIp5W3U4hhoG4hhxNmsFDs66M9EXxBiSEke5Bt5dwdfMwwZF70iLA== - -base64-js@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" - integrity sha1-EQHpVE9KdrG8OybUUsqW16NeeXg= - base64-js@^1.0.2: version "1.3.0" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" @@ -295,7 +280,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== -brace-expansion@^1.0.0, brace-expansion@^1.1.7: +brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== @@ -312,7 +297,7 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -braces@^2.3.1: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -333,17 +318,6 @@ brorand@^1.0.1: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= -browser-pack@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-5.0.1.tgz#4197719b20c6e0aaa09451c5111e53efb6fbc18d" - integrity sha1-QZdxmyDG4KqglFHFER5T77b7wY0= - dependencies: - JSONStream "^1.0.3" - combine-source-map "~0.6.1" - defined "^1.0.0" - through2 "^1.0.0" - umd "^3.0.0" - browser-pack@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.1.0.tgz#c34ba10d0b9ce162b5af227c7131c92c2ecd5774" @@ -356,7 +330,7 @@ browser-pack@^6.0.1: through2 "^2.0.0" umd "^3.0.0" -browser-resolve@^1.11.0, browser-resolve@^1.7.0, browser-resolve@^1.7.1: +browser-resolve@^1.11.0, browser-resolve@^1.7.0: version "1.11.3" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== @@ -375,6 +349,15 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4: inherits "^2.0.1" safe-buffer "^5.0.1" +browserify-cache-api@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/browserify-cache-api/-/browserify-cache-api-3.0.1.tgz#96247e853f068fd6e0d45cc73f0bb2cd9778ef02" + integrity sha1-liR+hT8Gj9bg1FzHPwuyzZd47wI= + dependencies: + async "^1.5.2" + through2 "^2.0.0" + xtend "^4.0.0" + browserify-cipher@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" @@ -394,6 +377,16 @@ browserify-des@^1.0.0: inherits "^2.0.1" safe-buffer "^5.1.2" +browserify-incremental@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/browserify-incremental/-/browserify-incremental-3.1.1.tgz#0713cb7587247a632a9f08cf1bd169b878b62a8a" + integrity sha1-BxPLdYckemMqnwjPG9FpuHi2Koo= + dependencies: + JSONStream "^0.10.0" + browserify-cache-api "^3.0.0" + through2 "^2.0.0" + xtend "^4.0.0" + browserify-rsa@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" @@ -415,7 +408,7 @@ browserify-sign@^4.0.0: inherits "^2.0.1" parse-asn1 "^5.0.0" -browserify-zlib@~0.1.2: +browserify-zlib@^0.1.4, browserify-zlib@~0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" integrity sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0= @@ -429,61 +422,6 @@ browserify-zlib@~0.2.0: dependencies: pako "~1.0.5" -browserify@^11.0.1: - version "11.2.0" - resolved "https://registry.yarnpkg.com/browserify/-/browserify-11.2.0.tgz#a11bb9dd209d79572b813f7eeeaf828a5f5c0e4e" - integrity sha1-oRu53SCdeVcrgT9+7q+Cil9cDk4= - dependencies: - JSONStream "^1.0.3" - assert "~1.3.0" - browser-pack "^5.0.0" - browser-resolve "^1.7.1" - browserify-zlib "~0.1.2" - buffer "^3.0.0" - builtins "~0.0.3" - commondir "0.0.1" - concat-stream "~1.4.1" - console-browserify "^1.1.0" - constants-browserify "~0.0.1" - crypto-browserify "^3.0.0" - defined "^1.0.0" - deps-sort "^1.3.7" - domain-browser "~1.1.0" - duplexer2 "~0.0.2" - events "~1.0.0" - glob "^4.0.5" - has "^1.0.0" - htmlescape "^1.1.0" - https-browserify "~0.0.0" - inherits "~2.0.1" - insert-module-globals "^6.4.1" - isarray "0.0.1" - labeled-stream-splicer "^1.0.0" - module-deps "^3.7.11" - os-browserify "~0.1.1" - parents "^1.0.1" - path-browserify "~0.0.0" - process "~0.11.0" - punycode "^1.3.2" - querystring-es3 "~0.2.0" - read-only-stream "^1.1.1" - readable-stream "^2.0.2" - resolve "^1.1.4" - shasum "^1.0.0" - shell-quote "~0.0.1" - stream-browserify "^2.0.0" - stream-http "^1.2.0" - string_decoder "~0.10.0" - subarg "^1.0.0" - syntax-error "^1.1.1" - through2 "^1.0.0" - timers-browserify "^1.0.1" - tty-browserify "~0.0.0" - url "~0.10.1" - util "~0.10.1" - vm-browserify "~0.0.1" - xtend "^4.0.0" - browserify@^13.0.0: version "13.3.0" resolved "https://registry.yarnpkg.com/browserify/-/browserify-13.3.0.tgz#b5a9c9020243f0c70e4675bec8223bc627e415ce" @@ -537,7 +475,7 @@ browserify@^13.0.0: vm-browserify "~0.0.1" xtend "^4.0.0" -browserify@^16.1.0: +browserify@^16.0.0, browserify@^16.1.0: version "16.2.3" resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.2.3.tgz#7ee6e654ba4f92bce6ab3599c3485b1cc7a0ad0b" integrity sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ== @@ -601,15 +539,6 @@ buffer-xor@^1.0.3: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= -buffer@^3.0.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb" - integrity sha1-pyyTb3e5a/UvX357RnGAYoVR3vs= - dependencies: - base64-js "0.0.8" - ieee754 "^1.1.4" - isarray "^1.0.0" - buffer@^4.1.0: version "4.9.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" @@ -632,21 +561,11 @@ builtin-modules@^1.0.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= -builtin-status-codes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-1.0.0.tgz#30637ee262978ac07174e16d7f82f0ad06e085ad" - integrity sha1-MGN+4mKXisBxdOFtf4LwrQbgha0= - builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= -builtins@~0.0.3: - version "0.0.7" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-0.0.7.tgz#355219cd6cf18dbe7c01cc7fd2dce765cfdc549a" - integrity sha1-NVIZzWzxjb58Acx/0tznZc/cVJo= - cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -662,6 +581,19 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +cacheable-request@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.0.0.tgz#4a1727414e02ac4af82560c4da1b61daa3fa2b63" + integrity sha512-2N7AmszH/WPPpl5Z3XMw1HAP+8d+xugnKQAeKvxFZ/04dbT/CAznqwbl+7eSr3HkwdepNwtb2yx3CAMQWvG01Q== + dependencies: + clone-response "^1.0.2" + get-stream "^4.0.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^1.0.1" + normalize-url "^3.1.0" + responselike "^1.0.2" + cached-path-relative@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" @@ -675,16 +607,36 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= - camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +chalk@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.1.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@~2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" @@ -694,21 +646,24 @@ chalk@~2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chokidar@^1.0.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= +chokidar@^2.1.1: + version "2.1.5" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" + integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A== dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" is-binary-path "^1.0.0" - is-glob "^2.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" path-is-absolute "^1.0.0" - readdirp "^2.0.0" + readdirp "^2.2.1" + upath "^1.1.1" optionalDependencies: - fsevents "^1.0.0" + fsevents "^1.2.7" chownr@^1.1.1: version "1.1.1" @@ -733,13 +688,6 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -cli@0.4.x: - version "0.4.5" - resolved "https://registry.yarnpkg.com/cli/-/cli-0.4.5.tgz#78f9485cd161b566e9a6c72d7170c4270e81db61" - integrity sha1-ePlIXNFhtWbppsctcXDEJw6B22E= - dependencies: - glob ">= 3.1.4" - cli@0.6.x: version "0.6.6" resolved "https://registry.yarnpkg.com/cli/-/cli-0.6.6.tgz#02ad44a380abf27adac5e6f0cdd7b043d74c53e3" @@ -748,6 +696,30 @@ cli@0.6.x: exit "0.1.2" glob "~ 3.2.1" +cli@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14" + integrity sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ= + dependencies: + exit "0.1.2" + glob "^7.1.1" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -758,11 +730,6 @@ coffee-script@>=1.0.1: resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53" integrity sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw== -coffee-script@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.3.3.tgz#150d6b4cb522894369efed6a2101c20bc7f4a4f4" - integrity sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ= - coffeescript@~1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-1.10.0.tgz#e7aa8301917ef621b35d8a39f348dcdd1db7e33e" @@ -803,11 +770,6 @@ colors@^1.1.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" integrity sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ== -colors@~0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" - integrity sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w= - colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" @@ -823,27 +785,17 @@ combine-source-map@^0.8.0, combine-source-map@~0.8.0: lodash.memoize "~3.0.3" source-map "~0.5.3" -combine-source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.6.1.tgz#9b4a09c316033d768e0f11e029fa2730e079ad96" - integrity sha1-m0oJwxYDPXaODxHgKfonMOB5rZY= - dependencies: - convert-source-map "~1.1.0" - inline-source-map "~0.5.0" - lodash.memoize "~3.0.3" - source-map "~0.4.2" - commander@^2.5.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== -commondir@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-0.0.1.tgz#89f00fdcd51b519c578733fec563e6a6da7f5be2" - integrity sha1-ifAP3NUbUZxXhzP+xWPmptp/W+I= +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== -commoner@^0.10.0, commoner@^0.10.1: +commoner@^0.10.0: version "0.10.8" resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5" integrity sha1-NPw2cs0kOT6LtH5wyqApOBH08sU= @@ -868,7 +820,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: +concat-stream@^1.4.1, concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -878,15 +830,6 @@ concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: readable-stream "^2.2.2" typedarray "^0.0.6" -concat-stream@~1.4.1, concat-stream@~1.4.5: - version "1.4.11" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.4.11.tgz#1dc9f666f2621da9c618b1e7f8f3b2ff70b5f76f" - integrity sha512-X3JMh8+4je3U1cQpG87+f9lXHDrqcb2MVLg9L7o8b1UZ0DzhRrUpdn65ttzu10PpJPPI3MQNkis+oha6TSA9Mw== - dependencies: - inherits "~2.0.1" - readable-stream "~1.1.9" - typedarray "~0.0.5" - concat-stream@~1.5.0, concat-stream@~1.5.1: version "1.5.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" @@ -896,11 +839,6 @@ concat-stream@~1.5.0, concat-stream@~1.5.1: readable-stream "~2.0.0" typedarray "~0.0.5" -console-browserify@0.1.x: - version "0.1.6" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-0.1.6.tgz#d128a3c0bb88350eb5626c6e7c71a6f0fd48983c" - integrity sha1-0SijwLuINQ61YmxufHGm8P1ImDw= - console-browserify@1.1.x, console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" @@ -913,16 +851,22 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -constants-browserify@~0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-0.0.1.tgz#92577db527ba6c4cf0a4568d84bc031f441e21f2" - integrity sha1-kld9tSe6bEzwpFaNhLwDH0QeIfI= - constants-browserify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= +contributor-faces@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/contributor-faces/-/contributor-faces-1.0.2.tgz#5bfd7798bc0b896db98dabba06eb350ca46a2562" + integrity sha512-fbGvdXpQnhSB0DWLbJj8xfOVKm1ErV2ZpzcQRx5CW4WOgA6smR9CfE4ngyg/WYutWgLSUvNjhWYM/IGwBqWxCA== + dependencies: + gh-got "^8.0.1" + meow "^3.7.0" + micromatch "^2.3.11" + readme-filename "^1.0.0" + replace-in-file "^2.0.1" + convert-source-map@~1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" @@ -938,6 +882,11 @@ core-js@^1.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= +core-js@^2.4.1: + version "2.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" + integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== + core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -974,6 +923,15 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + crypto-browserify@^3.0.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -1008,11 +966,6 @@ date-now@^0.1.4: resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -dateformat@1.0.2-1.2.3: - version "1.0.2-1.2.3" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.2-1.2.3.tgz#b0220c02de98617433b72851cf47de3df2cdbee9" - integrity sha1-sCIMAt6YYXQztyhRz0fePfLNvuk= - dateformat@~1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" @@ -1028,7 +981,7 @@ debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -decamelize@^1.0.0, decamelize@^1.1.2: +decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -1038,6 +991,13 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + deep-equal@~0.2.1: version "0.2.2" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d" @@ -1048,6 +1008,11 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +defer-to-connect@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.0.2.tgz#4bae758a314b034ae33902b5aac25a8dd6a8633e" + integrity sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw== + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -1080,16 +1045,6 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -deps-sort@^1.3.7: - version "1.3.9" - resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-1.3.9.tgz#29dfff53e17b36aecae7530adbbbf622c2ed1a71" - integrity sha1-Kd//U+F7Nq7K51MK27v2IsLtGnE= - dependencies: - JSONStream "^1.0.3" - shasum "^1.0.0" - subarg "^1.0.0" - through2 "^1.0.0" - deps-sort@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5" @@ -1182,13 +1137,6 @@ domutils@1.5: dom-serializer "0" domelementtype "1" -duplexer2@0.0.2, duplexer2@~0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" - integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds= - dependencies: - readable-stream "~1.1.9" - duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" @@ -1196,6 +1144,11 @@ duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: dependencies: readable-stream "^2.0.2" +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + elliptic@^6.0.0: version "6.4.1" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" @@ -1216,6 +1169,13 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" +end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + entities@1.0: version "1.0.0" resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" @@ -1226,14 +1186,6 @@ entities@~1.1.1: resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== -envify@^3.0.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/envify/-/envify-3.4.1.tgz#d7122329e8df1688ba771b12501917c9ce5cbce8" - integrity sha1-1xIjKejfFoi6dxsSUBkXyc5cvOg= - dependencies: - jstransform "^11.0.3" - through "~2.3.4" - error-ex@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -1241,7 +1193,7 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" -escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -1251,20 +1203,15 @@ esprima-fb@13001.1001.0-dev-harmony-fb: resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-13001.1001.0-dev-harmony-fb.tgz#633acdb40d9bd4db8a1c1d68c06a942959fad2b0" integrity sha1-YzrNtA2b1NuKHB1owGqUKVn60rA= -esprima-fb@^15001.1.0-dev-harmony-fb: - version "15001.1.0-dev-harmony-fb" - resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz#30a947303c6b8d5e955bee2b99b1d233206a6901" - integrity sha1-MKlHMDxrjV6VW+4rmbHSMyBqaQE= - esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= -"esprima@~ 1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" - integrity sha1-n1V+CPw7TSbs6d00+Pv0drYlha0= +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esprima@~3.1.0: version "3.1.3" @@ -1281,11 +1228,6 @@ events@^2.0.0: resolved "https://registry.yarnpkg.com/events/-/events-2.1.0.tgz#2a9a1e18e6106e0e812aa9ebd4a819b3c29c0ba5" integrity sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg== -events@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/events/-/events-1.0.2.tgz#75849dcfe93d10fb057c30055afdbd51d06a8e24" - integrity sha1-dYSdz+k9EPsFfDAFWv29UdBqjiQ= - events@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" @@ -1299,6 +1241,19 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + exit@0.1.2, exit@0.1.x, exit@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -1379,16 +1334,12 @@ fbemitter@^2.0.0: dependencies: fbjs "^0.8.4" -fbjs@0.1.0-alpha.7: - version "0.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.1.0-alpha.7.tgz#ad4308b8f232fb3c73603349ea725d1e9c39323c" - integrity sha1-rUMIuPIy+zxzYDNJ6nJdHpw5Mjw= - dependencies: - core-js "^1.0.0" - promise "^7.0.3" - whatwg-fetch "^0.9.0" +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== -fbjs@^0.8.4: +fbjs@^0.8.0, fbjs@^0.8.4: version "0.8.17" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= @@ -1401,6 +1352,28 @@ fbjs@^0.8.4: setimmediate "^1.0.5" ua-parser-js "^0.7.18" +fbjs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-1.0.0.tgz#52c215e0883a3c86af2a7a776ed51525ae8e0a5a" + integrity sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA== + dependencies: + core-js "^2.4.1" + fbjs-css-vars "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + +figures@^1.0.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" @@ -1443,13 +1416,12 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -findup-sync@~0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.1.3.tgz#7f3e7a97b82392c653bf06589bd85190e93c3683" - integrity sha1-fz56l7gjksZTvwZYm9hRkOk8NoM= +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: - glob "~3.2.9" - lodash "~2.4.1" + locate-path "^2.0.0" findup-sync@~0.3.0: version "0.3.0" @@ -1458,14 +1430,13 @@ findup-sync@~0.3.0: dependencies: glob "~5.0.0" -flux@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/flux/-/flux-2.1.1.tgz#2c6ac652d4337488968489c6586f3aff26a38ea4" - integrity sha1-LGrGUtQzdIiWhInGWG86/yajjqQ= +flux@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/flux/-/flux-3.1.3.tgz#d23bed515a79a22d933ab53ab4ada19d05b2f08a" + integrity sha1-0jvtUVp5oi2TOrU6tK2hnQWy8Io= dependencies: fbemitter "^2.0.0" - fbjs "0.1.0-alpha.7" - immutable "^3.7.4" + fbjs "^0.8.0" for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" @@ -1479,11 +1450,6 @@ for-own@^0.1.4: dependencies: for-in "^1.0.1" -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -1503,13 +1469,13 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" - integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== +fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" + nan "^2.12.1" + node-pre-gyp "^0.12.0" function-bind@^1.1.1: version "1.1.1" @@ -1550,11 +1516,28 @@ get-assigned-identifiers@^1.2.0: resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0, get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -1565,6 +1548,13 @@ getobject@~0.1.0: resolved "https://registry.yarnpkg.com/getobject/-/getobject-0.1.0.tgz#047a449789fa160d018f5486ed91320b6ec7885c" integrity sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw= +gh-got@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/gh-got/-/gh-got-8.1.0.tgz#2378d07ac293f524549c75f8dc6f3604a885ab01" + integrity sha512-Jy7+73XqsAVeAtM5zA0dd+A7mmzkQVIzFuw3xRjFbPsQVqS+aeci8v8H1heOCAPlBYWED5ZYPhlYqZVXdD3Fmg== + dependencies: + got "^9.5.0" + glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -1580,7 +1570,15 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@3.x, "glob@~ 3.2.1", glob@~3.2.9: +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob@3.x, "glob@~ 3.2.1": version "3.2.11" resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" integrity sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0= @@ -1588,29 +1586,7 @@ glob@3.x, "glob@~ 3.2.1", glob@~3.2.9: inherits "2" minimatch "0.3" -"glob@>= 3.1.4", glob@^7.0.5, glob@^7.1.0, glob@~7.1.1: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^4.0.5: - version "4.5.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" - integrity sha1-xstz0yJsHv7wTePFbQEvAzd+4V8= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "^2.0.1" - once "^1.3.0" - -glob@^5.0.15, glob@^5.0.5, glob@~5.0.0: +glob@^5.0.15, glob@~5.0.0: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= @@ -1621,14 +1597,17 @@ glob@^5.0.15, glob@^5.0.5, glob@~5.0.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@~3.1.21: - version "3.1.21" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" - integrity sha1-0p4KBV3qUTj00H7UDomC6DwgZs0= +glob@^7.0.5, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: - graceful-fs "~1.2.0" - inherits "1" - minimatch "~0.2.11" + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" glob@~7.0.0: version "7.0.6" @@ -1651,32 +1630,45 @@ globule@^1.0.0: lodash "~4.17.10" minimatch "~3.0.2" +got@^9.5.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + graceful-fs@^4.1.11, graceful-fs@^4.1.2: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== -graceful-fs@~1.2.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" - integrity sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q= - growl@~1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/growl/-/growl-1.7.0.tgz#de2d66136d002e112ba70f3f10c31cf7c350b2da" integrity sha1-3i1mE20ALhErpw8/EMMc98NQsto= -grunt-browserify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/grunt-browserify/-/grunt-browserify-4.0.1.tgz#f5ced9026958a800f2e8898e1a4df1e525ff69ff" - integrity sha1-9c7ZAmlYqADy6ImOGk3x5SX/af8= +grunt-browserify@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/grunt-browserify/-/grunt-browserify-5.3.0.tgz#47fd8cf8bac58fe2de683afdc57f7f3a80ca792d" + integrity sha1-R/2M+LrFj+LeaDr9xX9/OoDKeS0= dependencies: - async "^0.9.0" - browserify "^11.0.1" - glob "^5.0.5" - lodash "^3.8.0" + async "^2.5.0" + browserify "^16.0.0" + browserify-incremental "^3.1.1" + glob "^7.1.2" + lodash "^4.17.4" resolve "^1.1.6" - watchify "^3.3.1" + watchify "^3.6.1" grunt-cli@~1.2.0: version "1.2.0" @@ -1688,12 +1680,13 @@ grunt-cli@~1.2.0: nopt "~3.0.6" resolve "~1.1.0" -grunt-contrib-clean@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/grunt-contrib-clean/-/grunt-contrib-clean-0.5.0.tgz#f53dfdee0849b1c7b40e9ebbba69f48c4c6079c5" - integrity sha1-9T397ghJsce0Dp67umn0jExgecU= +grunt-contrib-clean@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/grunt-contrib-clean/-/grunt-contrib-clean-2.0.0.tgz#3be7ca480da4b740aa5e9d863e2f7e8b24f8a68b" + integrity sha512-g5ZD3ORk6gMa5ugZosLDQl3dZO7cI3R14U75hTM+dVLVxdMNJCPVmwf9OUt4v4eWgpKKWWoVK9DZc1amJp4nQw== dependencies: - rimraf "~2.2.1" + async "^2.6.1" + rimraf "^2.6.2" grunt-contrib-jshint@0.11.0: version "0.11.0" @@ -1703,20 +1696,24 @@ grunt-contrib-jshint@0.11.0: hooker "~0.2.3" jshint "~2.6.0" -grunt-contrib-jshint@~0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/grunt-contrib-jshint/-/grunt-contrib-jshint-0.7.2.tgz#29859ddcf42e7f6c54c43fe75da3c4bd90384a8e" - integrity sha1-KYWd3PQuf2xUxD/nXaPEvZA4So4= +grunt-contrib-jshint@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/grunt-contrib-jshint/-/grunt-contrib-jshint-2.1.0.tgz#3d789807579034299da1b41c4d70e1ba722973ed" + integrity sha512-65S2/C/6RfjY/umTxfwXXn+wVvaYmykHkHSsW6Q6rhkbv3oudTEgqnFFZvWzWCoHUb+3GMZLbP3oSrNyvshmIQ== dependencies: - jshint "~2.3.0" + chalk "^2.4.2" + hooker "^0.2.3" + jshint "~2.10.2" -grunt-contrib-uglify@~0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/grunt-contrib-uglify/-/grunt-contrib-uglify-0.2.7.tgz#e6bda51e0c40a1459f6cead423c65efd725a1bf7" - integrity sha1-5r2lHgxAoUWfbOrUI8Ze/XJaG/c= +grunt-contrib-uglify-es@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/grunt-contrib-uglify-es/-/grunt-contrib-uglify-es-3.3.0.tgz#c15f7b11fd413203d4e0c9137f5d3faf55a8df80" + integrity sha1-wV97Ef1BMgPU4MkTf10/r1Wo34A= dependencies: - grunt-lib-contrib "~0.6.1" - uglify-js "~2.4.0" + chalk "^1.0.0" + maxmin "^1.1.0" + uglify-es "~3.3.0" + uri-path "^1.0.0" grunt-env@^0.4.4: version "0.4.4" @@ -1753,15 +1750,6 @@ grunt-known-options@~1.1.0: resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.1.tgz#6cc088107bd0219dc5d3e57d91923f469059804d" integrity sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ== -grunt-legacy-log-utils@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz#c0706b9dd9064e116f36f23fe4e6b048672c0f7e" - integrity sha1-wHBrndkGThFvNvI/5OawSGcsD34= - dependencies: - colors "~0.6.2" - lodash "~2.4.1" - underscore.string "~2.3.3" - grunt-legacy-log-utils@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz#d2f442c7c0150065d9004b08fd7410d37519194e" @@ -1770,17 +1758,6 @@ grunt-legacy-log-utils@~2.0.0: chalk "~2.4.1" lodash "~4.17.10" -grunt-legacy-log@~0.1.0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz#ec29426e803021af59029f87d2f9cd7335a05531" - integrity sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE= - dependencies: - colors "~0.6.2" - grunt-legacy-log-utils "~0.1.1" - hooker "~0.2.3" - lodash "~2.4.1" - underscore.string "~2.3.3" - grunt-legacy-log@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz#c8cd2c6c81a4465b9bbf2d874d963fef7a59ffb9" @@ -1791,19 +1768,6 @@ grunt-legacy-log@~2.0.0: hooker "~0.2.3" lodash "~4.17.5" -grunt-legacy-util@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz#93324884dbf7e37a9ff7c026dff451d94a9e554b" - integrity sha1-kzJIhNv343qf98Am3/RR2UqeVUs= - dependencies: - async "~0.1.22" - exit "~0.1.1" - getobject "~0.1.0" - hooker "~0.2.3" - lodash "~0.9.2" - underscore.string "~2.2.1" - which "~1.0.5" - grunt-legacy-util@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz#e10624e7c86034e5b870c8a8616743f0a0845e42" @@ -1817,13 +1781,6 @@ grunt-legacy-util@~1.1.1: underscore.string "~3.3.4" which "~1.3.0" -grunt-lib-contrib@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/grunt-lib-contrib/-/grunt-lib-contrib-0.6.1.tgz#3f56adb7da06e814795ee2415b0ebe5fb8903ebb" - integrity sha1-P1att9oG6BR5XuJBWw6+X7iQPrs= - dependencies: - zlib-browserify "0.0.1" - grunt-react@^0.12.1: version "0.12.3" resolved "https://registry.yarnpkg.com/grunt-react/-/grunt-react-0.12.3.tgz#4c53590127e4a5235c04d1227f3910903af48c16" @@ -1863,31 +1820,43 @@ grunt@>=0.4.x: path-is-absolute "~1.0.0" rimraf "~2.6.2" -grunt@~0.4.2: - version "0.4.5" - resolved "https://registry.yarnpkg.com/grunt/-/grunt-0.4.5.tgz#56937cd5194324adff6d207631832a9d6ba4e7f0" - integrity sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A= +grunt@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.0.4.tgz#c799883945a53a3d07622e0737c8f70bfe19eb38" + integrity sha512-PYsMOrOC+MsdGEkFVwMaMyc6Ob7pKmq+deg1Sjr+vvMWp35sztfwKE7qoN51V+UEtHsyNuMcGdgMLFkBHvMxHQ== dependencies: - async "~0.1.22" - coffee-script "~1.3.3" - colors "~0.6.2" - dateformat "1.0.2-1.2.3" + coffeescript "~1.10.0" + dateformat "~1.0.12" eventemitter2 "~0.4.13" exit "~0.1.1" - findup-sync "~0.1.2" - getobject "~0.1.0" - glob "~3.1.21" - grunt-legacy-log "~0.1.0" - grunt-legacy-util "~0.2.0" - hooker "~0.2.3" - iconv-lite "~0.2.11" - js-yaml "~2.0.5" - lodash "~0.9.2" - minimatch "~0.2.12" - nopt "~1.0.10" - rimraf "~2.2.8" - underscore.string "~2.2.1" - which "~1.0.5" + findup-sync "~0.3.0" + glob "~7.0.0" + grunt-cli "~1.2.0" + grunt-known-options "~1.1.0" + grunt-legacy-log "~2.0.0" + grunt-legacy-util "~1.1.1" + iconv-lite "~0.4.13" + js-yaml "~3.13.0" + minimatch "~3.0.2" + mkdirp "~0.5.1" + nopt "~3.0.6" + path-is-absolute "~1.0.0" + rimraf "~2.6.2" + +gzip-size@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-1.0.0.tgz#66cf8b101047227b95bace6ea1da0c177ed5c22f" + integrity sha1-Zs+LEBBHInuVus5uodoMF37Vwi8= + dependencies: + browserify-zlib "^0.1.4" + concat-stream "^1.4.1" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" has-flag@^3.0.0: version "3.0.0" @@ -1962,7 +1931,7 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hooker@~0.2.3: +hooker@^0.2.3, hooker@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/hooker/-/hooker-0.2.3.tgz#b834f723cc4a242aa65963459df6d984c5d3d959" integrity sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk= @@ -1988,6 +1957,11 @@ htmlparser2@3.8.x: entities "1.0" readable-stream "1.1" +http-cache-semantics@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5" + integrity sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew== + https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -2010,11 +1984,6 @@ iconv-lite@^0.4.4, iconv-lite@^0.4.5, iconv-lite@~0.4.13: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@~0.2.11: - version "0.2.11" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.2.11.tgz#1ce60a3a57864a292d1321ff4609ca4bb965adc8" - integrity sha1-HOYKOleGSiktEyH/RgnKS7llrcg= - ieee754@^1.1.4: version "1.1.12" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" @@ -2027,11 +1996,6 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -immutable@^3.7.4: - version "3.8.2" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" - integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= - indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" @@ -2052,11 +2016,6 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" - integrity sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js= - inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -2072,13 +2031,6 @@ ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inline-source-map@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.5.0.tgz#4a4c5dd8e4fb5e9b3cda60c822dfadcaee66e0af" - integrity sha1-Skxd2OT7Xps82mDIIt+tyu5m4K8= - dependencies: - source-map "~0.4.0" - inline-source-map@~0.6.0: version "0.6.2" resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" @@ -2086,20 +2038,6 @@ inline-source-map@~0.6.0: dependencies: source-map "~0.5.3" -insert-module-globals@^6.4.1: - version "6.6.3" - resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-6.6.3.tgz#20638e29a30f9ed1ca2e3a825fbc2cba5246ddfc" - integrity sha1-IGOOKaMPntHKLjqCX7wsulJG3fw= - dependencies: - JSONStream "^1.0.3" - combine-source-map "~0.6.1" - concat-stream "~1.4.1" - is-buffer "^1.1.0" - lexical-scope "^1.2.0" - process "~0.11.0" - through2 "^1.0.0" - xtend "^4.0.0" - insert-module-globals@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.0.tgz#ec87e5b42728479e327bd5c5c71611ddfb4752ba" @@ -2116,6 +2054,11 @@ insert-module-globals@^7.0.0: undeclared-identifiers "^1.1.2" xtend "^4.0.0" +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -2215,6 +2158,11 @@ is-extglob@^1.0.0: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" @@ -2241,6 +2189,20 @@ is-glob@^2.0.0, is-glob@^2.0.1: dependencies: is-extglob "^1.0.0" +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" @@ -2277,7 +2239,7 @@ is-primitive@^2.0.0: resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= -is-stream@^1.0.1: +is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -2292,7 +2254,7 @@ is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -isarray@0.0.1, isarray@~0.0.1: +isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= @@ -2394,18 +2356,23 @@ jasmine-reporters@~1.0.0: dependencies: mkdirp "~0.3.5" +jquery@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.0.tgz#8de513fa0fa4b2c7d2e48a530e26f0596936efdf" + integrity sha512-ggRCXln9zEqv6OqAGXFEcshF5dSBvCkzj6Gm2gzuR5fWawaX8t7cxKVkkygKODrDAzKdoYw3l/e3pm3vlT4IbQ== + "js-tokens@^3.0.0 || ^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@~2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-2.0.5.tgz#a25ae6509999e97df278c6719da11bd0687743a8" - integrity sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g= +js-yaml@~3.13.0: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: - argparse "~ 0.1.11" - esprima "~ 1.0.2" + argparse "^1.0.7" + esprima "^4.0.0" js-yaml@~3.5.2: version "3.5.5" @@ -2415,16 +2382,19 @@ js-yaml@~3.5.2: argparse "^1.0.2" esprima "^2.6.0" -jshint@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.3.0.tgz#19504455a2c20c46ee183361eb87f3a1c0b7dc47" - integrity sha1-GVBEVaLCDEbuGDNh64fzocC33Ec= +jshint@~2.10.2: + version "2.10.2" + resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.10.2.tgz#ed6626c4f8223c98e94aaea62767435427a49a3d" + integrity sha512-e7KZgCSXMJxznE/4WULzybCMNXNAd/bf5TSrvVEq78Q/K8ZwFpmBqQeDtNiHc3l49nV4E/+YeHU/JZjSUIrLAA== dependencies: - cli "0.4.x" - console-browserify "0.1.x" - minimatch "0.x.x" - shelljs "0.1.x" - underscore "1.4.x" + cli "~1.0.0" + console-browserify "1.1.x" + exit "0.1.x" + htmlparser2 "3.8.x" + lodash "~4.17.11" + minimatch "~3.0.2" + shelljs "0.3.x" + strip-json-comments "1.0.x" jshint@~2.6.0: version "2.6.3" @@ -2440,6 +2410,11 @@ jshint@~2.6.0: strip-json-comments "1.0.x" underscore "1.6.x" +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + json-stable-stringify@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" @@ -2452,6 +2427,11 @@ jsonify@~0.0.0: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= +jsonparse@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-0.0.5.tgz#330542ad3f0a654665b778f3eb2d9a9fa507ac64" + integrity sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ= + jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" @@ -2466,16 +2446,12 @@ jstransform@^10.1.0: esprima-fb "13001.1001.0-dev-harmony-fb" source-map "0.1.31" -jstransform@^11.0.3: - version "11.0.3" - resolved "https://registry.yarnpkg.com/jstransform/-/jstransform-11.0.3.tgz#09a78993e0ae4d4ef4487f6155a91f6190cb4223" - integrity sha1-CaeJk+CuTU70SH9hVakfYZDLQiM= +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== dependencies: - base62 "^1.1.0" - commoner "^0.10.1" - esprima-fb "^15001.1.0-dev-harmony-fb" - object-assign "^2.0.0" - source-map "^0.4.2" + json-buffer "3.0.0" kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" @@ -2501,15 +2477,6 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== -labeled-stream-splicer@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz#4615331537784981e8fd264e1f3a434c4e0ddd65" - integrity sha1-RhUzFTd4SYHo/SZOHzpDTE4N3WU= - dependencies: - inherits "^2.0.1" - isarray "~0.0.1" - stream-splicer "^1.1.0" - labeled-stream-splicer@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz#9cffa32fd99e1612fd1d86a8db962416d5292926" @@ -2519,12 +2486,12 @@ labeled-stream-splicer@^2.0.0: isarray "^2.0.4" stream-splicer "^2.0.0" -lexical-scope@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0afaf22df4" - integrity sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ= +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= dependencies: - astw "^2.0.0" + invert-kv "^1.0.0" load-json-file@^1.0.0: version "1.1.0" @@ -2537,32 +2504,40 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + lodash.memoize@~3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8= -lodash@^3.8.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= - -lodash@~0.9.2: - version "0.9.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-0.9.2.tgz#8f3499c5245d346d682e5b0d3b40767e09f1a92c" - integrity sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw= +lodash@^4.17.11, lodash@^4.17.4, lodash@~4.17.10, lodash@~4.17.11, lodash@~4.17.5: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== lodash@~2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" integrity sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4= -lodash@~4.17.10, lodash@~4.17.5: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== - -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -2577,11 +2552,24 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + lru-cache@2: version "2.7.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -2599,18 +2587,28 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -markdown@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/markdown/-/markdown-0.4.0.tgz#a4b545adb6c66494f97168f3290c8d1b073e5b2a" - integrity sha1-pLVFrbbGZJT5cWjzKQyNGwc+Wyo= +markdown@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/markdown/-/markdown-0.5.0.tgz#28205b565a8ae7592de207463d6637dc182722b2" + integrity sha1-KCBbVlqK51kt4gdGPWY33BgnIrI= dependencies: - nopt "1" + nopt "~2.1.1" math-random@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" integrity sha1-izqsWIuKZuSXXjzepn97sylgH6w= +maxmin@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/maxmin/-/maxmin-1.1.0.tgz#71365e84a99dd8f8b3f7d5fde2f00d1e7f73be61" + integrity sha1-cTZehKmd2Piz99X94vANHn9zvmE= + dependencies: + chalk "^1.0.0" + figures "^1.0.1" + gzip-size "^1.0.0" + pretty-bytes "^1.0.0" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -2620,7 +2618,14 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -meow@^3.3.0: +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= + dependencies: + mimic-fn "^1.0.0" + +meow@^3.1.0, meow@^3.3.0, meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= @@ -2636,7 +2641,7 @@ meow@^3.3.0: redent "^1.0.0" trim-newlines "^1.0.0" -micromatch@^2.1.5: +micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= @@ -2655,7 +2660,7 @@ micromatch@^2.1.5: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.1.10: +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -2682,6 +2687,16 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -2700,7 +2715,7 @@ minimatch@0.3: lru-cache "2" sigmund "~1.0.0" -minimatch@0.x, minimatch@0.x.x: +minimatch@0.x: version "0.4.0" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.4.0.tgz#bd2c7d060d2c8c8fd7cde7f1f2ed2d5b270fdb1b" integrity sha1-vSx9Bg0sjI/Xzefx8u0tWycP2xs= @@ -2723,14 +2738,7 @@ minimatch@1.0.x: dependencies: brace-expansion "^1.1.7" -minimatch@^2.0.1: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - integrity sha1-jQh8OcazjAAbl/ynzm0OHoCvusc= - dependencies: - brace-expansion "^1.0.0" - -minimatch@~0.2.11, minimatch@~0.2.12, minimatch@~0.2.9: +minimatch@~0.2.9: version "0.2.14" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" integrity sha1-x054BXT2PG+aCQ6Q775u9TpqdWo= @@ -2783,26 +2791,6 @@ mkdirp@~0.3.5: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= -module-deps@^3.7.11: - version "3.9.1" - resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-3.9.1.tgz#ea75caf9199090d25b0d5512b5acacb96e7f87f3" - integrity sha1-6nXK+RmQkNJbDVUStaysuW5/h/M= - dependencies: - JSONStream "^1.0.3" - browser-resolve "^1.7.0" - concat-stream "~1.4.5" - defined "^1.0.0" - detective "^4.0.0" - duplexer2 "0.0.2" - inherits "^2.0.1" - parents "^1.0.0" - readable-stream "^1.1.13" - resolve "^1.1.3" - stream-combiner2 "~1.0.0" - subarg "^1.0.0" - through2 "^1.0.0" - xtend "^4.0.0" - module-deps@^4.0.8: version "4.1.1" resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.1.1.tgz#23215833f1da13fd606ccb8087b44852dcb821fd" @@ -2855,10 +2843,10 @@ mute-stream@~0.0.4: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -nan@^2.9.2: - version "2.11.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" - integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA== +nan@^2.12.1: + version "2.13.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" + integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== nanomatch@^1.2.9: version "1.2.13" @@ -2899,10 +2887,10 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" -node-pre-gyp@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -2915,13 +2903,6 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -nopt@1, nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= - dependencies: - abbrev "1" - nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -2930,6 +2911,13 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" +nopt@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-2.1.2.tgz#6cccd977b80132a07731d6e8ce58c2c8303cf9af" + integrity sha1-bMzZd7gBMqB3MdbozljCyDA8+a8= + dependencies: + abbrev "1" + nopt@~3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -2947,13 +2935,23 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0, normalize-path@^2.0.1: +normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + npm-bundled@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" @@ -2967,6 +2965,13 @@ npm-packlist@^1.1.6: ignore-walk "^3.0.1" npm-bundled "^1.0.1" +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -2982,12 +2987,7 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -object-assign@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" - integrity sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo= - -object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -3001,11 +3001,6 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-keys@^1.0.4: - version "1.0.12" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" - integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== - object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -3028,7 +3023,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -once@^1.3.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -3050,6 +3045,15 @@ os-homedir@^1.0.0: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + os-tmpdir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -3070,6 +3074,35 @@ outpipe@^1.1.0: dependencies: shell-quote "^1.4.2" +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + pako@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" @@ -3125,6 +3158,11 @@ path-browserify@~0.0.0: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -3132,11 +3170,21 @@ path-exists@^2.0.0: dependencies: pinkie-promise "^2.0.0" +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + path-is-absolute@^1.0.0, path-is-absolute@^1.0.1, path-is-absolute@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + path-parse@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" @@ -3156,6 +3204,13 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + pbkdf2@^3.0.3: version "3.0.17" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" @@ -3199,11 +3254,24 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= +pretty-bytes@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84" + integrity sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ= + dependencies: + get-stdin "^4.0.1" + meow "^3.1.0" + private@^0.1.6, private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -3224,7 +3292,7 @@ process@~0.11.0: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -promise@^7.0.3, promise@^7.1.1: +promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== @@ -3243,11 +3311,25 @@ prompt@^1.0.0: utile "0.3.x" winston "2.1.x" +prop-types@^15.6.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + proxyquire@~1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-1.3.2.tgz#d6e801ac00b0c05efb20947ba34738b5aa02f48d" integrity sha1-1ugBrACwwF77IJR7o0c4taoC9I0= +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" @@ -3260,6 +3342,14 @@ public-encrypt@^4.0.0: randombytes "^2.0.1" safe-buffer "^5.1.2" +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -3270,16 +3360,11 @@ punycode@^1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -q@^1.1.2: +q@^1.1.2, q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -q@~0.8.11: - version "0.8.12" - resolved "https://registry.yarnpkg.com/q/-/q-0.8.12.tgz#9162a91e11819c4bcda7da15cf5fefaad0778823" - integrity sha1-kWKpHhGBnEvNp9oVz1/vqtB3iCM= - querystring-es3@~0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -3324,6 +3409,21 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-dom@^16.8.6: + version "16.8.6" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.6.tgz#71d6303f631e8b0097f56165ef608f051ff6e10f" + integrity sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.13.6" + +react-is@^16.8.1: + version "16.8.6" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" + integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== + react-tools@^0.13.0: version "0.13.3" resolved "https://registry.yarnpkg.com/react-tools/-/react-tools-0.13.3.tgz#da6ac7d4d7777a59a5e951cf46e72fd4b6b40a2c" @@ -3332,20 +3432,15 @@ react-tools@^0.13.0: commoner "^0.10.0" jstransform "^10.1.0" -react@^0.13.1: - version "0.13.3" - resolved "https://registry.yarnpkg.com/react/-/react-0.13.3.tgz#a2dfa85335d7dc02b82b482f089582e64cc13356" - integrity sha1-ot+oUzXX3AK4K0gvCJWC5kzBM1Y= +react@^16.8.6: + version "16.8.6" + resolved "https://registry.yarnpkg.com/react/-/react-16.8.6.tgz#ad6c3a9614fd3a4e9ef51117f54d888da01f2bbe" + integrity sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw== dependencies: - envify "^3.0.0" - -read-only-stream@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-1.1.1.tgz#5da77c799ed1388d3ef88a18471bb5924f8a0ba1" - integrity sha1-Xad8eZ7ROI0++IoYRxu1kk+KC6E= - dependencies: - readable-stream "^1.0.31" - readable-wrap "^1.0.0" + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.13.6" read-only-stream@^2.0.0: version "2.0.0" @@ -3362,6 +3457,14 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -3371,6 +3474,15 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + read@1.0.x: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" @@ -3388,16 +3500,6 @@ readable-stream@1.1: isarray "0.0.1" string_decoder "~0.10.x" -"readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@^1.0.31, readable-stream@^1.1.13, readable-stream@^1.1.13-1, readable-stream@~1.1.9: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -3411,16 +3513,6 @@ readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@~1.0.17: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readable-stream@~2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" @@ -3433,14 +3525,7 @@ readable-stream@~2.0.0: string_decoder "~0.10.x" util-deprecate "~1.0.1" -readable-wrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/readable-wrap/-/readable-wrap-1.0.0.tgz#3b5a211c631e12303a54991c806c17e7ae206bff" - integrity sha1-O1ohHGMeEjA6VJkcgGwX564ga/8= - dependencies: - readable-stream "^1.1.13-1" - -readdirp@^2.0.0: +readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== @@ -3449,6 +3534,11 @@ readdirp@^2.0.0: micromatch "^3.1.10" readable-stream "^2.0.2" +readme-filename@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/readme-filename/-/readme-filename-1.0.0.tgz#08ec2dda26520cd16f3e836d01553f8a108efe5e" + integrity sha1-COwt2iZSDNFvPoNtAVU/ihCO/l4= + recast@^0.11.17: version "0.11.23" resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" @@ -3504,6 +3594,25 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" +replace-in-file@^2.0.1: + version "2.6.4" + resolved "https://registry.yarnpkg.com/replace-in-file/-/replace-in-file-2.6.4.tgz#a80e25c5c0e0efe9d04afe01a4a57ff98e8b6461" + integrity sha512-MMriy7P5/BB2f3Kp+qzSj3wrjde/5i9s9C80o2XHU3y0N1lKurMA7J4SN2UeKAWCk3/vEqSmI42vqRqH5Np9zg== + dependencies: + chalk "^2.1.0" + glob "^7.1.2" + yargs "^8.0.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + requirejs@>=0.27.1, requirejs@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.6.tgz#e5093d9601c2829251258c0b9445d4d19fa9e7c9" @@ -3526,6 +3635,13 @@ resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6, resolve@^1.4.0: dependencies: path-parse "^1.0.5" +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -3548,10 +3664,12 @@ rimraf@2.x.x, rimraf@^2.6.1, rimraf@~2.6.2: dependencies: glob "^7.0.5" -rimraf@~2.2.1, rimraf@~2.2.8: - version "2.2.8" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" - integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= +rimraf@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" @@ -3583,12 +3701,20 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +scheduler@^0.13.6: + version "0.13.6" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889" + integrity sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + "semver@2 || 3 || 4 || 5", semver@^5.3.0: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== -set-blocking@~2.0.0: +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -3634,6 +3760,18 @@ shasum@^1.0.0: json-stable-stringify "~0.0.0" sha.js "~2.4.4" +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + shell-quote@^1.4.2, shell-quote@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" @@ -3644,16 +3782,6 @@ shell-quote@^1.4.2, shell-quote@^1.6.1: array-reduce "~0.0.0" jsonify "~0.0.0" -shell-quote@~0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-0.0.1.tgz#1a41196f3c0333c482323593d6886ecf153dd986" - integrity sha1-GkEZbzwDM8SCMjWT1ohuzxU92YY= - -shelljs@0.1.x: - version "0.1.4" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.1.4.tgz#dfbbe78d56c3c0168d2fb79e10ecd1dbcb07ec0e" - integrity sha1-37vnjVbDwBaNL7eeEOzR28sH7A4= - shelljs@0.3.x: version "0.3.0" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1" @@ -3727,25 +3855,16 @@ source-map@0.1.31: dependencies: amdefine ">=0.0.4" -source-map@0.1.34: - version "0.1.34" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.34.tgz#a7cfe89aec7b1682c3b198d0acfb47d7d090566b" - integrity sha1-p8/omux7FoLDsZjQrPtH19CQVms= - dependencies: - amdefine ">=0.0.4" - -source-map@^0.4.2, source-map@~0.4.0, source-map@~0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - integrity sha1-66T12pwNyZneaAMti092FzZSA2s= - dependencies: - amdefine ">=0.0.4" - source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.3: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + spdx-correct@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e" @@ -3818,26 +3937,6 @@ stream-combiner2@^1.1.1: duplexer2 "~0.1.0" readable-stream "^2.0.2" -stream-combiner2@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.0.2.tgz#ba72a6b50cbfabfa950fc8bc87604bd01eb60671" - integrity sha1-unKmtQy/q/qVD8i8h2BL0B62BnE= - dependencies: - duplexer2 "~0.0.2" - through2 "~0.5.1" - -stream-http@^1.2.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-1.7.1.tgz#d3d2a6e14c36a38b9dafb199aee7bbc570519978" - integrity sha1-09Km4Uw2o4udr7GZrue7xXBRmXg= - dependencies: - builtin-status-codes "^1.0.0" - foreach "^2.0.5" - indexof "0.0.1" - inherits "^2.0.1" - object-keys "^1.0.4" - xtend "^4.0.0" - stream-http@^2.0.0: version "2.8.3" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" @@ -3849,18 +3948,6 @@ stream-http@^2.0.0: to-arraybuffer "^1.0.0" xtend "^4.0.0" -stream-splicer@^1.1.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-1.3.2.tgz#3c0441be15b9bf4e226275e6dc83964745546661" - integrity sha1-PARBvhW5v04iYnXm3IOWR0VUZmE= - dependencies: - indexof "0.0.1" - inherits "^2.0.1" - isarray "~0.0.1" - readable-stream "^1.1.13-1" - readable-wrap "^1.0.0" - through2 "^1.0.0" - stream-splicer@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83" @@ -3878,7 +3965,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2": +"string-width@^1.0.2 || 2", string-width@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -3926,6 +4013,16 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" @@ -3950,6 +4047,11 @@ subarg@^1.0.0: dependencies: minimist "^1.1.0" +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -3982,14 +4084,6 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" -through2@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-1.1.1.tgz#0847cbc4449f3405574dbdccd9bb841b83ac3545" - integrity sha1-CEfLxESfNAVXTb3M2buEG4OsNUU= - dependencies: - readable-stream ">=1.1.13-1 <1.2.0-0" - xtend ">=4.0.0 <4.1.0-0" - through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -3998,15 +4092,7 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through2@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" - integrity sha1-390BLrnHAOIyP9M084rGIqs3Lac= - dependencies: - readable-stream "~1.0.17" - xtend "~3.0.0" - -"through@>=2.2.7 <3", through@~2.3.4, through@~2.3.6: +"through@>=2.2.7 <3", through@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -4030,6 +4116,11 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" @@ -4068,20 +4159,13 @@ ua-parser-js@^0.7.18: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" integrity sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ== -uglify-js@~2.4.0: - version "2.4.24" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.4.24.tgz#fad5755c1e1577658bb06ff9ab6e548c95bebd6e" - integrity sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4= +uglify-es@~3.3.0: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== dependencies: - async "~0.2.6" - source-map "0.1.34" - uglify-to-browserify "~1.0.0" - yargs "~3.5.4" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= + commander "~2.13.0" + source-map "~0.6.1" umd@^3.0.0: version "3.0.3" @@ -4098,21 +4182,6 @@ undeclared-identifiers@^1.1.2: simple-concat "^1.0.0" xtend "^4.0.1" -underscore.string@~2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.2.1.tgz#d7c0fa2af5d5a1a67f4253daee98132e733f0f19" - integrity sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk= - -underscore.string@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.3.3.tgz#71c08bf6b428b1133f37e78fa3a21c82f7329b0d" - integrity sha1-ccCL9rQosRM/N+ePo6Icgvcymw0= - -underscore.string@~2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.4.0.tgz#8cdd8fbac4e2d2ea1e7e2e8097c42f442280f85b" - integrity sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs= - underscore.string@~3.3.4: version "3.3.5" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023" @@ -4121,25 +4190,20 @@ underscore.string@~3.3.4: sprintf-js "^1.0.3" util-deprecate "^1.0.2" -underscore@1.4.x, underscore@~1.4.3: - version "1.4.4" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" - integrity sha1-YaajIBBiKvoHljvzJSA88SI51gQ= - underscore@1.6.x: version "1.6.0" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" integrity sha1-izixDKze9jM3uLJOT/htRa6lKag= -"underscore@>= 1.3.1", underscore@>=1.5.0, underscore@~1.9.1: +"underscore@>= 1.3.1", underscore@>=1.8.3, underscore@~1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== -underscore@~1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" - integrity sha1-a7rwh3UA02vjTsqlhODbn+8DUgk= +underscore@~1.4.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" + integrity sha1-YaajIBBiKvoHljvzJSA88SI51gQ= union-value@^1.0.0: version "1.0.0" @@ -4159,18 +4223,27 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + +uri-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/uri-path/-/uri-path-1.0.0.tgz#9747f018358933c31de0fccfd82d138e67262e32" + integrity sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI= + urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url@~0.10.1: - version "0.10.3" - resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" - integrity sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ= +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= dependencies: - punycode "1.3.2" - querystring "0.2.0" + prepend-http "^2.0.0" url@~0.11.0: version "0.11.0" @@ -4241,14 +4314,14 @@ vm-browserify@~0.0.1: resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.12.tgz#2f24f1ade64aab1e458591d4442c8868356e9281" integrity sha512-HFhaD4mMWPzFSqhpyDG48KDdrjfn409YQuVW7ckZYhW4sE87mYtWifdB/+73RA7+p4s4K18n5Jfx1kHthE1gBw== -watchify@^3.3.1: - version "3.11.0" - resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.11.0.tgz#03f1355c643955e7ab8dcbf399f624644221330f" - integrity sha512-7jWG0c3cKKm2hKScnSAMUEUjRJKXUShwMPk0ASVhICycQhwND3IMAdhJYmc1mxxKzBUJTSF5HZizfrKrS6BzkA== +watchify@^3.6.1: + version "3.11.1" + resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.11.1.tgz#8e4665871fff1ef64c0430d1a2c9d084d9721881" + integrity sha512-WwnUClyFNRMB2NIiHgJU9RQPQNqVeFk7OmZaWf5dC5EnNa0Mgr7imBydbaJ7tGTuPM2hz1Cb4uiBvK9NVxMfog== dependencies: - anymatch "^1.3.0" + anymatch "^2.0.0" browserify "^16.1.0" - chokidar "^1.0.0" + chokidar "^2.1.1" defined "^1.0.0" outpipe "^1.1.0" through2 "^2.0.0" @@ -4259,17 +4332,12 @@ whatwg-fetch@>=0.10.0: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== -whatwg-fetch@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-0.9.0.tgz#0e3684c6cb9995b43efc9df03e4c365d95fd9cc0" - integrity sha1-DjaExsuZlbQ+/J3wPkw2XZX9nMA= +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@~1.0.5: - version "1.0.9" - resolved "https://registry.yarnpkg.com/which/-/which-1.0.9.tgz#460c1da0f810103d0321a9b633af9e575e64486f" - integrity sha1-RgwdoPgQED0DIam2M6+eV15kSG8= - -which@~1.3.0: +which@^1.2.9, which@~1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -4283,11 +4351,6 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= - winston@2.1.x: version "2.1.1" resolved "https://registry.yarnpkg.com/winston/-/winston-2.1.1.tgz#3c9349d196207fd1bdff9d4bc43ef72510e3a12e" @@ -4301,10 +4364,13 @@ winston@2.1.x: pkginfo "0.3.x" stack-trace "0.0.x" -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" wrappy@1: version "1.0.2" @@ -4316,32 +4382,48 @@ xmldom@^0.1.22: resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= -xtend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" - integrity sha1-XM50B7r2Qsunvs2laBEcST9ZZlo= +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yallist@^3.0.0, yallist@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== -yargs@~3.5.4: - version "3.5.4" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.5.4.tgz#d8aff8f665e94c34bd259bdebd1bfaf0ddd35361" - integrity sha1-2K/49mXpTDS9JZvevRv68N3TU2E= +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= dependencies: - camelcase "^1.0.2" - decamelize "^1.0.0" - window-size "0.1.0" - wordwrap "0.0.2" + camelcase "^4.1.0" -zlib-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/zlib-browserify/-/zlib-browserify-0.0.1.tgz#4fa6a45d00dbc15f318a4afa1d9afc0258e176cc" - integrity sha1-T6akXQDbwV8xikr6HZr8Aljhdsw= +yargs@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A= + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" From 9f51202e60931b97bc1c9faa1548c63a63f717fe Mon Sep 17 00:00:00 2001 From: David Nelson Date: Tue, 30 Apr 2019 20:12:29 -0500 Subject: [PATCH 103/359] Update README reference from npm to yarn --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8cdaa4bf..4086a827 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ at least once before submitting a pull request. That means you'll need the "Grun https://gruntjs.com/getting-started -You'll also need `npm` to download all the dependencies of the project. +You'll also need `yarn` to download all the dependencies of the project. The general workflow / steps are below: From 4e32f729c15f4e10657b479077b2d700a371ef1b Mon Sep 17 00:00:00 2001 From: David Nelson Date: Tue, 30 Apr 2019 20:19:43 -0500 Subject: [PATCH 104/359] Check that there are no source file changes before building If dependencies are changed (in package.json) without updating the yarn.lock file, or if any other part of the build process starts producing unignored files, the CI build will fail, so that the problem can be corrected before the PR is merged. --- .travis.yml | 2 ++ checkgit.sh | 6 ++++++ 2 files changed, 8 insertions(+) create mode 100755 checkgit.sh diff --git a/.travis.yml b/.travis.yml index 8fa89666..777c536e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,4 +11,6 @@ cache: directories: - "node_modules" script: + - ./checkgit.sh "Source files were modified before build; is yarn.lock out of sync with package.json?" || travis_terminate $? - yarn grunt + - ./checkgit.sh "Source files were modified by the build" || travis_terminate $? diff --git a/checkgit.sh b/checkgit.sh new file mode 100755 index 00000000..ee29eb4b --- /dev/null +++ b/checkgit.sh @@ -0,0 +1,6 @@ +GIT_STATUS=$(git status --porcelain | wc -l ) +if [[ GIT_STATUS -ne 0 ]]; then + echo "${1:-Source files were modified}" + git status + exit $GIT_STATUS +fi; From ec0ca6b7110a9b656a87297d19e186f11d979a0e Mon Sep 17 00:00:00 2001 From: Hongarc Date: Thu, 2 May 2019 12:44:56 +0700 Subject: [PATCH 105/359] Use `babelify` instead of `grunt-react` --- Gruntfile.js | 6 +- package.json | 5 +- yarn.lock | 1275 +++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 1005 insertions(+), 281 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index ddd728d7..f424988d 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,5 +1,6 @@ var _ = require('underscore'); var fs = require('fs'); +var babelify = require('babelify'); // Haha, this is so tricky. so we have a template for index.html to stick // in the hashed JS and style files -- that template also contains @@ -213,7 +214,9 @@ module.exports = function(grunt) { }, browserify: { options: { - transform: [require('grunt-react').browserify] + transform: [babelify.configure({ + presets: ['@babel/preset-env', '@babel/preset-react'] + })] }, dist: { files: { @@ -234,7 +237,6 @@ module.exports = function(grunt) { grunt.loadNpmTasks('grunt-shell-spawn'); grunt.loadNpmTasks('grunt-jasmine-node'); grunt.loadNpmTasks('grunt-contrib-uglify-es'); - grunt.loadNpmTasks('grunt-react'); grunt.loadNpmTasks('grunt-env'); grunt.registerTask('build', diff --git a/package.json b/package.json index fc2d1c7b..3945d4da 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,10 @@ "url": "https://github.com/pcottle/learnGitBranching" }, "devDependencies": { + "@babel/core": "^7.4.4", + "@babel/preset-env": "^7.4.4", + "@babel/preset-react": "^7.0.0", + "babelify": "^10.0.0", "browserify": "^13.0.0", "contributor-faces": "^1.0.2", "grunt": "^1.0.4", @@ -24,7 +28,6 @@ "grunt-hash": "~0.5.0", "grunt-jasmine-node": "~0.1.0", "grunt-jsxhint": "^0.5.0", - "grunt-react": "^0.12.1", "grunt-shell-spawn": "~0.3.0", "jasmine-node": "~1.12.0", "prompt": "^1.0.0" diff --git a/yarn.lock b/yarn.lock index b50fbcb2..68bf4337 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,680 @@ # yarn lockfile v1 +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.4.tgz#84055750b05fcd50f9915a826b44fa347a825250" + integrity sha512-lQgGX3FPRgbz2SKmhMtYgJvVzGZrmjaF4apZ2bLwofAKiSjxU0drPh4S/VasyYXwaTs+A1gvQ45BN8SQJzHsQQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helpers" "^7.4.4" + "@babel/parser" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" + integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== + dependencies: + "@babel/types" "^7.4.4" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-builder-react-jsx@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" + integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== + dependencies: + "@babel/types" "^7.3.0" + esutils "^2.0.0" + +"@babel/helper-call-delegate@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" + integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-define-map@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz#6969d1f570b46bdc900d1eba8e5d59c48ba2c12a" + integrity sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.4.4" + lodash "^4.17.11" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" + integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz#96115ea42a2f139e619e98ed46df6019b94414b8" + integrity sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/types" "^7.4.4" + lodash "^4.17.11" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.4.tgz#a47e02bc91fb259d2e6727c2a30013e3ac13c4a2" + integrity sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q== + dependencies: + lodash "^4.17.11" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27" + integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/helpers@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.4.tgz#868b0ef59c1dd4e78744562d5ce1b59c89f2f2a5" + integrity sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A== + dependencies: + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.4.tgz#5977129431b8fe33471730d255ce8654ae1250b6" + integrity sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz#1ef173fcf24b3e2df92a678f027673b55e7e3005" + integrity sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" + integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-jsx@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" + integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz#a3f1d01f2f21cadab20b33a82133116f14fb5894" + integrity sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz#c13279fabf6b916661531841a23c4b7dae29646d" + integrity sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.11" + +"@babel/plugin-transform-classes@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz#0ce4094cdafd709721076d3b9c38ad31ca715eb6" + integrity sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.4" + "@babel/helper-split-export-declaration" "^7.4.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz#9d964717829cc9e4b601fc82a26a71a4d8faf20f" + integrity sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" + integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" + integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" + integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" + integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-member-expression-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" + integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz#0bef4713d30f1d78c2e59b3d6db40e60192cac1e" + integrity sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw== + dependencies: + "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz#dc83c5665b07d6c2a7b224c00ac63659ea36a405" + integrity sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.4.tgz#5611d96d987dfc4a3a81c4383bb173361037d68d" + integrity sha512-Ki+Y9nXBlKfhD+LXaRS7v95TtTGYRAf9Y1rTDiE75zf8YQz4GDaWRXosMfJBXxnk88mGFjWdCRIeqDbon7spYA== + dependencies: + regexp-tree "^0.1.0" + +"@babel/plugin-transform-new-target@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" + integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" + integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== + dependencies: + "@babel/helper-call-delegate" "^7.4.4" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-property-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" + integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" + integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-jsx-self@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz#461e21ad9478f1031dd5e276108d027f1b5240ba" + integrity sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz#20c8c60f0140f5dd3cd63418d452801cf3f7180f" + integrity sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" + integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== + dependencies: + "@babel/helper-builder-react-jsx" "^7.3.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-regenerator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.4.tgz#5b4da4df79391895fca9e28f99e87e22cfc02072" + integrity sha512-Zz3w+pX1SI0KMIiqshFZkwnVGUhDZzpX2vtPzfJBKQQq8WsP/Xy9DNdELWivxcKOCX/Pywge4SiEaPaLtoDT4g== + dependencies: + regenerator-transform "^0.13.4" + +"@babel/plugin-transform-reserved-words@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" + integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" + integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" + integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/preset-env@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.4.tgz#b6f6825bfb27b3e1394ca3de4f926482722c1d6f" + integrity sha512-FU1H+ACWqZZqfw1x2G1tgtSSYSfxJLkpaUQL37CenULFARDo+h4xJoVHzRoHbK+85ViLciuI7ME4WTIhFRBBlw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.4.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.4.4" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.4.4" + "@babel/plugin-transform-classes" "^7.4.4" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.4" + "@babel/plugin-transform-function-name" "^7.4.4" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.4.4" + "@babel/plugin-transform-modules-systemjs" "^7.4.4" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.4" + "@babel/plugin-transform-new-target" "^7.4.4" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.4.4" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.4" + "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.4.4" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.4.4" + "@babel/types" "^7.4.4" + browserslist "^4.5.2" + core-js-compat "^3.0.0" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.5.0" + +"@babel/preset-react@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" + integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + +"@babel/template@^7.1.0", "@babel/template@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" + integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.4.tgz#0776f038f6d78361860b6823887d4f3937133fe8" + integrity sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.4.4" + "@babel/types" "^7.4.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" + integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -40,7 +714,7 @@ acorn-dynamic-import@^4.0.0: resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== -acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2: +acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.6.1: version "1.6.2" resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.6.2.tgz#b7d7ceca6f22e6417af933a62cad4de01048d5d2" integrity sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg== @@ -61,14 +735,9 @@ acorn@^5.2.1: integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== acorn@^6.0.2: - version "6.0.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754" - integrity sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg== - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== ansi-regex@^2.0.0: version "2.1.1" @@ -113,7 +782,7 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -argparse@^1.0.2, argparse@^1.0.7: +argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== @@ -198,11 +867,6 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -ast-types@0.9.6: - version "0.9.6" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" - integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk= - async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" @@ -235,6 +899,11 @@ atob@^2.1.1: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +babelify@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/babelify/-/babelify-10.0.0.tgz#fe73b1a22583f06680d8d072e25a1e0d1d1d7fb5" + integrity sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg== + backbone@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.4.0.tgz#54db4de9df7c3811c3f032f34749a4cd27f3bd12" @@ -247,11 +916,6 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -base62@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/base62/-/base62-0.1.1.tgz#7b4174c2f94449753b11c2651c083da841a7b084" - integrity sha1-e0F0wvlESXU7EcJlHAg9qEGnsIQ= - base64-js@^1.0.2: version "1.3.0" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" @@ -271,9 +935,9 @@ base@^0.11.1: pascalcase "^0.1.1" binary-extensions@^1.0.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" - integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" @@ -529,6 +1193,15 @@ browserify@^16.0.0, browserify@^16.1.0: vm-browserify "^1.0.0" xtend "^4.0.0" +browserslist@^4.5.2, browserslist@^4.5.4: + version "4.5.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.5.6.tgz#ea42e8581ca2513fa7f371d4dd66da763938163d" + integrity sha512-o/hPOtbU9oX507lIqon+UvPYqpx3mHc8cV3QemSBTXwkG8gSQSK6UKvXcE/DcleU3+A59XTUHyCvZ5qGy8xVAg== + dependencies: + caniuse-lite "^1.0.30000963" + electron-to-chromium "^1.3.127" + node-releases "^1.1.17" + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -556,11 +1229,6 @@ buffer@^5.0.2: base64-js "^1.0.2" ieee754 "^1.1.4" -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -617,6 +1285,11 @@ camelcase@^4.1.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= +caniuse-lite@^1.0.30000963: + version "1.0.30000963" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000963.tgz#5be481d5292f22aff5ee0db4a6c049b65b5798b1" + integrity sha512-n4HUiullc7Lw0LyzpeLa2ffP8KxFBGdxqD/8G3bSL6oB758hZ2UE2CVK+tQN958tJIi0/tfpjAc67aAtoHgnrQ== + chalk@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -628,7 +1301,7 @@ chalk@^1.0.0: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.1.0, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2, chalk@~2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -637,15 +1310,6 @@ chalk@^2.1.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chokidar@^2.1.1: version "2.1.5" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" @@ -766,9 +1430,9 @@ colors@1.0.x: integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= colors@^1.1.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" - integrity sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ== + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== colors@~1.1.2: version "1.1.2" @@ -785,35 +1449,15 @@ combine-source-map@^0.8.0, combine-source-map@~0.8.0: lodash.memoize "~3.0.3" source-map "~0.5.3" -commander@^2.5.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== - commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== -commoner@^0.10.0: - version "0.10.8" - resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5" - integrity sha1-NPw2cs0kOT6LtH5wyqApOBH08sU= - dependencies: - commander "^2.5.0" - detective "^4.3.1" - glob "^5.0.15" - graceful-fs "^4.1.2" - iconv-lite "^0.4.5" - mkdirp "^0.5.0" - private "^0.1.6" - q "^1.1.2" - recast "^0.11.17" - component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== concat-map@0.0.1: version "0.0.1" @@ -867,6 +1511,13 @@ contributor-faces@^1.0.2: readme-filename "^1.0.0" replace-in-file "^2.0.1" +convert-source-map@^1.1.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + convert-source-map@~1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" @@ -877,6 +1528,26 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +core-js-compat@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.0.1.tgz#bff73ba31ca8687431b9c88f78d3362646fb76f0" + integrity sha512-2pC3e+Ht/1/gD7Sim/sqzvRplMiRnFQVlPpDVaHtY9l7zZP7knamr3VRD6NyGfHd84MrDC0tAM9ulNxYMW0T3g== + dependencies: + browserslist "^4.5.4" + core-js "3.0.1" + core-js-pure "3.0.1" + semver "^6.0.0" + +core-js-pure@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.0.1.tgz#37358fb0d024e6b86d443d794f4e37e949098cbe" + integrity sha512-mSxeQ6IghKW3MoyF4cz19GJ1cMm7761ON+WObSyLfTu/Jn3x7w4NwNFnrZxgl4MTSvYYepVLNuRtlB4loMwJ5g== + +core-js@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.1.tgz#1343182634298f7f38622f95e73f54e48ddf4738" + integrity sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew== + core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" @@ -961,6 +1632,11 @@ cycle@1.0.x: resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI= +dash-ast@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37" + integrity sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA== + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -974,13 +1650,20 @@ dateformat@~1.0.12: get-stdin "^4.0.1" meow "^3.3.0" -debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: +debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" +debug@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1068,7 +1751,7 @@ detect-libc@^1.0.2: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -detective@^4.0.0, detective@^4.3.1: +detective@^4.0.0: version "4.7.1" resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e" integrity sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig== @@ -1077,11 +1760,11 @@ detective@^4.0.0, detective@^4.3.1: defined "^1.0.0" detective@^5.0.2: - version "5.1.0" - resolved "https://registry.yarnpkg.com/detective/-/detective-5.1.0.tgz#7a20d89236d7b331ccea65832e7123b5551bb7cb" - integrity sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ== + version "5.2.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" + integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== dependencies: - acorn-node "^1.3.0" + acorn-node "^1.6.1" defined "^1.0.0" minimist "^1.1.1" @@ -1095,12 +1778,12 @@ diffie-hellman@^5.0.0: randombytes "^2.0.0" dom-serializer@0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" - integrity sha1-BzxpdUbOB4DOI75KKOKT5AvDDII= + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== dependencies: - domelementtype "~1.1.1" - entities "~1.1.1" + domelementtype "^1.3.0" + entities "^1.1.1" domain-browser@^1.2.0: version "1.2.0" @@ -1112,15 +1795,10 @@ domain-browser@~1.1.0: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" integrity sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw= -domelementtype@1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.2.1.tgz#578558ef23befac043a1abb0db07635509393479" - integrity sha512-SQVCLFS2E7G5CRCMdn6K9bIhRj1bS6QBWZfF0TUPh4V/BbqrQ619IdSS3/izn0FZ+9l+uODzaZjb08fjOfablA== - -domelementtype@~1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" - integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs= +domelementtype@1, domelementtype@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domhandler@2.3: version "2.3.0" @@ -1149,6 +1827,11 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= +electron-to-chromium@^1.3.127: + version "1.3.129" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.129.tgz#bff32e1840775554aafa301e9dc5002d565aae80" + integrity sha512-puirJsgZnedlFEmRa7WEUIaS8ZgHHn7d7inph+RiapCc0x80hdoDyEEpR9z3aRUSZy4fGxOTOFcxnGmySlrmhA== + elliptic@^6.0.0: version "6.4.1" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" @@ -1181,7 +1864,7 @@ entities@1.0: resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY= -entities@~1.1.1: +entities@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== @@ -1198,25 +1881,15 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -esprima-fb@13001.1001.0-dev-harmony-fb: - version "13001.1001.0-dev-harmony-fb" - resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-13001.1001.0-dev-harmony-fb.tgz#633acdb40d9bd4db8a1c1d68c06a942959fad2b0" - integrity sha1-YzrNtA2b1NuKHB1owGqUKVn60rA= - -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= - esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esprima@~3.1.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= +esutils@^2.0.0, esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= eventemitter2@~0.4.13: version "0.4.14" @@ -1586,18 +2259,7 @@ glob@3.x, "glob@~ 3.2.1": inherits "2" minimatch "0.3" -glob@^5.0.15, glob@~5.0.0: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.5, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: +glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -1609,6 +2271,17 @@ glob@^7.0.5, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" +glob@~5.0.0: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@~7.0.0: version "7.0.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" @@ -1621,6 +2294,11 @@ glob@~7.0.0: once "^1.3.0" path-is-absolute "^1.0.0" +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + globule@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" @@ -1781,46 +2459,14 @@ grunt-legacy-util@~1.1.1: underscore.string "~3.3.4" which "~1.3.0" -grunt-react@^0.12.1: - version "0.12.3" - resolved "https://registry.yarnpkg.com/grunt-react/-/grunt-react-0.12.3.tgz#4c53590127e4a5235c04d1227f3910903af48c16" - integrity sha1-TFNZASfkpSNcBNEifzkQkDr0jBY= - dependencies: - react-tools "^0.13.0" - through "~2.3.6" - grunt-shell-spawn@~0.3.0: - version "0.3.10" - resolved "https://registry.yarnpkg.com/grunt-shell-spawn/-/grunt-shell-spawn-0.3.10.tgz#81bb8d457ec47d3182a87d6308ef845ddfb9488f" - integrity sha1-gbuNRX7EfTGCqH1jCO+EXd+5SI8= + version "0.3.12" + resolved "https://registry.yarnpkg.com/grunt-shell-spawn/-/grunt-shell-spawn-0.3.12.tgz#1cc5acd429ae08311d77f691e91eaa2645e1d391" + integrity sha512-TprZct92sQ4M2Q92piaeLsCrx4+gq/ageuxjZsRG6cglKt7x7rGA3YHt8D30+G789v+/pw4l0tDjEyrkMXx2tA== dependencies: grunt ">=0.4.x" - sync-exec "~0.6.2" -grunt@>=0.4.x: - version "1.0.3" - resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.0.3.tgz#b3c99260c51d1b42835766e796527b60f7bba374" - integrity sha512-/JzmZNPfKorlCrrmxWqQO4JVodO+DVd5XX4DkocL/1WlLlKVLE9+SdEIempOAxDhWPysLle6afvn/hg7Ck2k9g== - dependencies: - coffeescript "~1.10.0" - dateformat "~1.0.12" - eventemitter2 "~0.4.13" - exit "~0.1.1" - findup-sync "~0.3.0" - glob "~7.0.0" - grunt-cli "~1.2.0" - grunt-known-options "~1.1.0" - grunt-legacy-log "~2.0.0" - grunt-legacy-util "~1.1.1" - iconv-lite "~0.4.13" - js-yaml "~3.5.2" - minimatch "~3.0.2" - mkdirp "~0.5.1" - nopt "~3.0.6" - path-is-absolute "~1.0.0" - rimraf "~2.6.2" - -grunt@^1.0.4: +grunt@>=0.4.x, grunt@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.0.4.tgz#c799883945a53a3d07622e0737c8f70bfe19eb38" integrity sha512-PYsMOrOC+MsdGEkFVwMaMyc6Ob7pKmq+deg1Sjr+vvMWp35sztfwKE7qoN51V+UEtHsyNuMcGdgMLFkBHvMxHQ== @@ -1977,7 +2623,7 @@ i@0.3.x: resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d" integrity sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0= -iconv-lite@^0.4.4, iconv-lite@^0.4.5, iconv-lite@~0.4.13: +iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -1985,9 +2631,9 @@ iconv-lite@^0.4.4, iconv-lite@^0.4.5, iconv-lite@~0.4.13: safer-buffer ">= 2.1.2 < 3" ieee754@^1.1.4: - version "1.1.12" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" - integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== ignore-walk@^3.0.1: version "3.0.1" @@ -2054,6 +2700,13 @@ insert-module-globals@^7.0.0: undeclared-identifiers "^1.1.2" xtend "^4.0.0" +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" @@ -2090,13 +2743,6 @@ is-buffer@^1.1.0, is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= - dependencies: - builtin-modules "^1.0.0" - is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -2357,11 +3003,16 @@ jasmine-reporters@~1.0.0: mkdirp "~0.3.5" jquery@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.0.tgz#8de513fa0fa4b2c7d2e48a530e26f0596936efdf" - integrity sha512-ggRCXln9zEqv6OqAGXFEcshF5dSBvCkzj6Gm2gzuR5fWawaX8t7cxKVkkygKODrDAzKdoYw3l/e3pm3vlT4IbQ== + version "3.4.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" + integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== -"js-tokens@^3.0.0 || ^4.0.0": +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -2374,13 +3025,15 @@ js-yaml@~3.13.0: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@~3.5.2: - version "3.5.5" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.5.5.tgz#0377c38017cabc7322b0d1fbcd25a491641f2fbe" - integrity sha1-A3fDgBfKvHMisNH7zSWkkWQfL74= - dependencies: - argparse "^1.0.2" - esprima "^2.6.0" +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= jshint@~2.10.2: version "2.10.2" @@ -2422,6 +3075,13 @@ json-stable-stringify@~0.0.0: dependencies: jsonify "~0.0.0" +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -2437,15 +3097,6 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= -jstransform@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/jstransform/-/jstransform-10.1.0.tgz#b4c49bf63f162c108b0348399a8737c713b0a83a" - integrity sha1-tMSb9j8WLBCLA0g5moc3xxOwqDo= - dependencies: - base62 "0.1.1" - esprima-fb "13001.1001.0-dev-harmony-fb" - source-map "0.1.31" - keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -2595,9 +3246,9 @@ markdown@^0.5.0: nopt "~2.1.1" math-random@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" - integrity sha1-izqsWIuKZuSXXjzepn97sylgH6w= + version "1.0.4" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== maxmin@^1.1.0: version "1.1.0" @@ -2765,9 +3416,9 @@ minipass@^2.2.1, minipass@^2.3.4: yallist "^3.0.0" minizlib@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42" - integrity sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg== + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== dependencies: minipass "^2.2.1" @@ -2838,10 +3489,15 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + mute-stream@~0.0.4: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.12.1: version "2.13.2" @@ -2871,11 +3527,11 @@ ncp@1.0.x: integrity sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY= needle@^2.2.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" - integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.1.tgz#d272f2f4034afb9c4c9ab1379aabc17fc85c9388" + integrity sha512-CaLXV3W8Vnbps8ZANqDGz7j4x7Yj1LW4TWF/TQuDfj7Cfx4nAPTvw98qgTevtto1oHDrh3pQkaODbqupXlsWTg== dependencies: - debug "^2.1.2" + debug "^4.1.0" iconv-lite "^0.4.4" sax "^1.2.4" @@ -2903,6 +3559,13 @@ node-pre-gyp@^0.12.0: semver "^5.3.0" tar "^4" +node-releases@^1.1.17: + version "1.1.17" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.17.tgz#71ea4631f0a97d5cd4f65f7d04ecf9072eac711a" + integrity sha512-/SCjetyta1m7YXLgtACZGDYJdCSIBAWorDWkGCGZlydP2Ll7J48l7j/JxNYZ+xsgSPbWfdulVS/aY+GdjUsQ7Q== + dependencies: + semver "^5.3.0" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -2926,12 +3589,12 @@ nopt@~3.0.6: abbrev "1" normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" + resolve "^1.10.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" @@ -2953,14 +3616,14 @@ normalize-url@^3.1.0: integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== npm-bundled@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" - integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== npm-packlist@^1.1.6: - version "1.1.12" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" - integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g== + version "1.4.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" + integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -3109,9 +3772,9 @@ pako@~0.2.0: integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= pako@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.7.tgz#2473439021b57f1516c82f58be7275ad8ef1bb27" - integrity sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ== + version "1.0.10" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" + integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== parents@^1.0.0, parents@^1.0.1: version "1.0.1" @@ -3121,15 +3784,16 @@ parents@^1.0.0, parents@^1.0.1: path-platform "~0.11.15" parse-asn1@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" - integrity sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw== + version "5.1.4" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" + integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" create-hash "^1.1.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" parse-glob@^3.0.4: version "3.0.4" @@ -3185,7 +3849,7 @@ path-key@^2.0.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-parse@^1.0.5: +path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== @@ -3272,7 +3936,7 @@ pretty-bytes@^1.0.0: get-stdin "^4.0.1" meow "^3.1.0" -private@^0.1.6, private@~0.1.5: +private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== @@ -3360,7 +4024,7 @@ punycode@^1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -q@^1.1.2, q@^1.5.1: +q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= @@ -3385,9 +4049,9 @@ randomatic@^3.0.0: math-random "^1.0.1" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" - integrity sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A== + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" @@ -3424,14 +4088,6 @@ react-is@^16.8.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== -react-tools@^0.13.0: - version "0.13.3" - resolved "https://registry.yarnpkg.com/react-tools/-/react-tools-0.13.3.tgz#da6ac7d4d7777a59a5e951cf46e72fd4b6b40a2c" - integrity sha1-2mrH1Nd3elml6VHPRucv1La0Ciw= - dependencies: - commoner "^0.10.0" - jstransform "^10.1.0" - react@^16.8.6: version "16.8.6" resolved "https://registry.yarnpkg.com/react/-/react-16.8.6.tgz#ad6c3a9614fd3a4e9ef51117f54d888da01f2bbe" @@ -3539,16 +4195,6 @@ readme-filename@^1.0.0: resolved "https://registry.yarnpkg.com/readme-filename/-/readme-filename-1.0.0.tgz#08ec2dda26520cd16f3e836d01553f8a108efe5e" integrity sha1-COwt2iZSDNFvPoNtAVU/ihCO/l4= -recast@^0.11.17: - version "0.11.23" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" - integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM= - dependencies: - ast-types "0.9.6" - esprima "~3.1.0" - private "~0.1.5" - source-map "~0.5.0" - redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -3557,6 +4203,25 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" +regenerate-unicode-properties@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz#7b38faa296252376d363558cfbda90c9ce709662" + integrity sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-transform@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.4.tgz#18f6763cf1382c69c36df76c6ce122cc694284fb" + integrity sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A== + dependencies: + private "^0.1.6" + regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" @@ -3572,6 +4237,35 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexp-tree@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.6.tgz#84900fa12fdf428a2ac25f04300382a7c0148479" + integrity sha512-LFrA98Dw/heXqDojz7qKFdygZmFoiVlvE1Zp7Cq2cvF+ZA+03Gmhy0k0PQlsC1jvHPiTUSs+pDHEuSWv6+6D7w== + +regexpu-core@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" + integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.0.2" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" + +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + dependencies: + jsesc "~0.5.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -3628,12 +4322,12 @@ resolve@1.1.7, resolve@~1.1.0: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6, resolve@^1.4.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" - integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== +resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.4.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" + integrity sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA== dependencies: - path-parse "^1.0.5" + path-parse "^1.0.6" responselike@^1.0.2: version "1.0.2" @@ -3657,14 +4351,7 @@ rewire@~2.1.5: resolved "https://registry.yarnpkg.com/rewire/-/rewire-2.1.5.tgz#764599179cae5e393839bf3ad6e0be371ee49d81" integrity sha1-dkWZF5yuXjk4Ob861uC+Nx7knYE= -rimraf@2.x.x, rimraf@^2.6.1, rimraf@~2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== - dependencies: - glob "^7.0.5" - -rimraf@^2.6.2: +rimraf@2.x.x, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -3709,10 +4396,15 @@ scheduler@^0.13.6: loose-envify "^1.1.0" object-assign "^4.1.1" -"semver@2 || 3 || 4 || 5", semver@^5.3.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +semver@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" + integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" @@ -3848,14 +4540,7 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@0.1.31: - version "0.1.31" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.31.tgz#9f704d0d69d9e138a81badf6ebb4fde33d151c61" - integrity sha1-n3BNDWnZ4TioG63267T94z0VHGE= - dependencies: - amdefine ">=0.0.4" - -source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.3: +source-map@^0.5.0, source-map@^0.5.6, source-map@~0.5.3: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -3866,9 +4551,9 @@ source-map@~0.6.1: integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== spdx-correct@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e" - integrity sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ== + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -3887,9 +4572,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2" - integrity sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg== + version "3.0.4" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" + integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -3899,9 +4584,9 @@ split-string@^3.0.1, split-string@^3.0.2: extend-shallow "^3.0.0" sprintf-js@^1.0.3: - version "1.1.1" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" - integrity sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw= + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== sprintf-js@~1.0.2: version "1.0.3" @@ -3922,9 +4607,9 @@ static-extend@^0.1.1: object-copy "^0.1.0" stream-browserify@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" - integrity sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds= + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== dependencies: inherits "~2.0.1" readable-stream "^2.0.2" @@ -4059,11 +4744,6 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -sync-exec@~0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/sync-exec/-/sync-exec-0.6.2.tgz#717d22cc53f0ce1def5594362f3a89a2ebb91105" - integrity sha1-cX0izFPwzh3vVZQ2LzqJouu5EQU= - syntax-error@^1.1.1: version "1.4.0" resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" @@ -4092,7 +4772,7 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -"through@>=2.2.7 <3", through@~2.3.6: +"through@>=2.2.7 <3": version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -4109,6 +4789,11 @@ to-arraybuffer@^1.0.0: resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -4144,6 +4829,11 @@ trim-newlines@^1.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + tty-browserify@0.0.1, tty-browserify@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" @@ -4173,11 +4863,12 @@ umd@^3.0.0: integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== undeclared-identifiers@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz#7d850a98887cff4bd0bf64999c014d08ed6d1acc" - integrity sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ== + version "1.1.3" + resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f" + integrity sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw== dependencies: acorn-node "^1.3.0" + dash-ast "^1.0.0" get-assigned-identifiers "^1.2.0" simple-concat "^1.0.0" xtend "^4.0.1" @@ -4205,6 +4896,29 @@ underscore@~1.4.3: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" integrity sha1-YaajIBBiKvoHljvzJSA88SI51gQ= +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -4309,7 +5023,12 @@ vm-browserify@~0.0.1: dependencies: indexof "0.0.1" -"walkdir@>= 0.0.1", walkdir@~0.0.12: +"walkdir@>= 0.0.1": + version "0.3.2" + resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.3.2.tgz#ac8437a288c295656848ebc19981ebc677a5f590" + integrity sha512-0Twghia4Z5wDGDYWURlhZmI47GvERMCsXIu0QZWVVZyW9ZjpbbZvD9Zy9M6cWiQQRRbAcYajIyKNavaZZDt1Uw== + +walkdir@~0.0.12: version "0.0.12" resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.12.tgz#2f24f1ade64aab1e458591d4442c8868356e9281" integrity sha512-HFhaD4mMWPzFSqhpyDG48KDdrjfn409YQuVW7ckZYhW4sE87mYtWifdB/+73RA7+p4s4K18n5Jfx1kHthE1gBw== From 14f3fde623ad0ca52c890b96a91dca6fd5e4d008 Mon Sep 17 00:00:00 2001 From: Hongarc Date: Thu, 2 May 2019 12:55:09 +0700 Subject: [PATCH 106/359] Remove `@babel/preset-env` --- Gruntfile.js | 2 +- package.json | 1 - yarn.lock | 644 +-------------------------------------------------- 3 files changed, 4 insertions(+), 643 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index f424988d..92babe3e 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -215,7 +215,7 @@ module.exports = function(grunt) { browserify: { options: { transform: [babelify.configure({ - presets: ['@babel/preset-env', '@babel/preset-react'] + presets: ['@babel/preset-react'] })] }, dist: { diff --git a/package.json b/package.json index 3945d4da..316d6208 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,6 @@ }, "devDependencies": { "@babel/core": "^7.4.4", - "@babel/preset-env": "^7.4.4", "@babel/preset-react": "^7.0.0", "babelify": "^10.0.0", "browserify": "^13.0.0", diff --git a/yarn.lock b/yarn.lock index 68bf4337..e0639cbb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -40,21 +40,6 @@ source-map "^0.5.0" trim-right "^1.0.1" -"@babel/helper-annotate-as-pure@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" - integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" - integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.1.0" - "@babel/types" "^7.0.0" - "@babel/helper-builder-react-jsx@^7.3.0": version "7.3.0" resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" @@ -63,32 +48,6 @@ "@babel/types" "^7.3.0" esutils "^2.0.0" -"@babel/helper-call-delegate@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" - integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== - dependencies: - "@babel/helper-hoist-variables" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" - -"@babel/helper-define-map@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz#6969d1f570b46bdc900d1eba8e5d59c48ba2c12a" - integrity sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.4.4" - lodash "^4.17.11" - -"@babel/helper-explode-assignable-expression@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" - integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== - dependencies: - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - "@babel/helper-function-name@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" @@ -105,87 +64,11 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-hoist-variables@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" - integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== - dependencies: - "@babel/types" "^7.4.4" - -"@babel/helper-member-expression-to-functions@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" - integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-module-imports@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" - integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz#96115ea42a2f139e619e98ed46df6019b94414b8" - integrity sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/template" "^7.4.4" - "@babel/types" "^7.4.4" - lodash "^4.17.11" - -"@babel/helper-optimise-call-expression@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" - integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== - dependencies: - "@babel/types" "^7.0.0" - "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== -"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.4.tgz#a47e02bc91fb259d2e6727c2a30013e3ac13c4a2" - integrity sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q== - dependencies: - lodash "^4.17.11" - -"@babel/helper-remap-async-to-generator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" - integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-wrap-function" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27" - integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.0.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" - -"@babel/helper-simple-access@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" - integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== - dependencies: - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - "@babel/helper-split-export-declaration@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" @@ -193,16 +76,6 @@ dependencies: "@babel/types" "^7.4.4" -"@babel/helper-wrap-function@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" - integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.2.0" - "@babel/helpers@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.4.tgz#868b0ef59c1dd4e78744562d5ce1b59c89f2f2a5" @@ -226,62 +99,6 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.4.tgz#5977129431b8fe33471730d255ce8654ae1250b6" integrity sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w== -"@babel/plugin-proposal-async-generator-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" - integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - -"@babel/plugin-proposal-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" - integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - -"@babel/plugin-proposal-object-rest-spread@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz#1ef173fcf24b3e2df92a678f027673b55e7e3005" - integrity sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" - integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - -"@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" - integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" - -"@babel/plugin-syntax-async-generators@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" - integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" - integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" @@ -289,203 +106,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-object-rest-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" - integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" - integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-arrow-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" - integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-async-to-generator@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz#a3f1d01f2f21cadab20b33a82133116f14fb5894" - integrity sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - -"@babel/plugin-transform-block-scoped-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" - integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-block-scoping@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz#c13279fabf6b916661531841a23c4b7dae29646d" - integrity sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.11" - -"@babel/plugin-transform-classes@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz#0ce4094cdafd709721076d3b9c38ad31ca715eb6" - integrity sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.4.4" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.4.4" - "@babel/helper-split-export-declaration" "^7.4.4" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" - integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-destructuring@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz#9d964717829cc9e4b601fc82a26a71a4d8faf20f" - integrity sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" - integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" - -"@babel/plugin-transform-duplicate-keys@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" - integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-exponentiation-operator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" - integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-for-of@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" - integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-function-name@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" - integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" - integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-member-expression-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" - integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-amd@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" - integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-commonjs@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz#0bef4713d30f1d78c2e59b3d6db40e60192cac1e" - integrity sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw== - dependencies: - "@babel/helper-module-transforms" "^7.4.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - -"@babel/plugin-transform-modules-systemjs@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz#dc83c5665b07d6c2a7b224c00ac63659ea36a405" - integrity sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ== - dependencies: - "@babel/helper-hoist-variables" "^7.4.4" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-umd@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" - integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.4.tgz#5611d96d987dfc4a3a81c4383bb173361037d68d" - integrity sha512-Ki+Y9nXBlKfhD+LXaRS7v95TtTGYRAf9Y1rTDiE75zf8YQz4GDaWRXosMfJBXxnk88mGFjWdCRIeqDbon7spYA== - dependencies: - regexp-tree "^0.1.0" - -"@babel/plugin-transform-new-target@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" - integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-object-super@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" - integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - -"@babel/plugin-transform-parameters@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" - integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== - dependencies: - "@babel/helper-call-delegate" "^7.4.4" - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-property-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" - integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-react-display-name@^7.0.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" @@ -518,120 +138,6 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-jsx" "^7.2.0" -"@babel/plugin-transform-regenerator@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.4.tgz#5b4da4df79391895fca9e28f99e87e22cfc02072" - integrity sha512-Zz3w+pX1SI0KMIiqshFZkwnVGUhDZzpX2vtPzfJBKQQq8WsP/Xy9DNdELWivxcKOCX/Pywge4SiEaPaLtoDT4g== - dependencies: - regenerator-transform "^0.13.4" - -"@babel/plugin-transform-reserved-words@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" - integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-shorthand-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" - integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-spread@^7.2.0": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" - integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-sticky-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" - integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - -"@babel/plugin-transform-template-literals@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" - integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-typeof-symbol@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" - integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-unicode-regex@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" - integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.5.4" - -"@babel/preset-env@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.4.tgz#b6f6825bfb27b3e1394ca3de4f926482722c1d6f" - integrity sha512-FU1H+ACWqZZqfw1x2G1tgtSSYSfxJLkpaUQL37CenULFARDo+h4xJoVHzRoHbK+85ViLciuI7ME4WTIhFRBBlw== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.2.0" - "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.4.4" - "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-syntax-async-generators" "^7.2.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.4.4" - "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.4.4" - "@babel/plugin-transform-classes" "^7.4.4" - "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/plugin-transform-duplicate-keys" "^7.2.0" - "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.4.4" - "@babel/plugin-transform-function-name" "^7.4.4" - "@babel/plugin-transform-literals" "^7.2.0" - "@babel/plugin-transform-member-expression-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.2.0" - "@babel/plugin-transform-modules-commonjs" "^7.4.4" - "@babel/plugin-transform-modules-systemjs" "^7.4.4" - "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.4" - "@babel/plugin-transform-new-target" "^7.4.4" - "@babel/plugin-transform-object-super" "^7.2.0" - "@babel/plugin-transform-parameters" "^7.4.4" - "@babel/plugin-transform-property-literals" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.4.4" - "@babel/plugin-transform-reserved-words" "^7.2.0" - "@babel/plugin-transform-shorthand-properties" "^7.2.0" - "@babel/plugin-transform-spread" "^7.2.0" - "@babel/plugin-transform-sticky-regex" "^7.2.0" - "@babel/plugin-transform-template-literals" "^7.4.4" - "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.4.4" - "@babel/types" "^7.4.4" - browserslist "^4.5.2" - core-js-compat "^3.0.0" - invariant "^2.2.2" - js-levenshtein "^1.1.3" - semver "^5.5.0" - "@babel/preset-react@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" @@ -652,7 +158,7 @@ "@babel/parser" "^7.4.4" "@babel/types" "^7.4.4" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4": +"@babel/traverse@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.4.tgz#0776f038f6d78361860b6823887d4f3937133fe8" integrity sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A== @@ -667,7 +173,7 @@ globals "^11.1.0" lodash "^4.17.11" -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4": +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== @@ -1193,15 +699,6 @@ browserify@^16.0.0, browserify@^16.1.0: vm-browserify "^1.0.0" xtend "^4.0.0" -browserslist@^4.5.2, browserslist@^4.5.4: - version "4.5.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.5.6.tgz#ea42e8581ca2513fa7f371d4dd66da763938163d" - integrity sha512-o/hPOtbU9oX507lIqon+UvPYqpx3mHc8cV3QemSBTXwkG8gSQSK6UKvXcE/DcleU3+A59XTUHyCvZ5qGy8xVAg== - dependencies: - caniuse-lite "^1.0.30000963" - electron-to-chromium "^1.3.127" - node-releases "^1.1.17" - buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -1285,11 +782,6 @@ camelcase@^4.1.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -caniuse-lite@^1.0.30000963: - version "1.0.30000963" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000963.tgz#5be481d5292f22aff5ee0db4a6c049b65b5798b1" - integrity sha512-n4HUiullc7Lw0LyzpeLa2ffP8KxFBGdxqD/8G3bSL6oB758hZ2UE2CVK+tQN958tJIi0/tfpjAc67aAtoHgnrQ== - chalk@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -1528,26 +1020,6 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.0.1.tgz#bff73ba31ca8687431b9c88f78d3362646fb76f0" - integrity sha512-2pC3e+Ht/1/gD7Sim/sqzvRplMiRnFQVlPpDVaHtY9l7zZP7knamr3VRD6NyGfHd84MrDC0tAM9ulNxYMW0T3g== - dependencies: - browserslist "^4.5.4" - core-js "3.0.1" - core-js-pure "3.0.1" - semver "^6.0.0" - -core-js-pure@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.0.1.tgz#37358fb0d024e6b86d443d794f4e37e949098cbe" - integrity sha512-mSxeQ6IghKW3MoyF4cz19GJ1cMm7761ON+WObSyLfTu/Jn3x7w4NwNFnrZxgl4MTSvYYepVLNuRtlB4loMwJ5g== - -core-js@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.1.tgz#1343182634298f7f38622f95e73f54e48ddf4738" - integrity sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew== - core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" @@ -1827,11 +1299,6 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= -electron-to-chromium@^1.3.127: - version "1.3.129" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.129.tgz#bff32e1840775554aafa301e9dc5002d565aae80" - integrity sha512-puirJsgZnedlFEmRa7WEUIaS8ZgHHn7d7inph+RiapCc0x80hdoDyEEpR9z3aRUSZy4fGxOTOFcxnGmySlrmhA== - elliptic@^6.0.0: version "6.4.1" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" @@ -2700,13 +2167,6 @@ insert-module-globals@^7.0.0: undeclared-identifiers "^1.1.2" xtend "^4.0.0" -invariant@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" @@ -3007,11 +2467,6 @@ jquery@^3.4.0: resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== -js-levenshtein@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -3030,11 +2485,6 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - jshint@~2.10.2: version "2.10.2" resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.10.2.tgz#ed6626c4f8223c98e94aaea62767435427a49a3d" @@ -3559,13 +3009,6 @@ node-pre-gyp@^0.12.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.17: - version "1.1.17" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.17.tgz#71ea4631f0a97d5cd4f65f7d04ecf9072eac711a" - integrity sha512-/SCjetyta1m7YXLgtACZGDYJdCSIBAWorDWkGCGZlydP2Ll7J48l7j/JxNYZ+xsgSPbWfdulVS/aY+GdjUsQ7Q== - dependencies: - semver "^5.3.0" - nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -3936,11 +3379,6 @@ pretty-bytes@^1.0.0: get-stdin "^4.0.1" meow "^3.1.0" -private@^0.1.6: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" @@ -4203,25 +3641,6 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" -regenerate-unicode-properties@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz#7b38faa296252376d363558cfbda90c9ce709662" - integrity sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ== - dependencies: - regenerate "^1.4.0" - -regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== - -regenerator-transform@^0.13.4: - version "0.13.4" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.4.tgz#18f6763cf1382c69c36df76c6ce122cc694284fb" - integrity sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A== - dependencies: - private "^0.1.6" - regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" @@ -4237,35 +3656,6 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp-tree@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.6.tgz#84900fa12fdf428a2ac25f04300382a7c0148479" - integrity sha512-LFrA98Dw/heXqDojz7qKFdygZmFoiVlvE1Zp7Cq2cvF+ZA+03Gmhy0k0PQlsC1jvHPiTUSs+pDHEuSWv6+6D7w== - -regexpu-core@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" - integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.0.2" - regjsgen "^0.5.0" - regjsparser "^0.6.0" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.1.0" - -regjsgen@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" - integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== - -regjsparser@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" - integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== - dependencies: - jsesc "~0.5.0" - remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -4396,16 +3786,11 @@ scheduler@^0.13.6: loose-envify "^1.1.0" object-assign "^4.1.1" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1: version "5.7.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== -semver@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" - integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== - set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -4896,29 +4281,6 @@ underscore@~1.4.3: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" integrity sha1-YaajIBBiKvoHljvzJSA88SI51gQ= -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== - -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== - dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" - -unicode-match-property-value-ecmascript@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" - integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== - -unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" - integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== - union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" From 03d8415f9678433e1c30e7d7c6db6c644de935d3 Mon Sep 17 00:00:00 2001 From: Jan Keromnes Date: Tue, 7 May 2019 19:35:52 +0200 Subject: [PATCH 107/359] Make Gitpod use `yarn grunt` instead of the global `grunt` --- .gitpod.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitpod.yml b/.gitpod.yml index 7b1989a1..fedcbcb2 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -2,8 +2,8 @@ ports: - port: 8000 onOpen: open-preview tasks: -- init: yarn install && yarn global add grunt-cli +- init: yarn install command: > - grunt fastBuild && - printf "\nWelcome to Learn Git Branching\nTo rebuild the app, simply run 'grunt fastBuild' and reload index.html.\n\n" && + yarn grunt fastBuild && + printf "\nWelcome to Learn Git Branching\nTo rebuild the app, simply run 'yarn grunt fastBuild' and reload index.html.\n\n" && python3 -m http.server 8000 2>/dev/null From e879213d3b6047a282c4f71fa33e8dc0538d4282 Mon Sep 17 00:00:00 2001 From: Jan Keromnes Date: Thu, 9 May 2019 07:47:09 +0000 Subject: [PATCH 108/359] Prefix `grunt` with `yarn` in README.md as well --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4086a827..d70e865f 100644 --- a/README.md +++ b/README.md @@ -85,13 +85,13 @@ yarn install git checkout -b newAwesomeFeature vim ./src/js/git/index.js # some changes -grunt fastBuild # skips tests and linting, faster build +yarn grunt fastBuild # skips tests and linting, faster build # after building you can open up your browser to the index.html # file generated and see your changes vim ./src/js/git/index.js # more changes -grunt build # runs tests and lint +yarn grunt build # runs tests and lint git commit -am "My new sweet feature!" git push From 6179ccdb38d8d3dd6dec0e3e7ec91733d1d437b3 Mon Sep 17 00:00:00 2001 From: Jacob Bundgaard Date: Thu, 16 May 2019 16:13:09 +0200 Subject: [PATCH 109/359] Set line height of icons bar icons Fixes #581. --- src/style/main.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/style/main.css b/src/style/main.css index 43a05ba9..827b8fee 100644 --- a/src/style/main.css +++ b/src/style/main.css @@ -497,6 +497,7 @@ div.reactCommandView p.commandLine span.icons i:first-child { p.commandLine span.icons i { opacity: 0; + line-height: 1em; } p.commandLine.inqueue span.icons i.icon-check-empty, From a506d3d90732f102024486a0a9f7d68e381741f3 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Wed, 5 Jun 2019 15:19:21 -0700 Subject: [PATCH 110/359] Resolves #583 -- fix function binding --- src/js/react_views/MainHelperBarView.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/react_views/MainHelperBarView.jsx b/src/js/react_views/MainHelperBarView.jsx index 3b77a38e..1b7bb0f8 100644 --- a/src/js/react_views/MainHelperBarView.jsx +++ b/src/js/react_views/MainHelperBarView.jsx @@ -33,11 +33,11 @@ class MainHelperBarView extends React.Component { /> ); From e69c566835651c234d89707d2037b7fa7beffcec Mon Sep 17 00:00:00 2001 From: Michael Prentice Date: Wed, 5 Jun 2019 18:54:20 -0400 Subject: [PATCH 111/359] feat: make es_ES available from the languages menu rename es_AR to argentino but leave it as the default for Spanish since es_ES is not fully translated Fixes #528 --- src/js/react_views/IntlHelperBarView.jsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/js/react_views/IntlHelperBarView.jsx b/src/js/react_views/IntlHelperBarView.jsx index 4ec0b17c..411019a8 100644 --- a/src/js/react_views/IntlHelperBarView.jsx +++ b/src/js/react_views/IntlHelperBarView.jsx @@ -57,6 +57,12 @@ class IntlHelperBarView extends React.Component{ }, { text: 'español', testID: 'spanish', + onClick: function() { + this.fireCommand('locale es_ES; levels'); + }.bind(this) + }, { + text: 'argentino', + testID: 'argentinian', onClick: function() { this.fireCommand('locale es_AR; levels'); }.bind(this) From 95e4aac5417c3a3595bcf3b9f133921893f23c46 Mon Sep 17 00:00:00 2001 From: Lucian Condrea Date: Sun, 9 Jun 2019 11:51:42 +0200 Subject: [PATCH 112/359] add favicon --- src/style/favicon.ico | Bin 0 -> 15106 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/style/favicon.ico diff --git a/src/style/favicon.ico b/src/style/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..947a3de0d1d51ed6696dd7231f53b57feb62dba6 GIT binary patch literal 15106 zcma)jWmH>T({>U91lK~5;suJkySo%9P>Ne|cMDeBDHMm|6pBMB7HEM|ym)b!;%-Ua z+|Q5i_m`}!oRza>W-@2*nd_Pj002?%|6V`<9pFd|03btM$LVM(<6%=`qb~7ORTN(T zclW;!1OxT;&a=u601#_dRgl&9|9c$b=WQ_ChUjqVdOW2%?LH6PKFYsR3#3nC$|M9u z;UDxxu(BzZ`*UMgRn5oiKQ<@eePrmaZhy;d*jQ}X6=B*1rBlJWZ0~8E$HyF9-D9dO zlBC$8(pB-iF>@Mo84&^Hbf$T2?^7w(IWlAXRoDKpeau8#^e?(IT$uxWrXG$oNZ>cLsDrt-##Y|x z@O}nY&g39e3eE#Sku!@ixC`?8OYQld`RyHO5lC~;4{#Pv7rT2V0oD&YSkBr@_jVac zo6kO9GLx#hkHcQ3((@><DI0(zoV$NFF~%h7&xNH)7$9W6r)fOnRrNKq$M^hQBq3bPG2I1^F{l;1-=# z!<=90CBLD!-uQaL7}XxxeTVzOycELCzKG4;Tx`4KAb*F{ix%$L!oyMaPMw^r3VCz@ zibcNgzCk904c!i(?)l&d9~tst7<;uiOTHj$?~z}8_;NQ#K-=Ob&baSlqV@Xn`;VEk zCqseVxRm$XXl{D&Ch4h3#U+RR{yG7T-~r^;>G|oMRIqgD*No>sPq%#Vs9Y>sFYuzc zoLP_4>R7@`h$&Y$lCa=-ZV;!D!BT;fYDs~saZY`oo!4xRxmw18*01Wm<)$}bv(gJ@ zY^J|v<)V*!hZT3hj-U-oLCI)~N3E`yG`%xH(BZ|OWZD?>R)|_so~@QXit<-cHC|lg z)~hV{Wn$-5lQA zz24!XzT1%^ulThLmEn$;o40KvYtowt;hnukJ3`OkY8xK^P~gj_UfugKOn(wNrn@Dd zz8_=DNI#^qXk;EMJ*PUPfvf8-unqbMxegLM7o@Kfwk2@QEJ~R03!_n*^pF|ebOULD z)b7GK-OFK?W>17zJq=^Zl2`a2O}!<{Ni)@fv(aXk^^35+Au{FUqaWM8doW@u?rRpm8Usw|1#Y~%4<2m3 z=s_<4SAc&~!?>OQ`Yx9o;k|i`4E;wU*mGCs{i}RCyRdObp7qYu30>6;bZU= zAz_DqQ_inqrXmCIy%uR^W2Bz zSK}*S_#e%284zdF+>^1<1R~2n79B=`8QYRjY%M`gX>*1KGcp&e~o7i ze{{h6TJK}HmKo%oR3JbBy zZ!Y4~jzU#B|Ai8p4yyioaimV<=!#!t=D7HFvSwzcK~>CM*SG5g^eimklhCh-Fs`$E z|70ufR$v#c3jQ^Ez7jR5H>>fD7LNPngBO1ao#@kHHZte+g_N+)MjO{pr;|pOA1?k+%|o9iBvY^Ni{)Z zL-26+~QP>Z7w&8m^+J35&HWlxbi zuS;e*Jp>u&fZ`}R1U3uj7f2x-$*+vF@1@l4Y@JR!13W-WEhL(PID;BDRS()k{hmx} zQEPzJJ-)H#S2`jmuNP-B^O7-0M@)S8kDrp3kjQGT(k>BT7knyITuOB8>L$irA19d9 zw%-kKYGAuVpo1@aC2he;xBem;IbQ&n{F|rjjY-H!l@ibe*Y)g_OVC2;9#zp>Sx&}t z^V)I6J8?pD{j4%h38U0TleSWX0AyfhCGO89=7LoU)Pg!oUh z!_N@61~NjUQGUpJJIE~1Ah(8l=7f+`UNJps=;Ha9ihkT&5-LLG3tVnyThXl~fEBAG~J!-p{_49F)<2Desv|=*PameE(Fj*hDZ}AHEYMRh zM(#7n@MbZt77o6}h&v{?928=KIShPmhb6=7D6*$5!~*CFYmTM`V9Cn6uCdN%OngN4 zfeB?m&qYpEr!|B%RtmmGYr7$J#z{Zb9Q?Cvdn0&RWCgMS#Y%u=AR`>$STyOiU3?id zuQ~{z1h#m~599$V6cQ9WJ}^u}0Q##-p8!m*jU2e~B{l3>4Fpgux(i6L=kFI;;D%Hz znN55Gu#Tt;JqdtB222c_iOvGMvyec49v4C^9!xa=8UUhC7{RlA>Y#6NSTa`O(F6cR z*;)Rq=Kl?p4~2&zQyp-4sPEQzfhwbI-XKQ-i*d&P`lTrYT7{*w8@aMy0X5>GmPLKf znZ>5!0q;EYgQgSyH}V2T@c9U7_9y2>$acdR);cCZl59ihkF2hKDF8F{7bA3v;FPZb z6g4x?7aoGLW;dvutQr=V(;@JXcKb8XlM^L0lP?e>k z%;V{zP7p6pf%&b_lZvSPTh66$X&W!)^~hYGptI!?7f1c)MJ&uvh%=U%Z`!>C)XWjT z*z`qs4zQh|;guYkc^Iu5+-lh1~TP$I_qf(t9A zQbJ`^yDv2_fjlg31)5{f);C_Dfxwrx&n7<&N!ei1k;s&Nj(j^uTan+VnMDz9xG;$e zd(^s21?B6_bIhGW&SQB{+J43EvTAfN=9yWu3SSXogc6{~bL^sh#{G8qyPO(n4~h*2 zJ->&UWMza4QoX@gwd5sL7)0_nIc!IU+5hJb82syy9efvIK{PtZEU0Kv;SRYoQ&6P! z<;)xorckoIF2bT?YXP*h@+DwAe+xDJ9eLUi3#VE|=Kd?(T|(WAZvq*Hsvg)1R`7#7 zsBVZBp6&D_zv|rv7_A^Ec2M2Yn~|RYpOtYIeBa(+?$;=O3sL~!@uetMpV9gp#%c4C zwM*0eLyBGvfeBrV!?z0WHFn!fG_kda{n^ws!=L3MLUR=_Q(Dr20*J+K&+fZrl%p1q zO}gELR7iqw^@=61Sum`L-E*Q3>*o=jRmfR_v*QUcVRsL7ki55i6|S741V%NJUCuIB zj5}kT4G6AnJxsa&Mah#(X&5rpCQTyatqlIK+#^d%QQ?rK3&h12CEe%`)4@YDblvYj z8oVhzhnR1k_<;)2Z-wCsFZax?b6+e_;3v$+*ipynY$&&vItjuhtvIn@s^#SG)a&w6 zF7GWs4Kdt+WUen$8z0CBS$MRkP3#rle&J3vd{^r;N_$#lY|1@nO`8qp11{9sucsTb z^77Y@oNt^kL8-hy5LUP`D%_pt8&>C;U%FqGzHSOV_)`184_x5ad|vlsi#T240S)S_ z$^9A2egi2}JSJaJWO-YwFG$C=ep~AYpE(rIzF_8kxhA>;5U)e)&y=%z5 z6c?Lo&+8tRpr;(bbJJ9r|03JK4GGTy7Jo(12RA^35!ILMzYNDW%F;OS6t)8L-rhGM zW{KH{QeE(`cM5EIBIZ4`IMO75AN?#)rRTH!r)j29wHM&;e;`nfa3#%CzN@ARZCbgP zs}9`J@RoR zP5E}dm9g%^3*{2&@QH!FEmUKFuG>8u9v~0MhOEU!RJD{gq=>C@Rh8mdr0pk7ubach zqGItINic0u%x=M5aH8~&%ZBf$*&%#Hzrdf#drH2Wn5Q57bQqXLEzxCb8I0a#!7aXPfOeo1L|_ck~b6Gw^!z<4DEN^d{A+v_PV!D)ZJHsV&gY)Qh}T9r=x znt%8i`5NcO(CyaV+2x(&U5GrnYg(^)?{S<v`epDi^3 zte9FV6BWA1_6%iTl=(jc3Ac3#PBJ5oUHpm>y^p9#P|CCr0>IzJ$E2pvAuinkaMV0R z_z+K5IQX;^bL6YcViO~w6YxJhdf`*VxS*AS-Qs-MGS zk@qsPqA541&0gW;IP5LtOgfs*(EkYiz0i53)rDqP7HSj~#er?dN#*TyR8@-TFiIBB9H{iia)91LRi!5OXJl)kB?YT_PU!JMUx|tb$kn##OrpV zdM0eHiV6gL`c5kTrN+ehk*yse{t(n zY(ZM4I7wkAmt1ak!MooorOJ=`k|Y^{?GtG>si~|>2|KtB&!XI4;N?Gp@l2lhl0vs7 z?{Vo`vaVxxg5RiT&Ybk5#`!KkL@%<@P<}qM_aO zL3K6x*Iy@p1Uu#BookIb!oH>hetUbwK zqH{g&dblJVzROYvByEj05B>I&En{eHkaNT~7TmJAOncJJsIoXJmlMxn(2U#MWv|j+ z;$Z7uf7?N3V8~Gd^r9*Gn`b!H@UnigDrWWLHe?!|BL3v(a2X606jMDVvL)oz1guzA zi=~8Kg-~)uwV%vozhCcSsSezg(mPZSf-=A9)Q!tI!^6ure&`b0$jdVHNZ zptPM8*gHt&d$~I7z%V7 zMHjY8J#|2jl=(T)@yn3ly}q*jBK znsl!dJ8iS+3eNiTAd6 zQtarYZwM%(QlqwvTdnx9fX!x`+Od+Udi#jMp#nzX0C6hjBRqem06pr%_4wlJs6r%{ zbs;(+Rhd1jGv+g)GxCA4?Ko(^q51n-(>d!bmwzE28;1I$WIBF>zEgBko|#xG8&{{n z;2hCM$ee7}RH{p0i^UnIQ&rUgwk_Ao?>Xw@4fBvq;&dDRK|TLWEV|zp`$Ye^Tsvy` z2WfPZ>z?>>#tehDaQMIuQ7rPggAGuG z)w2_ymkI&;`ycp#3XNmtek1Cc`Ab8+?LD1m2#&!ugIFEu?Qdfx5rZt1!>KRi-tZ`U z#?khymZacCJ3Sug`^o+OqYCSn^DF76|6AF7|ivn@_7K#q$$_qS3%xR51l?r z^GkvEeO~=SVYwJ)k0RHd55R+tm^a}HHC-FzI;WwGOmR$Qw!?xF893`#uSgS$vQ1Nd z@-HZoG!Ot|@f59M3uiX367aYTJUyH?m?O_VH)8OeSm-Ep< zU!8ilTfKh5z470UoRVf(A%gd7Z&uvJ;GX-K91E+xi=LDhd1uL%DO6D8} z*W=9OgPLO?a*8p%s9``Q_YIN4>WWUibACUi%(h(H_rr>i6b{%^8cB8N0d2Y3L^M-c zJ$hTMGy|O5oyNBk$Tq5^VHE#H4@NYWmwbQo@Sfw8%9dd;*>iRGI;LaFmNd)r2lXhW z$e@!Zz#at0dMo_G8WhW9@nb#dHtX1fF7TH2rOK9zD;v?yU%&OoL-_ycxli zKfTCjpA5^}mu1&CztIvSQ%#qO|H$6YwWDDrhHP5@-WUJLP7Hhbr_yIGhq*=rV2R(T z`<`WI>^KDtKp>s&Vsv+`2x84v+DsWz2MxUG2w`$iFyRibVgxu73Sm?2PTj-=W*2f! z8yMdm$7bk<4kwxIVc~w;O{)@TNq%qR>zvu{5jxX0QbEB%*j5XPUW_TD)z*@=31#3T zbs2~Kzj1~SVv^dOC|I{Nyo;aG^CTWYKLb>Uxj*9ne9wnQJvF$$K)1aU^cvZ?vEYAm z)65O1US1VRV{}PGJrxKN zin3fPCY{F92W&+uHEyEzn#?|U1X#TGP*N;typ^tx1n*imb)m zpnK%5)0S?}`m?(dilVJ{6sShal`qG`y^4y7Zo9ww!Ta3tXxLx)2zQ;FNxr&$eowo9 z4^>q|1s}s!Jc(lRLv$$zTbsdsQ;C!jvceMV6LjOBOQMx1DHH&}e4;>+dmev~xe?~Bd=cYfA37i~g+Zxb2VWfpjM@~*PJd@W)L7AC9 zxx3*?rG~RB9pZY4Vx9O2%`yD3%|?NU)(hv&MBj8-a1{27jh^uLJ5hGH<>cd~E$N88 z#KJ#M5+Os+JD#y%szl&Uf=RoNav%)qXL<89nVj?VSFg~YJv>3REayS|t*ZH&`MUWA z`NsJx?$W}^?%n5&;V8^ispkE+0`VAUuor?x48&5d^JYw>hKP-EMwvO{j4b$wXqOvS zGB3(V7t4>m^O8Y|#GcHa-2S<}=sUrP1_nUX1yA)eQ~#+ZRbP*5Ve4CWU+R{K(VD=3 zZ(@QVvaW_WfTi~26@PP}|6U87c?I}hogYRqXgrvMKlJKnvb&{Q@IX~n1aG#^J1aFK z{3C%6Ub{1b(+!H^RX&$k<1ZnNUIg;0Q;V2&Ye~F2mZH%{`40Im`5w3YZb2XbBLl9U z&j9ga-@M`O95^4ui``9{i1e#DoeEyo(I?3=^)ATw8u}~q-ZeyInWq*#Xd`3YiRb?3 zqI*0)G1`05X>}m-MJbZ1XUI^K@6{KbLZAG5_el&nH2|cQJ~3Uq#gt&pXZp?bauhYP zfFqTAQrqI2OvXZkZ?s)_+WUV@I;^QRp)s=fZ&NTL9A`|b@=-V<<(pcX<2I=t1`14h zxgb6}>Ie?>?renDt7@*_?1`1XfpPl63^_`I<$u222vE*vDKS#%Rr~t$8R)aT)(Vw) z`Lgq>h+O(#;sNm0dSXIzGJgu$P6;zm`InGxl`HG7@b+%;qq>fj?HrIix?P;6zruP7 zh!&>;@n*dN#v4w8EsaG@w7}hK=^6FjKL~a^9Au!k9CC;3YZqlskDosL!Hi))D77}Yn%ELM zTRTPSsJewMWt-hsCBEtT8$%|QuAM#pyDYb4IJ1ywzFO2f26r1bJ_5U@JK*E0i-^MB zAW^#J@)@InX@`Erap1p2;V6DZix!wwL{Ct0x>;ap)K~L-d3oh>ou)~q@A6=g$5=8MGCGnHI-qhx zfe`Cr^f7KslA+||N1k1X202cr>3S*w=oCvC-HfEjBT1$)Zvw`i0oWb58>!y7um3ht zTm)CZ;|}JW^Zjk?bbK&4G?s5psy)4XRWTdJUa}(nrr_mK(S2-pI^osY?P`fypq(Vm#RarN-&Ilk~GtLGx1CwWN{%Ho9)p$ba2sD|%I)KwD5qMAko-165 zKA797@7a@=$M5QliGfW~;%)()RDT9lndP_6_;(dI!tsKmv_5Hu!xG=lNr>Ogh`lP9 z>o#UU4>Jcuuj10>X@iL**abi$M5bJBEkH$(oRZB@30)3avIRt%?dxQ?p<72;K-aZb zW)kw05F62Pr@QWPu2FtS(QWB7${aQKBe{=eZa<-w-7)`Uc8nk;Sl0o>8Ol-QOFLx% zpOC|q_|b{{T1G{-r<28llh0eI3g817hmV4{mcfc>`(f8;zdfwG)4rMh1Dj2GKg;hY z6fgL0w`sr?ZsD!ZW~CI;a+QknMoeT5H-t*^jbF`kDc8SA;_7g_wa00JyV}y+!k}^j zyyy8$t)$xIm^S4o{8y<5!=mLtOJm|@xzc<+xG}9Ls(QV1iz+;4(|AiF4IsqNn}abP zlHUq-T}2r2FD~^pb!IF?elz-Rqr}_|_gQQBc3sy3jH0BP(7trWhZw7l{=)x_3sR;l z5dJikZ6-F!XXXT%d}gKFlK?>Ros%1yzqyM8&M=v5$){q2%(fC`-NeOL9w}e$ksAMn z6EZA38m@iPq^0?a8&|hxx=xYi#B&gzsC7KRrcKvft0csRRmQ(a)L?{sVB~Y&(rm(T zosJ}8dcsJ3?=6o1nT43p33@27=pH2q9Px@2{7o}s5#kUlm_ptkHs-Q;b>3Lh@cO=+ zKKvG6|Ic<#j@e6`XF?ijO{7&`TacOKlw|g*ls3-?+4mK(V-ken{ij+W905tk4F~y0 zt&Yg(WwZvR!Z{+dYhz)XsUc-X^}7{Si}_ymgNRoYG^0RGt&WLP)5R%yhd$A z#-I2voXt<`s>-1VLn4kRj8OMORW&UF1fZ-w`P;3J5W0o|a{kq@o}qo?oJ!k0ASalJ z_34D^Y|b#m!P~3G)*HYV^~TRL)&(H<8!-=P%g;Q>ebY}MTTSLKjUBZHBiE8t6djCI z%a(qyGA-Y#f*G5I)vAUYQL)d`M(}xiV|Sk`Dk>~It){}-Zhu#GiB0i|0n8ybY=n%% z)S>q0k85Q=N8jm@#r!SeYIu`CgW_0o_38z@-wHBmYLt9mnrkF;AMfbPEsjjd8IH}P zeHP?o&W`2e7N)JTzR{|fnM-5uiZ2s1I*Rj40@O<^^KW-cf7$b+ay>Hm{4-0zlrjL; z%_i}_9DRGH^~~b+Er)I+nGwksuSoYb&f8tZmcMQvBw4;3)C3r(Z`Y3F1?tNU_NN09 z?;TNeG>Xb~9ef)eqRaMFRzsqz``o%3ok?%yn92x;$2F{x>_Gx^OrSkXL!GVLuYr#Z z3-A`^6vSS&Mwg&KUyZ)~5K>lPE(ln;5w`b;8Y!InY+$Zig+QVm1`@<;%4 z04Gad*J83t`@tzM?%O!F*DJ0djFJlW!qY?|H*+UGe*zRQc7;{Ft`NvGAe3vP zvrZKZQv_2Z{;FuqH~wBy8eDdyT1K4U_i?Cm!c?DSuQ;AoeBNAX#IPe`Tt?&=d+6@n z@oSTxC==9il|?CJ+lCCo0<`arH{I{llSZgK!mBA`@(5kp@kNg10Ym7_ChvhpUq*kI z%zO*%l`IJV^+0l(EXX4%%uA{HDPOCIx;{Q|L%0QMipl2itBQ1b8BlAm8jAzBlM;JM zyN+pGMiqHvVNnzO-M%)$@LU=h`UI)1Sj=R%y8 zl|t$Pk1%bc^*&sgCljHlmb}}rA4DSy($tpCrC=vs&^5D>eV}jZC`~H@y6nIcPhQ(Q|u>gS2&~GWQ zXd>yyd{S+pN4vuX0X}?&=j4=}W7%;Blkn!<@V(d3Gi=h+x1Ouidc8zPNGI2^`%H|p%#*!wbAazh72 zW#Zf7c?DDgPv6{ZOE{0iZr#^?{B}O=p~becKWid?O$%Vlu%T&RR2n>tSvvurk!#XA zROEL|B`jx18w⪻`aroLxXrfDRzq zhV_e7MvqXo#~mr?T@XwFTvgp@7UstXEPm>k;UI?USeV6`<4E*Nf@A###Qk=_3KuvS z!Ch_j{kvctO{!I{k6Q!Z zzu8hbXO2^e-nS$SiTgbhQ-U;fv8AmdD(X4qp(iD<zPfM z6u9)j;4c_q-kN}hAU}TKWIG5hK@4-HB7(WzkK2JK+szr^a1&-|wqLetSS$rl<|ep6 zaN|r6Po&hUp_+hhWY-vq(L-9*Z~@#VMXx>fGO7S3ptR2;l2KJ;=)Sj&KE|>b=`3%e zjmW_QEJosf_yA}-9HS1prFBpPRD;5-LB*0aCJlD!lWDJYWKp^1GR>ImPx0h1-=g5X zuf)IH7pCC1+CjfvPQmXk+lkdweSAdaG(Mz69}Vv|(Z_+Rl;}F-mozQ`o9IIB&vlgK z_&6^Be@2|DQHfRXnTIs%5LaLmL~6j^UTjVN-~0yJ~f0BsG6N8FlCMcvm%T>0HF81Uh?&HOIxPp~0r zgQ= zXc(!sS8%ku1pWz}{)LHj6~_adCifY7)2X+dW&5C}4#;d|=G*tpNH|)%9oZhrM&Q zB`jnoCR=rz)S{ITRPT4bbc<3iAq+(#=)8M99}1}Isfu2+ltbOuq zS7#0_z)r?BRKg`}!psgJP-yQ*I#LKRjR6S0azdq#hr*!!Gvk7wbCc;z3wfMR4nO8B z5;*$90q|Tw%G*01VHDMXdO;f&P{L*kQ>RTmAz}VU zm{1XZqC4GOzjwjA#+I{<;Gp-w$}bK#Nyf}2(vpr~ipbjggJo(k@aR%G&>mIm%Ubz$ zF?c3}lBjKjxf$Td=@wS$T=u8oLOlo{!^e$)c@9=vtx-v)lgIQ0?N;&rxYxxnXGeu6 zBwfEbQ&74*=@bokbVZ)`quP34_XGF3LM92UfUHFN2ckaz`{ZhA--@T|`jpTm+VfAn zJS;V1fKi!G9L{0<6TKyZYL$)1mcar#=yhnqanD`S&L^Hb(4Ws;a%Y?d4^DxPjB$+h zGi~G2%^37XBxC&)vBVpAZi@ENbgNh&!>S!Tvf9Gzc6f@!0R@phbWmGF%K^r_%c_Q@ zO^#M5y>2c|;=33uGLNuG02?zh+zsKSgJKi)Ks*)b!Wt^2xA;nifemRlCj3l`4>#m| z=!+N46YpO^EaG9W!tDI7X?T9~{lIBw#I{LRN;@lhUDNw7}4TlLNNL#$!;iE_J@P=MnT5tjQr2xG13 z0}AKTU@w;o1-k~8JXK&ZK z&y`&m1?yJb+$MT$Q-UYgFhY9IhFTEKa&EJ_tRD-Cx zKv_WVGoycQL*x6(Yn3zoJy~o8dM_c0o~`Rz;lRc@-(Kpy{51J%b>#bh-+B%2nXHl; z-q`&u-5{u<{G^b_(Bkqu3Yl{}kZGR3E_>~#MuEawV3u7NO#~poE_#1wLaO3BtEOu^ z>`aJrk_@rG$-pCLw0Sk+<1~3=YEay72S4Ln5C#^VG+^56M)A{`bZe`TBk!AjZi6s- z@xTRcI_9l+zj|Z=k>KQq&RdgzgVvrA)z5&>nV^%43Ara43E+(|gXti65OHXg`+X_b zML<+Wod&S+%{?P`lK?s{an*jd3cL9+;|s^2AIlq0B+NRfsgU@Dbn5$Xc}A z8+5x9DIjF#q7vu*#Cc7_491y8XNvxm=7?80$#llqKZ-EU*S?@kj+?LP0R@1c5nKN* zpf0=CwEoTr3lWSdwcwhH+dl-t8_2)a!lIhz>u3B&?c2-5i+oAPh{E}73%t4~6%4H6 zU@}dCHNrjv;+^M*Ul;k&4@CowQJ5VP0+^yUlJ!9%efEi`#xux3fi;I+p zA|#o=WUAu}%9yh4>;O&BK8t^&QOo?#%>vx;b-$_#nr4H5gK4m#(Ec%r$Y-Lmc{Ruwj53 z^Y6Q0)8X%>mnnT1ATN;1(kyp?fo*UAGf)%Dv<-%1hVEOwww`+*} z9q&~Ws#d|s9iI4?$~@KS-!L^#3y=_acxeAFTQP5q^CKnj`|%N8YEsHt(wkK$Gxjt^ z$?oPY8$AMTwy?c1ZW|D}4WYoGsQn6JFIA=jwkneWi+x-zPVABIVgULvKr_xjjl~lV zft-D>q}OiNAhq+}veDo$wS*jl^Rub=<=+)2YK zY?jZPrPERA_CxvIcc$m~H2wjXhZFyB1H5A(n^xBjozp)Vr0LHH8i&{XrZq&$xkuBFZ)z9rnJUGrd4(aE{0*sjbA!2YvA^OL^#|M~A)LEvL;9+{VTij|Ob?sm z`{|LG(W~eM!uRa!K{xrepTmOJvQbc<+Q=KyNyTaYsunkffq{QT8+Gec_B4FOh958n zba59Ew%OqI3UpHJ;Ae?r3Lf(J1325MXl}+UE6NrcOR{Rbf89#ZxMyyHK4w9esK>=^ zC_jTKv<5H*yZNVH=9+!{^aWCGDC`>KXJ3S(wtd?bQ+!cUvWW4Vuz_Z68|+<*;;*f z*84zeW*wgYmr^`)9;BZ57 z1p|w~daYECGc;_XZul?D>~8$!BY_fBuLW?1OqEJ$0+rWf+V15yNdOI)3phureyzXO zWqWxx_4uo7`cEB>;7B`Yx%TMs9lc-qyRknMnBCe>Mw@a1o)dQNS}T2ujI z2`XP^i7AY_Tb8lgYjZvCKi}&kz0(di*s%CFtZ5piz~w&nR9U6{=v;D=R91Gx(0vMR zn%%)Lk-aCg$P3p<&D5U}DZm&FFrxW{s?V&M5Fe`v{h5dHAZ4Y^n@%0{ZbqPhk1gg` z_Yeh-v(M?cX03!13i+7n3>3L`$Ws)&d=tyxp`L;f$4|-JQ(~az`$7`2Wrq!mywfsr zsiCY|?7E>t#V6J|O2+(Q(KbOdy5vF{O_A`2_^roDp+B+>20<9cUxvYg&ACmuJ zwN>*Cn@}CXOzX?6aEjaG`#J1wM11#Pq4lW;28!W-e%<{f6d**X`-{Z>CF(dBRzCfw z;#eKaEVS|G$pS^`h38zl|Z9DOYqhQa=w%?)=#~{o*0Pk~4 ztY3CP|JbGPweKdTz@g>45bE6lJDz^*n2*kg->3ay_*hSG*VUMT7>u=1NVS)F$xws` zWBAA-wFOVV-0{#DG7pLqM!qX!VkCw^fg7}rvy=U3Fd2p9AYSmjAZHUh!*|1oB)ZaB zD{dQmjq!s1ev6D@R3{Fz(%<@dBGmq_?ls@udxDQ=e(A8?=@W`bFZtKvFpCAWwd$GR zoQ-)d8*XO=t55_dpNs)flMu|}?sRUg1Uo2nmh8}E?MVAy7XB^S);>!^jBrZd8CDVY zsE}IVQoD~xKO%)8+?-Y1R+lFbm+!gmhkA4}`44Z~^B)u!Rv*kh;NZ-R6z|+QtiHo2 zRhJREX+2m8!s&mza!OBB)_xF)#Z$2T9ChH49%$?@zfM^$s2sEIrwFbSqj)mRlPbbR zQ{}C`VxdbKwYrM##H#hRPhwBjfvw}6^dTNeFxPN-YDEi$9CBLw z2gdMLwoGA_0=W5KrG3p(%q1~u5}`r>{ZougKDHlSZ$LFnEWF^ikQl3b7ia8BJOwWI zRLS_RtPcvuZ|>A6uzlxw4(feDj*lgAIDy2}ZIRbB|E@EDI>ic5Rn$`WDrXV#e{Da~ A6aWAK literal 0 HcmV?d00001 From 6e39a45adf55d58979c506f04878ae385e3f2f24 Mon Sep 17 00:00:00 2001 From: Lucian Condrea Date: Sun, 9 Jun 2019 11:55:08 +0200 Subject: [PATCH 113/359] add link with icon in head --- src/template.index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/src/template.index.html b/src/template.index.html index da7fa6bc..a709829a 100644 --- a/src/template.index.html +++ b/src/template.index.html @@ -17,6 +17,7 @@ + From d06fa0185d50526776bd8ba54b3f2b708e82016b Mon Sep 17 00:00:00 2001 From: hisbvdis Date: Tue, 11 Jun 2019 10:06:35 +0300 Subject: [PATCH 114/359] rampup relativeRefs translate corrections --- src/levels/rampup/relativeRefs.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/levels/rampup/relativeRefs.js b/src/levels/rampup/relativeRefs.js index b008011b..8f55dcd5 100644 --- a/src/levels/rampup/relativeRefs.js +++ b/src/levels/rampup/relativeRefs.js @@ -743,11 +743,11 @@ exports.level = { "beforeMarkdowns": [ "Для начала рассмотрим оператор каретки (^). Когда мы добавляем его к имени ссылки, Git воспринимает это как указание найти родителя указанного коммита.", "", - "Так что `master^` означает \"первый предок ветки `master`\".", + "Так что `master^` означает \"первый родитель ветки `master`\".", "", - "`master^^` означает предок предка ветки `master`", + "`master^^` означает роид ветки `master`", "", - "Получим предка ветки `master` на практике" + "Давайте переключимся на коммит Выше `master`" ], "afterMarkdowns": [ "Опачки! Готово. Сильно проще, чем поиск и указание хеша." From 89ebecf5ceb855e1075562f89e36abd352f7fbe1 Mon Sep 17 00:00:00 2001 From: hisbvdis Date: Tue, 11 Jun 2019 22:03:15 +0300 Subject: [PATCH 115/359] Small mistake in previous commit --- src/levels/rampup/relativeRefs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/rampup/relativeRefs.js b/src/levels/rampup/relativeRefs.js index 8f55dcd5..0a8b3da8 100644 --- a/src/levels/rampup/relativeRefs.js +++ b/src/levels/rampup/relativeRefs.js @@ -745,7 +745,7 @@ exports.level = { "", "Так что `master^` означает \"первый родитель ветки `master`\".", "", - "`master^^` означает роид ветки `master`", + "`master^^` означает прародитель (родитель родителя) `master`", "", "Давайте переключимся на коммит Выше `master`" ], From b25095c2f62fe6fe4addc702cc1252417e67e77f Mon Sep 17 00:00:00 2001 From: wuzh07 Date: Tue, 27 Aug 2019 21:53:02 +0800 Subject: [PATCH 116/359] fixed a typo of fetchRebase.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "工们"->"我们" --- src/levels/remote/fetchRebase.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/remote/fetchRebase.js b/src/levels/remote/fetchRebase.js index f44b2aab..f1d6fdde 100644 --- a/src/levels/remote/fetchRebase.js +++ b/src/levels/remote/fetchRebase.js @@ -947,7 +947,7 @@ exports.level = { "如果我们在 push 之前做 rebase 呢?" ], "afterMarkdowns": [ - "我们用 `git fetch` 更新了本地仓库中的远程分支,然后用 rebase 将工们的工作移动到最新的提交记录下,最后再用 `git push` 推送到远程仓库。" + "我们用 `git fetch` 更新了本地仓库中的远程分支,然后用 rebase 将我们的工作移动到最新的提交记录下,最后再用 `git push` 推送到远程仓库。" ], "command": "git fetch; git rebase o/master; git push", "beforeCommand": "git clone; git fakeTeamwork; git commit" From b281d1d76cbd504e0ea07ee5684a667b82b335a1 Mon Sep 17 00:00:00 2001 From: Lukas Schmid Date: Wed, 4 Sep 2019 16:47:24 +0200 Subject: [PATCH 117/359] Added support for git tag -d and fixed a bug where a duplicate tag name wouldn't show in the error-msg --- src/js/git/commands.js | 33 +++++++++++++++++++++++++++++++++ src/js/git/index.js | 2 +- src/js/visuals/index.js | 19 +++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/js/git/commands.js b/src/js/git/commands.js index 50e93d5a..9861f763 100644 --- a/src/js/git/commands.js +++ b/src/js/git/commands.js @@ -811,8 +811,41 @@ var commandConfig = { tag: { regex: /^git +tag($|\s)/, + options: [ + '-d' + ], execute: function(engine, command) { var generalArgs = command.getGeneralArgs(); + var commandOptions = command.getOptionsMap(); + + if (commandOptions['-d']) { + var tagID = commandOptions['-d']; + var tagToRemove; + + assertIsRef(engine, tagID); + + command.oneArgImpliedHead(tagID); + engine.tagCollection.each(function(tag) { + if(tag.get('id') == tagID){ + tagToRemove = tag; + } + }, true); + + if(tagToRemove == undefined){ + throw new GitError({ + msg: intl.todo( + 'No tag found, nothing to remove' + ) + }); + } + + engine.tagCollection.remove(tagToRemove); + delete engine.refs[tagID]; + + engine.gitVisuals.refreshTree(); + return; + } + if (generalArgs.length === 0) { var tags = engine.getTags(); engine.printTags(tags); diff --git a/src/js/git/index.js b/src/js/git/index.js index 036f9db4..ff7d4f88 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -686,7 +686,7 @@ GitEngine.prototype.validateAndMakeTag = function(id, target) { throw new GitError({ msg: intl.str( 'bad-tag-name', - { tag: name } + { tag: id } ) }); } diff --git a/src/js/visuals/index.js b/src/js/visuals/index.js index 31afd596..668ce91a 100644 --- a/src/js/visuals/index.js +++ b/src/js/visuals/index.js @@ -701,6 +701,25 @@ GitVisuals.prototype.addTagFromEvent = function(tag, collection, index) { } }; +GitVisuals.prototype.removeTag = function(tag, collection, index) { + var action = function() { + var tagToRemove; + this.visTagCollection.each(function(visTag) { + if(visTag.get('tag') == tag){ + tagToRemove = visTag; + } + }, true); + tagToRemove.remove(); + this.removeVisTag(tagToRemove); + }.bind(this); + + if (!this.gitEngine || !this.gitReady) { + this.defer(action); + } else { + action(); + } +}; + GitVisuals.prototype.addTag = function(tag) { var visTag = new VisTag({ tag: tag, From 496579b717261dfebb37d370eedb6c7b86024091 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Wed, 4 Sep 2019 22:02:20 -0700 Subject: [PATCH 118/359] Test coverage for deleting tags, PR #599 --- __tests__/git.spec.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js index e098ce07..1f9a8a09 100644 --- a/__tests__/git.spec.js +++ b/__tests__/git.spec.js @@ -220,6 +220,13 @@ describe('Git', function() { ); }); + it('makes a tag and removes a tag', function() { + expectTreeAsync( + 'git tag v1; git tag -d v1', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' + ); + }); + it('makes a tag on another ref', function() { expectTreeAsync( 'git tag v1 C0', From 8dbc56c42a13a36a9a2aee228d05c1d5a06c2980 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Thu, 12 Sep 2019 10:17:30 -0700 Subject: [PATCH 119/359] remove random file --- assets/emoji_table.rtf | 2523 ---------------------------------------- 1 file changed, 2523 deletions(-) delete mode 100644 assets/emoji_table.rtf diff --git a/assets/emoji_table.rtf b/assets/emoji_table.rtf deleted file mode 100644 index 14ccbdc8..00000000 --- a/assets/emoji_table.rtf +++ /dev/null @@ -1,2523 +0,0 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf210 -{\fonttbl\f0\fnil\fcharset0 AppleColorEmoji;\f1\fnil\fcharset0 Monaco;\f2\fnil\fcharset77 ZapfDingbatsITC; -\f3\fnil\fcharset128 HiraKakuProN-W3;\f4\fnil\fcharset0 LucidaGrande;\f5\fnil\fcharset0 AppleSymbols; -\f6\fnil\fcharset134 STHeitiSC-Light;\f7\fnil\fcharset129 AppleSDGothicNeo-Regular;} -{\colortbl;\red255\green255\blue255;} -\margl1440\margr1440\vieww18700\viewh19820\viewkind0 -\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural - -\f0\fs24 \cf0 \uc0\u55357 \u56833 -\f1 \\ud83d\\ude01 grinning face with smiling eyes\ - -\f0 \uc0\u55357 \u56834 -\f1 \\ud83d\\ude02 face with tears of joy\ - -\f0 \uc0\u55357 \u56835 -\f1 \\ud83d\\ude03 smiling face with open mouth\ - -\f0 \uc0\u55357 \u56836 -\f1 \\ud83d\\ude04 smiling face with open mouth and smiling eyes\ - -\f0 \uc0\u55357 \u56837 -\f1 \\ud83d\\ude05 smiling face with open mouth and cold sweat\ - -\f0 \uc0\u55357 \u56838 -\f1 \\ud83d\\ude06 smiling face with open mouth and tightly-closed eyes\ - -\f0 \uc0\u55357 \u56841 -\f1 \\ud83d\\ude09 winking face\ - -\f0 \uc0\u55357 \u56842 -\f1 \\ud83d\\ude0a smiling face with smiling eyes\ - -\f0 \uc0\u55357 \u56843 -\f1 \\ud83d\\ude0b face savouring delicious food\ - -\f0 \uc0\u55357 \u56844 -\f1 \\ud83d\\ude0c relieved face\ - -\f0 \uc0\u55357 \u56845 -\f1 \\ud83d\\ude0d smiling face with heart-shaped eyes\ - -\f0 \uc0\u55357 \u56847 -\f1 \\ud83d\\ude0f smirking face\ - -\f0 \uc0\u55357 \u56850 -\f1 \\ud83d\\ude12 unamused face\ - -\f0 \uc0\u55357 \u56851 -\f1 \\ud83d\\ude13 face with cold sweat\ - -\f0 \uc0\u55357 \u56852 -\f1 \\ud83d\\ude14 pensive face\ - -\f0 \uc0\u55357 \u56854 -\f1 \\ud83d\\ude16 confounded face\ - -\f0 \uc0\u55357 \u56856 -\f1 \\ud83d\\ude18 face throwing a kiss\ - -\f0 \uc0\u55357 \u56858 -\f1 \\ud83d\\ude1a kissing face with closed eyes\ - -\f0 \uc0\u55357 \u56860 -\f1 \\ud83d\\ude1c face with stuck-out tongue and winking eye\ - -\f0 \uc0\u55357 \u56861 -\f1 \\ud83d\\ude1d face with stuck-out tongue and tightly-closed eyes\ - -\f0 \uc0\u55357 \u56862 -\f1 \\ud83d\\ude1e disappointed face\ - -\f0 \uc0\u55357 \u56864 -\f1 \\ud83d\\ude20 angry face\ - -\f0 \uc0\u55357 \u56865 -\f1 \\ud83d\\ude21 pouting face\ - -\f0 \uc0\u55357 \u56866 -\f1 \\ud83d\\ude22 crying face\ - -\f0 \uc0\u55357 \u56867 -\f1 \\ud83d\\ude23 persevering face\ - -\f0 \uc0\u55357 \u56868 -\f1 \\ud83d\\ude24 face with look of triumph\ - -\f0 \uc0\u55357 \u56869 -\f1 \\ud83d\\ude25 disappointed but relieved face\ - -\f0 \uc0\u55357 \u56872 -\f1 \\ud83d\\ude28 fearful face\ - -\f0 \uc0\u55357 \u56873 -\f1 \\ud83d\\ude29 weary face\ - -\f0 \uc0\u55357 \u56874 -\f1 \\ud83d\\ude2a sleepy face\ - -\f0 \uc0\u55357 \u56875 -\f1 \\ud83d\\ude2b tired face\ - -\f0 \uc0\u55357 \u56877 -\f1 \\ud83d\\ude2d loudly crying face\ - -\f0 \uc0\u55357 \u56880 -\f1 \\ud83d\\ude30 face with open mouth and cold sweat\ - -\f0 \uc0\u55357 \u56881 -\f1 \\ud83d\\ude31 face screaming in fear\ - -\f0 \uc0\u55357 \u56882 -\f1 \\ud83d\\ude32 astonished face\ - -\f0 \uc0\u55357 \u56883 -\f1 \\ud83d\\ude33 flushed face\ - -\f0 \uc0\u55357 \u56885 -\f1 \\ud83d\\ude35 dizzy face\ - -\f0 \uc0\u55357 \u56887 -\f1 \\ud83d\\ude37 face with medical mask\ - -\f0 \uc0\u55357 \u56888 -\f1 \\ud83d\\ude38 grinning cat face with smiling eyes\ - -\f0 \uc0\u55357 \u56889 -\f1 \\ud83d\\ude39 cat face with tears of joy\ - -\f0 \uc0\u55357 \u56890 -\f1 \\ud83d\\ude3a smiling cat face with open mouth\ - -\f0 \uc0\u55357 \u56891 -\f1 \\ud83d\\ude3b smiling cat face with heart-shaped eyes\ - -\f0 \uc0\u55357 \u56892 -\f1 \\ud83d\\ude3c cat face with wry smile\ - -\f0 \uc0\u55357 \u56893 -\f1 \\ud83d\\ude3d kissing cat face with closed eyes\ - -\f0 \uc0\u55357 \u56894 -\f1 \\ud83d\\ude3e pouting cat face\ - -\f0 \uc0\u55357 \u56895 -\f1 \\ud83d\\ude3f crying cat face\ - -\f0 \uc0\u55357 \u56896 -\f1 \\ud83d\\ude40 weary cat face\ - -\f0 \uc0\u55357 \u56901 -\f1 \\ud83d\\ude45 face with no good gesture\ - -\f0 \uc0\u55357 \u56902 -\f1 \\ud83d\\ude46 face with ok gesture\ - -\f0 \uc0\u55357 \u56903 -\f1 \\ud83d\\ude47 person bowing deeply\ - -\f0 \uc0\u55357 \u56904 -\f1 \\ud83d\\ude48 see-no-evil monkey\ - -\f0 \uc0\u55357 \u56905 -\f1 \\ud83d\\ude49 hear-no-evil monkey\ - -\f0 \uc0\u55357 \u56906 -\f1 \\ud83d\\ude4a speak-no-evil monkey\ - -\f0 \uc0\u55357 \u56907 -\f1 \\ud83d\\ude4b happy person raising one hand\ - -\f0 \uc0\u55357 \u56908 -\f1 \\ud83d\\ude4c person raising both hands in celebration\ - -\f0 \uc0\u55357 \u56909 -\f1 \\ud83d\\ude4d person frowning\ - -\f0 \uc0\u55357 \u56910 -\f1 \\ud83d\\ude4e person with pouting face\ - -\f0 \uc0\u55357 \u56911 -\f1 \\ud83d\\ude4f person with folded hands\ - -\f2 \uc0\u9986 -\f1 \\u2702 black scissors\ - -\f0 \uc0\u9989 -\f1 \\u2705 white heavy check mark\ - -\f2 \uc0\u9992 -\f1 \\u2708 airplane\ - -\f2 \uc0\u9993 -\f1 \\u2709 envelope\ - -\f0 \uc0\u9994 -\f1 \\u270a raised fist\ - -\f0 \uc0\u9995 -\f1 \\u270b raised hand\ - -\f2 \uc0\u9996 -\f1 \\u270c victory hand\ - -\f2 \uc0\u9999 -\f1 \\u270f pencil\ - -\f2 \uc0\u10002 -\f1 \\u2712 black nib\ - -\f2 \uc0\u10004 -\f1 \\u2714 heavy check mark\ - -\f2 \uc0\u10006 -\f1 \\u2716 heavy multiplication x\ - -\f0 \uc0\u10024 -\f1 \\u2728 sparkles\ - -\f2 \uc0\u10035 -\f1 \\u2733 eight spoked asterisk\ - -\f2 \uc0\u10036 -\f1 \\u2734 eight pointed black star\ - -\f2 \uc0\u10052 -\f1 \\u2744 snowflake\ - -\f2 \uc0\u10055 -\f1 \\u2747 sparkle\ - -\f0 \uc0\u10060 -\f1 \\u274c cross mark\ - -\f0 \uc0\u10062 -\f1 \\u274e negative squared cross mark\ - -\f0 \uc0\u10067 -\f1 \\u2753 black question mark ornament\ - -\f0 \uc0\u10068 -\f1 \\u2754 white question mark ornament\ - -\f0 \uc0\u10069 -\f1 \\u2755 white exclamation mark ornament\ - -\f0 \uc0\u10071 -\f1 \\u2757 heavy exclamation mark symbol\ - -\f2 \uc0\u10084 -\f1 \\u2764 heavy black heart\ - -\f0 \uc0\u10133 -\f1 \\u2795 heavy plus sign\ - -\f0 \uc0\u10134 -\f1 \\u2796 heavy minus sign\ - -\f0 \uc0\u10135 -\f1 \\u2797 heavy division sign\ - -\f2 \uc0\u10145 -\f1 \\u27a1 black rightwards arrow\ - -\f0 \uc0\u10160 -\f1 \\u27b0 curly loop\ - -\f0 \uc0\u55357 \u56960 -\f1 \\ud83d\\ude80 rocket\ - -\f0 \uc0\u55357 \u56963 -\f1 \\ud83d\\ude83 railway car\ - -\f0 \uc0\u55357 \u56964 -\f1 \\ud83d\\ude84 high-speed train\ - -\f0 \uc0\u55357 \u56965 -\f1 \\ud83d\\ude85 high-speed train with bullet nose\ - -\f0 \uc0\u55357 \u56967 -\f1 \\ud83d\\ude87 metro\ - -\f0 \uc0\u55357 \u56969 -\f1 \\ud83d\\ude89 station\ - -\f0 \uc0\u55357 \u56972 -\f1 \\ud83d\\ude8c bus\ - -\f0 \uc0\u55357 \u56975 -\f1 \\ud83d\\ude8f bus stop\ - -\f0 \uc0\u55357 \u56977 -\f1 \\ud83d\\ude91 ambulance\ - -\f0 \uc0\u55357 \u56978 -\f1 \\ud83d\\ude92 fire engine\ - -\f0 \uc0\u55357 \u56979 -\f1 \\ud83d\\ude93 police car\ - -\f0 \uc0\u55357 \u56981 -\f1 \\ud83d\\ude95 taxi\ - -\f0 \uc0\u55357 \u56983 -\f1 \\ud83d\\ude97 automobile\ - -\f0 \uc0\u55357 \u56985 -\f1 \\ud83d\\ude99 recreational vehicle\ - -\f0 \uc0\u55357 \u56986 -\f1 \\ud83d\\ude9a delivery truck\ - -\f0 \uc0\u55357 \u56994 -\f1 \\ud83d\\udea2 ship\ - -\f0 \uc0\u55357 \u56996 -\f1 \\ud83d\\udea4 speedboat\ - -\f0 \uc0\u55357 \u56997 -\f1 \\ud83d\\udea5 horizontal traffic light\ - -\f0 \uc0\u55357 \u56999 -\f1 \\ud83d\\udea7 construction sign\ - -\f0 \uc0\u55357 \u57000 -\f1 \\ud83d\\udea8 police cars revolving light\ - -\f0 \uc0\u55357 \u57001 -\f1 \\ud83d\\udea9 triangular flag on post\ - -\f0 \uc0\u55357 \u57002 -\f1 \\ud83d\\udeaa door\ - -\f0 \uc0\u55357 \u57003 -\f1 \\ud83d\\udeab no entry sign\ - -\f0 \uc0\u55357 \u57004 -\f1 \\ud83d\\udeac smoking symbol\ - -\f0 \uc0\u55357 \u57005 -\f1 \\ud83d\\udead no smoking symbol\ - -\f0 \uc0\u55357 \u57010 -\f1 \\ud83d\\udeb2 bicycle\ - -\f0 \uc0\u55357 \u57014 -\f1 \\ud83d\\udeb6 pedestrian\ - -\f0 \uc0\u55357 \u57017 -\f1 \\ud83d\\udeb9 mens symbol\ - -\f0 \uc0\u55357 \u57018 -\f1 \\ud83d\\udeba womens symbol\ - -\f0 \uc0\u55357 \u57019 -\f1 \\ud83d\\udebb restroom\ - -\f0 \uc0\u55357 \u57020 -\f1 \\ud83d\\udebc baby symbol\ - -\f0 \uc0\u55357 \u57021 -\f1 \\ud83d\\udebd toilet\ - -\f0 \uc0\u55357 \u57022 -\f1 \\ud83d\\udebe water closet\ - -\f0 \uc0\u55357 \u57024 -\f1 \\ud83d\\udec0 bath\ - -\f3 \uc0\u9410 -\f1 \\u24c2 circled latin capital letter m\ - -\f3 \uc0\u55356 \u56688 -\f1 \\ud83c\\udd70 negative squared latin capital letter a\ - -\f3 \uc0\u55356 \u56689 -\f1 \\ud83c\\udd71 negative squared latin capital letter b\ - -\f3 \uc0\u55356 \u56702 -\f1 \\ud83c\\udd7e negative squared latin capital letter o\ - -\f3 \uc0\u55356 \u56703 -\f1 \\ud83c\\udd7f negative squared latin capital letter p\ - -\f0 \uc0\u55356 \u56718 -\f1 \\ud83c\\udd8e negative squared ab\ - -\f0 \uc0\u55356 \u56721 -\f1 \\ud83c\\udd91 squared cl\ - -\f0 \uc0\u55356 \u56722 -\f1 \\ud83c\\udd92 squared cool\ - -\f0 \uc0\u55356 \u56723 -\f1 \\ud83c\\udd93 squared free\ - -\f0 \uc0\u55356 \u56724 -\f1 \\ud83c\\udd94 squared id\ - -\f0 \uc0\u55356 \u56725 -\f1 \\ud83c\\udd95 squared new\ - -\f0 \uc0\u55356 \u56726 -\f1 \\ud83c\\udd96 squared ng\ - -\f0 \uc0\u55356 \u56727 -\f1 \\ud83c\\udd97 squared ok\ - -\f0 \uc0\u55356 \u56728 -\f1 \\ud83c\\udd98 squared sos\ - -\f0 \uc0\u55356 \u56729 -\f1 \\ud83c\\udd99 squared up with exclamation mark\ - -\f0 \uc0\u55356 \u56730 -\f1 \\ud83c\\udd9a squared vs\ - -\f0 \uc0\u55356 \u56809 \u55356 \u56810 -\f1 \\ud83c\\udde9\\ud83c\\uddea regional indicator symbol letter d + regional indicator symbol letter e\ - -\f0 \uc0\u55356 \u56812 \u55356 \u56807 -\f1 \\ud83c\\uddec\\ud83c\\udde7 regional indicator symbol letter g + regional indicator symbol letter b\ - -\f0 \uc0\u55356 \u56808 \u55356 \u56819 -\f1 \\ud83c\\udde8\\ud83c\\uddf3 regional indicator symbol letter c + regional indicator symbol letter n\ - -\f0 \uc0\u55356 \u56815 \u55356 \u56821 -\f1 \\ud83c\\uddef\\ud83c\\uddf5 regional indicator symbol letter j + regional indicator symbol letter p\ - -\f0 \uc0\u55356 \u56816 \u55356 \u56823 -\f1 \\ud83c\\uddf0\\ud83c\\uddf7 regional indicator symbol letter k + regional indicator symbol letter r\ - -\f0 \uc0\u55356 \u56811 \u55356 \u56823 -\f1 \\ud83c\\uddeb\\ud83c\\uddf7 regional indicator symbol letter f + regional indicator symbol letter r\ - -\f0 \uc0\u55356 \u56810 \u55356 \u56824 -\f1 \\ud83c\\uddea\\ud83c\\uddf8 regional indicator symbol letter e + regional indicator symbol letter s\ - -\f0 \uc0\u55356 \u56814 \u55356 \u56825 -\f1 \\ud83c\\uddee\\ud83c\\uddf9 regional indicator symbol letter i + regional indicator symbol letter t\ - -\f0 \uc0\u55356 \u56826 \u55356 \u56824 -\f1 \\ud83c\\uddfa\\ud83c\\uddf8 regional indicator symbol letter u + regional indicator symbol letter s\ - -\f0 \uc0\u55356 \u56823 \u55356 \u56826 -\f1 \\ud83c\\uddf7\\ud83c\\uddfa regional indicator symbol letter r + regional indicator symbol letter u\ - -\f0 \uc0\u55356 \u56833 -\f1 \\ud83c\\ude01 squared katakana koko\ - -\f3 \uc0\u55356 \u56834 -\f1 \\ud83c\\ude02 squared katakana sa\ - -\f0 \uc0\u55356 \u56858 -\f1 \\ud83c\\ude1a squared cjk unified ideograph-7121\ - -\f0 \uc0\u55356 \u56879 -\f1 \\ud83c\\ude2f squared cjk unified ideograph-6307\ - -\f0 \uc0\u55356 \u56882 -\f1 \\ud83c\\ude32 squared cjk unified ideograph-7981\ - -\f0 \uc0\u55356 \u56883 -\f1 \\ud83c\\ude33 squared cjk unified ideograph-7a7a\ - -\f0 \uc0\u55356 \u56884 -\f1 \\ud83c\\ude34 squared cjk unified ideograph-5408\ - -\f0 \uc0\u55356 \u56885 -\f1 \\ud83c\\ude35 squared cjk unified ideograph-6e80\ - -\f0 \uc0\u55356 \u56886 -\f1 \\ud83c\\ude36 squared cjk unified ideograph-6709\ - -\f3 \uc0\u55356 \u56887 -\f1 \\ud83c\\ude37 squared cjk unified ideograph-6708\ - -\f0 \uc0\u55356 \u56888 -\f1 \\ud83c\\ude38 squared cjk unified ideograph-7533\ - -\f0 \uc0\u55356 \u56889 -\f1 \\ud83c\\ude39 squared cjk unified ideograph-5272\ - -\f0 \uc0\u55356 \u56890 -\f1 \\ud83c\\ude3a squared cjk unified ideograph-55b6\ - -\f0 \uc0\u55356 \u56912 -\f1 \\ud83c\\ude50 circled ideograph advantage\ - -\f0 \uc0\u55356 \u56913 -\f1 \\ud83c\\ude51 circled ideograph accept\ -\'a9 \\ua9 copyright sign\ -\'ae \\uae registered sign\ -\uc0\u8252 \\u203c double exclamation mark\ -\uc0\u8265 \\u2049 exclamation question mark\ - -\f4 8\uc0\u8419 -\f1 \\u38\\u20e3 digit eight + combining enclosing keycap\ - -\f4 9\uc0\u8419 -\f1 \\u39\\u20e3 digit nine + combining enclosing keycap\ - -\f4 7\uc0\u8419 -\f1 \\u37\\u20e3 digit seven + combining enclosing keycap\ - -\f4 6\uc0\u8419 -\f1 \\u36\\u20e3 digit six + combining enclosing keycap\ - -\f4 1\uc0\u8419 -\f1 \\u31\\u20e3 digit one + combining enclosing keycap\ - -\f4 0\uc0\u8419 -\f1 \\u30\\u20e3 digit zero + combining enclosing keycap\ - -\f4 2\uc0\u8419 -\f1 \\u32\\u20e3 digit two + combining enclosing keycap\ - -\f4 3\uc0\u8419 -\f1 \\u33\\u20e3 digit three + combining enclosing keycap\ - -\f4 5\uc0\u8419 -\f1 \\u35\\u20e3 digit five + combining enclosing keycap\ - -\f4 4\uc0\u8419 -\f1 \\u34\\u20e3 digit four + combining enclosing keycap\ - -\f4 #\uc0\u8419 -\f1 \\u23\\u20e3 number sign + combining enclosing keycap\ -\'99 \\u2122 trade mark sign\ - -\f5 \uc0\u8505 -\f1 \\u2139 information source\ - -\f3 \uc0\u8596 -\f1 \\u2194 left right arrow\ - -\f6 \uc0\u8597 -\f1 \\u2195 up down arrow\ - -\f4 \uc0\u8598 -\f1 \\u2196 north west arrow\ - -\f3 \uc0\u8599 -\f1 \\u2197 north east arrow\ - -\f4 \uc0\u8600 -\f1 \\u2198 south east arrow\ - -\f3 \uc0\u8601 -\f1 \\u2199 south west arrow\ - -\f4 \uc0\u8617 -\f1 \\u21a9 leftwards arrow with hook\ - -\f4 \uc0\u8618 -\f1 \\u21aa rightwards arrow with hook\ - -\f0 \uc0\u8986 -\f1 \\u231a watch\ - -\f0 \uc0\u8987 -\f1 \\u231b hourglass\ - -\f0 \uc0\u9193 -\f1 \\u23e9 black right-pointing double triangle\ - -\f0 \uc0\u9194 -\f1 \\u23ea black left-pointing double triangle\ - -\f0 \uc0\u9195 -\f1 \\u23eb black up-pointing double triangle\ - -\f0 \uc0\u9196 -\f1 \\u23ec black down-pointing double triangle\ - -\f0 \uc0\u9200 -\f1 \\u23f0 alarm clock\ - -\f0 \uc0\u9203 -\f1 \\u23f3 hourglass with flowing sand\ - -\f4 \uc0\u9642 -\f1 \\u25aa black small square\ - -\f4 \uc0\u9643 -\f1 \\u25ab white small square\ - -\f4 \uc0\u9654 -\f1 \\u25b6 black right-pointing triangle\ - -\f3 \uc0\u9664 -\f1 \\u25c0 black left-pointing triangle\ - -\f7 \uc0\u9723 -\f1 \\u25fb white medium square\ - -\f7 \uc0\u9724 -\f1 \\u25fc black medium square\ - -\f0 \uc0\u9725 -\f1 \\u25fd white medium small square\ - -\f0 \uc0\u9726 -\f1 \\u25fe black medium small square\ - -\f3 \uc0\u9728 -\f1 \\u2600 black sun with rays\ - -\f3 \uc0\u9729 -\f1 \\u2601 cloud\ - -\f3 \uc0\u9742 -\f1 \\u260e black telephone\ - -\f5 \uc0\u9745 -\f1 \\u2611 ballot box with check\ - -\f0 \uc0\u9748 -\f1 \\u2614 umbrella with rain drops\ - -\f0 \uc0\u9749 -\f1 \\u2615 hot beverage\ - -\f3 \uc0\u9757 -\f1 \\u261d white up pointing index\ - -\f6 \uc0\u9786 -\f1 \\u263a white smiling face\ - -\f0 \uc0\u9800 -\f1 \\u2648 aries\ - -\f0 \uc0\u9801 -\f1 \\u2649 taurus\ - -\f0 \uc0\u9802 -\f1 \\u264a gemini\ - -\f0 \uc0\u9803 -\f1 \\u264b cancer\ - -\f0 \uc0\u9804 -\f1 \\u264c leo\ - -\f0 \uc0\u9805 -\f1 \\u264d virgo\ - -\f0 \uc0\u9806 -\f1 \\u264e libra\ - -\f0 \uc0\u9807 -\f1 \\u264f scorpius\ - -\f0 \uc0\u9808 -\f1 \\u2650 sagittarius\ - -\f0 \uc0\u9809 -\f1 \\u2651 capricorn\ - -\f0 \uc0\u9810 -\f1 \\u2652 aquarius\ - -\f0 \uc0\u9811 -\f1 \\u2653 pisces\ - -\f3 \uc0\u9824 -\f1 \\u2660 black spade suit\ - -\f3 \uc0\u9827 -\f1 \\u2663 black club suit\ - -\f3 \uc0\u9829 -\f1 \\u2665 black heart suit\ - -\f3 \uc0\u9830 -\f1 \\u2666 black diamond suit\ - -\f3 \uc0\u9832 -\f1 \\u2668 hot springs\ - -\f3 \uc0\u9851 -\f1 \\u267b black universal recycling symbol\ - -\f0 \uc0\u9855 -\f1 \\u267f wheelchair symbol\ - -\f0 \uc0\u9875 -\f1 \\u2693 anchor\ - -\f3 \uc0\u9888 -\f1 \\u26a0 warning sign\ - -\f0 \uc0\u9889 -\f1 \\u26a1 high voltage sign\ - -\f0 \uc0\u9898 -\f1 \\u26aa medium white circle\ - -\f0 \uc0\u9899 -\f1 \\u26ab medium black circle\ - -\f0 \uc0\u9917 -\f1 \\u26bd soccer ball\ - -\f3 \uc0\u9918 -\f1 \\u26be baseball\ - -\f0 \uc0\u9924 -\f1 \\u26c4 snowman without snow\ - -\f0 \uc0\u9925 -\f1 \\u26c5 sun behind cloud\ - -\f0 \uc0\u9934 -\f1 \\u26ce ophiuchus\ - -\f0 \uc0\u9940 -\f1 \\u26d4 no entry\ - -\f0 \uc0\u9962 -\f1 \\u26ea church\ - -\f0 \uc0\u9970 -\f1 \\u26f2 fountain\ - -\f0 \uc0\u9971 -\f1 \\u26f3 flag in hole\ - -\f0 \uc0\u9973 -\f1 \\u26f5 sailboat\ - -\f0 \uc0\u9978 -\f1 \\u26fa tent\ - -\f0 \uc0\u9981 -\f1 \\u26fd fuel pump\ - -\f3 \uc0\u10548 -\f1 \\u2934 arrow pointing rightwards then curving upwards\ - -\f3 \uc0\u10549 -\f1 \\u2935 arrow pointing rightwards then curving downwards\ - -\f3 \uc0\u11013 -\f1 \\u2b05 leftwards black arrow\ - -\f3 \uc0\u11014 -\f1 \\u2b06 upwards black arrow\ - -\f3 \uc0\u11015 -\f1 \\u2b07 downwards black arrow\ - -\f0 \uc0\u11035 -\f1 \\u2b1b black large square\ - -\f0 \uc0\u11036 -\f1 \\u2b1c white large square\ - -\f0 \uc0\u11088 -\f1 \\u2b50 white medium star\ - -\f0 \uc0\u11093 -\f1 \\u2b55 heavy large circle\ - -\f3 \uc0\u12336 -\f1 \\u3030 wavy dash\ - -\f3 \uc0\u12349 -\f1 \\u303d part alternation mark\ - -\f3 \uc0\u12951 -\f1 \\u3297 circled ideograph congratulation\ - -\f3 \uc0\u12953 -\f1 \\u3299 circled ideograph secret\ - -\f0 \uc0\u55356 \u56324 -\f1 \\ud83c\\udc04 mahjong tile red dragon\ - -\f0 \uc0\u55356 \u56527 -\f1 \\ud83c\\udccf playing card black joker\ - -\f0 \uc0\u55356 \u57088 -\f1 \\ud83c\\udf00 cyclone\ - -\f0 \uc0\u55356 \u57089 -\f1 \\ud83c\\udf01 foggy\ - -\f0 \uc0\u55356 \u57090 -\f1 \\ud83c\\udf02 closed umbrella\ - -\f0 \uc0\u55356 \u57091 -\f1 \\ud83c\\udf03 night with stars\ - -\f0 \uc0\u55356 \u57092 -\f1 \\ud83c\\udf04 sunrise over mountains\ - -\f0 \uc0\u55356 \u57093 -\f1 \\ud83c\\udf05 sunrise\ - -\f0 \uc0\u55356 \u57094 -\f1 \\ud83c\\udf06 cityscape at dusk\ - -\f0 \uc0\u55356 \u57095 -\f1 \\ud83c\\udf07 sunset over buildings\ - -\f0 \uc0\u55356 \u57096 -\f1 \\ud83c\\udf08 rainbow\ - -\f0 \uc0\u55356 \u57097 -\f1 \\ud83c\\udf09 bridge at night\ - -\f0 \uc0\u55356 \u57098 -\f1 \\ud83c\\udf0a water wave\ - -\f0 \uc0\u55356 \u57099 -\f1 \\ud83c\\udf0b volcano\ - -\f0 \uc0\u55356 \u57100 -\f1 \\ud83c\\udf0c milky way\ - -\f0 \uc0\u55356 \u57103 -\f1 \\ud83c\\udf0f earth globe asia-australia\ - -\f0 \uc0\u55356 \u57105 -\f1 \\ud83c\\udf11 new moon symbol\ - -\f0 \uc0\u55356 \u57107 -\f1 \\ud83c\\udf13 first quarter moon symbol\ - -\f0 \uc0\u55356 \u57108 -\f1 \\ud83c\\udf14 waxing gibbous moon symbol\ - -\f0 \uc0\u55356 \u57109 -\f1 \\ud83c\\udf15 full moon symbol\ - -\f0 \uc0\u55356 \u57113 -\f1 \\ud83c\\udf19 crescent moon\ - -\f0 \uc0\u55356 \u57115 -\f1 \\ud83c\\udf1b first quarter moon with face\ - -\f0 \uc0\u55356 \u57119 -\f1 \\ud83c\\udf1f glowing star\ - -\f0 \uc0\u55356 \u57120 -\f1 \\ud83c\\udf20 shooting star\ - -\f0 \uc0\u55356 \u57136 -\f1 \\ud83c\\udf30 chestnut\ - -\f0 \uc0\u55356 \u57137 -\f1 \\ud83c\\udf31 seedling\ - -\f0 \uc0\u55356 \u57140 -\f1 \\ud83c\\udf34 palm tree\ - -\f0 \uc0\u55356 \u57141 -\f1 \\ud83c\\udf35 cactus\ - -\f0 \uc0\u55356 \u57143 -\f1 \\ud83c\\udf37 tulip\ - -\f0 \uc0\u55356 \u57144 -\f1 \\ud83c\\udf38 cherry blossom\ - -\f0 \uc0\u55356 \u57145 -\f1 \\ud83c\\udf39 rose\ - -\f0 \uc0\u55356 \u57146 -\f1 \\ud83c\\udf3a hibiscus\ - -\f0 \uc0\u55356 \u57147 -\f1 \\ud83c\\udf3b sunflower\ - -\f0 \uc0\u55356 \u57148 -\f1 \\ud83c\\udf3c blossom\ - -\f0 \uc0\u55356 \u57149 -\f1 \\ud83c\\udf3d ear of maize\ - -\f0 \uc0\u55356 \u57150 -\f1 \\ud83c\\udf3e ear of rice\ - -\f0 \uc0\u55356 \u57151 -\f1 \\ud83c\\udf3f herb\ - -\f0 \uc0\u55356 \u57152 -\f1 \\ud83c\\udf40 four leaf clover\ - -\f0 \uc0\u55356 \u57153 -\f1 \\ud83c\\udf41 maple leaf\ - -\f0 \uc0\u55356 \u57154 -\f1 \\ud83c\\udf42 fallen leaf\ - -\f0 \uc0\u55356 \u57155 -\f1 \\ud83c\\udf43 leaf fluttering in wind\ - -\f0 \uc0\u55356 \u57156 -\f1 \\ud83c\\udf44 mushroom\ - -\f0 \uc0\u55356 \u57157 -\f1 \\ud83c\\udf45 tomato\ - -\f0 \uc0\u55356 \u57158 -\f1 \\ud83c\\udf46 aubergine\ - -\f0 \uc0\u55356 \u57159 -\f1 \\ud83c\\udf47 grapes\ - -\f0 \uc0\u55356 \u57160 -\f1 \\ud83c\\udf48 melon\ - -\f0 \uc0\u55356 \u57161 -\f1 \\ud83c\\udf49 watermelon\ - -\f0 \uc0\u55356 \u57162 -\f1 \\ud83c\\udf4a tangerine\ - -\f0 \uc0\u55356 \u57164 -\f1 \\ud83c\\udf4c banana\ - -\f0 \uc0\u55356 \u57165 -\f1 \\ud83c\\udf4d pineapple\ - -\f0 \uc0\u55356 \u57166 -\f1 \\ud83c\\udf4e red apple\ - -\f0 \uc0\u55356 \u57167 -\f1 \\ud83c\\udf4f green apple\ - -\f0 \uc0\u55356 \u57169 -\f1 \\ud83c\\udf51 peach\ - -\f0 \uc0\u55356 \u57170 -\f1 \\ud83c\\udf52 cherries\ - -\f0 \uc0\u55356 \u57171 -\f1 \\ud83c\\udf53 strawberry\ - -\f0 \uc0\u55356 \u57172 -\f1 \\ud83c\\udf54 hamburger\ - -\f0 \uc0\u55356 \u57173 -\f1 \\ud83c\\udf55 slice of pizza\ - -\f0 \uc0\u55356 \u57174 -\f1 \\ud83c\\udf56 meat on bone\ - -\f0 \uc0\u55356 \u57175 -\f1 \\ud83c\\udf57 poultry leg\ - -\f0 \uc0\u55356 \u57176 -\f1 \\ud83c\\udf58 rice cracker\ - -\f0 \uc0\u55356 \u57177 -\f1 \\ud83c\\udf59 rice ball\ - -\f0 \uc0\u55356 \u57178 -\f1 \\ud83c\\udf5a cooked rice\ - -\f0 \uc0\u55356 \u57179 -\f1 \\ud83c\\udf5b curry and rice\ - -\f0 \uc0\u55356 \u57180 -\f1 \\ud83c\\udf5c steaming bowl\ - -\f0 \uc0\u55356 \u57181 -\f1 \\ud83c\\udf5d spaghetti\ - -\f0 \uc0\u55356 \u57182 -\f1 \\ud83c\\udf5e bread\ - -\f0 \uc0\u55356 \u57183 -\f1 \\ud83c\\udf5f french fries\ - -\f0 \uc0\u55356 \u57184 -\f1 \\ud83c\\udf60 roasted sweet potato\ - -\f0 \uc0\u55356 \u57185 -\f1 \\ud83c\\udf61 dango\ - -\f0 \uc0\u55356 \u57186 -\f1 \\ud83c\\udf62 oden\ - -\f0 \uc0\u55356 \u57187 -\f1 \\ud83c\\udf63 sushi\ - -\f0 \uc0\u55356 \u57188 -\f1 \\ud83c\\udf64 fried shrimp\ - -\f0 \uc0\u55356 \u57189 -\f1 \\ud83c\\udf65 fish cake with swirl design\ - -\f0 \uc0\u55356 \u57190 -\f1 \\ud83c\\udf66 soft ice cream\ - -\f0 \uc0\u55356 \u57191 -\f1 \\ud83c\\udf67 shaved ice\ - -\f0 \uc0\u55356 \u57192 -\f1 \\ud83c\\udf68 ice cream\ - -\f0 \uc0\u55356 \u57193 -\f1 \\ud83c\\udf69 doughnut\ - -\f0 \uc0\u55356 \u57194 -\f1 \\ud83c\\udf6a cookie\ - -\f0 \uc0\u55356 \u57195 -\f1 \\ud83c\\udf6b chocolate bar\ - -\f0 \uc0\u55356 \u57196 -\f1 \\ud83c\\udf6c candy\ - -\f0 \uc0\u55356 \u57197 -\f1 \\ud83c\\udf6d lollipop\ - -\f0 \uc0\u55356 \u57198 -\f1 \\ud83c\\udf6e custard\ - -\f0 \uc0\u55356 \u57199 -\f1 \\ud83c\\udf6f honey pot\ - -\f0 \uc0\u55356 \u57200 -\f1 \\ud83c\\udf70 shortcake\ - -\f0 \uc0\u55356 \u57201 -\f1 \\ud83c\\udf71 bento box\ - -\f0 \uc0\u55356 \u57202 -\f1 \\ud83c\\udf72 pot of food\ - -\f0 \uc0\u55356 \u57203 -\f1 \\ud83c\\udf73 cooking\ - -\f0 \uc0\u55356 \u57204 -\f1 \\ud83c\\udf74 fork and knife\ - -\f0 \uc0\u55356 \u57205 -\f1 \\ud83c\\udf75 teacup without handle\ - -\f0 \uc0\u55356 \u57206 -\f1 \\ud83c\\udf76 sake bottle and cup\ - -\f0 \uc0\u55356 \u57207 -\f1 \\ud83c\\udf77 wine glass\ - -\f0 \uc0\u55356 \u57208 -\f1 \\ud83c\\udf78 cocktail glass\ - -\f0 \uc0\u55356 \u57209 -\f1 \\ud83c\\udf79 tropical drink\ - -\f0 \uc0\u55356 \u57210 -\f1 \\ud83c\\udf7a beer mug\ - -\f0 \uc0\u55356 \u57211 -\f1 \\ud83c\\udf7b clinking beer mugs\ - -\f0 \uc0\u55356 \u57216 -\f1 \\ud83c\\udf80 ribbon\ - -\f0 \uc0\u55356 \u57217 -\f1 \\ud83c\\udf81 wrapped present\ - -\f0 \uc0\u55356 \u57218 -\f1 \\ud83c\\udf82 birthday cake\ - -\f0 \uc0\u55356 \u57219 -\f1 \\ud83c\\udf83 jack-o-lantern\ - -\f0 \uc0\u55356 \u57220 -\f1 \\ud83c\\udf84 christmas tree\ - -\f0 \uc0\u55356 \u57221 -\f1 \\ud83c\\udf85 father christmas\ - -\f0 \uc0\u55356 \u57222 -\f1 \\ud83c\\udf86 fireworks\ - -\f0 \uc0\u55356 \u57223 -\f1 \\ud83c\\udf87 firework sparkler\ - -\f0 \uc0\u55356 \u57224 -\f1 \\ud83c\\udf88 balloon\ - -\f0 \uc0\u55356 \u57225 -\f1 \\ud83c\\udf89 party popper\ - -\f0 \uc0\u55356 \u57226 -\f1 \\ud83c\\udf8a confetti ball\ - -\f0 \uc0\u55356 \u57227 -\f1 \\ud83c\\udf8b tanabata tree\ - -\f0 \uc0\u55356 \u57228 -\f1 \\ud83c\\udf8c crossed flags\ - -\f0 \uc0\u55356 \u57229 -\f1 \\ud83c\\udf8d pine decoration\ - -\f0 \uc0\u55356 \u57230 -\f1 \\ud83c\\udf8e japanese dolls\ - -\f0 \uc0\u55356 \u57231 -\f1 \\ud83c\\udf8f carp streamer\ - -\f0 \uc0\u55356 \u57232 -\f1 \\ud83c\\udf90 wind chime\ - -\f0 \uc0\u55356 \u57233 -\f1 \\ud83c\\udf91 moon viewing ceremony\ - -\f0 \uc0\u55356 \u57234 -\f1 \\ud83c\\udf92 school satchel\ - -\f0 \uc0\u55356 \u57235 -\f1 \\ud83c\\udf93 graduation cap\ - -\f0 \uc0\u55356 \u57248 -\f1 \\ud83c\\udfa0 carousel horse\ - -\f0 \uc0\u55356 \u57249 -\f1 \\ud83c\\udfa1 ferris wheel\ - -\f0 \uc0\u55356 \u57250 -\f1 \\ud83c\\udfa2 roller coaster\ - -\f0 \uc0\u55356 \u57251 -\f1 \\ud83c\\udfa3 fishing pole and fish\ - -\f0 \uc0\u55356 \u57252 -\f1 \\ud83c\\udfa4 microphone\ - -\f0 \uc0\u55356 \u57253 -\f1 \\ud83c\\udfa5 movie camera\ - -\f0 \uc0\u55356 \u57254 -\f1 \\ud83c\\udfa6 cinema\ - -\f0 \uc0\u55356 \u57255 -\f1 \\ud83c\\udfa7 headphone\ - -\f0 \uc0\u55356 \u57256 -\f1 \\ud83c\\udfa8 artist palette\ - -\f0 \uc0\u55356 \u57257 -\f1 \\ud83c\\udfa9 top hat\ - -\f0 \uc0\u55356 \u57258 -\f1 \\ud83c\\udfaa circus tent\ - -\f0 \uc0\u55356 \u57259 -\f1 \\ud83c\\udfab ticket\ - -\f0 \uc0\u55356 \u57260 -\f1 \\ud83c\\udfac clapper board\ - -\f0 \uc0\u55356 \u57261 -\f1 \\ud83c\\udfad performing arts\ - -\f0 \uc0\u55356 \u57262 -\f1 \\ud83c\\udfae video game\ - -\f0 \uc0\u55356 \u57263 -\f1 \\ud83c\\udfaf direct hit\ - -\f0 \uc0\u55356 \u57264 -\f1 \\ud83c\\udfb0 slot machine\ - -\f0 \uc0\u55356 \u57265 -\f1 \\ud83c\\udfb1 billiards\ - -\f0 \uc0\u55356 \u57266 -\f1 \\ud83c\\udfb2 game die\ - -\f0 \uc0\u55356 \u57267 -\f1 \\ud83c\\udfb3 bowling\ - -\f0 \uc0\u55356 \u57268 -\f1 \\ud83c\\udfb4 flower playing cards\ - -\f0 \uc0\u55356 \u57269 -\f1 \\ud83c\\udfb5 musical note\ - -\f0 \uc0\u55356 \u57270 -\f1 \\ud83c\\udfb6 multiple musical notes\ - -\f0 \uc0\u55356 \u57271 -\f1 \\ud83c\\udfb7 saxophone\ - -\f0 \uc0\u55356 \u57272 -\f1 \\ud83c\\udfb8 guitar\ - -\f0 \uc0\u55356 \u57273 -\f1 \\ud83c\\udfb9 musical keyboard\ - -\f0 \uc0\u55356 \u57274 -\f1 \\ud83c\\udfba trumpet\ - -\f0 \uc0\u55356 \u57275 -\f1 \\ud83c\\udfbb violin\ - -\f0 \uc0\u55356 \u57276 -\f1 \\ud83c\\udfbc musical score\ - -\f0 \uc0\u55356 \u57277 -\f1 \\ud83c\\udfbd running shirt with sash\ - -\f0 \uc0\u55356 \u57278 -\f1 \\ud83c\\udfbe tennis racquet and ball\ - -\f0 \uc0\u55356 \u57279 -\f1 \\ud83c\\udfbf ski and ski boot\ - -\f0 \uc0\u55356 \u57280 -\f1 \\ud83c\\udfc0 basketball and hoop\ - -\f0 \uc0\u55356 \u57281 -\f1 \\ud83c\\udfc1 chequered flag\ - -\f0 \uc0\u55356 \u57282 -\f1 \\ud83c\\udfc2 snowboarder\ - -\f0 \uc0\u55356 \u57283 -\f1 \\ud83c\\udfc3 runner\ - -\f0 \uc0\u55356 \u57284 -\f1 \\ud83c\\udfc4 surfer\ - -\f0 \uc0\u55356 \u57286 -\f1 \\ud83c\\udfc6 trophy\ - -\f0 \uc0\u55356 \u57288 -\f1 \\ud83c\\udfc8 american football\ - -\f0 \uc0\u55356 \u57290 -\f1 \\ud83c\\udfca swimmer\ - -\f0 \uc0\u55356 \u57312 -\f1 \\ud83c\\udfe0 house building\ - -\f0 \uc0\u55356 \u57313 -\f1 \\ud83c\\udfe1 house with garden\ - -\f0 \uc0\u55356 \u57314 -\f1 \\ud83c\\udfe2 office building\ - -\f0 \uc0\u55356 \u57315 -\f1 \\ud83c\\udfe3 japanese post office\ - -\f0 \uc0\u55356 \u57317 -\f1 \\ud83c\\udfe5 hospital\ - -\f0 \uc0\u55356 \u57318 -\f1 \\ud83c\\udfe6 bank\ - -\f0 \uc0\u55356 \u57319 -\f1 \\ud83c\\udfe7 automated teller machine\ - -\f0 \uc0\u55356 \u57320 -\f1 \\ud83c\\udfe8 hotel\ - -\f0 \uc0\u55356 \u57321 -\f1 \\ud83c\\udfe9 love hotel\ - -\f0 \uc0\u55356 \u57322 -\f1 \\ud83c\\udfea convenience store\ - -\f0 \uc0\u55356 \u57323 -\f1 \\ud83c\\udfeb school\ - -\f0 \uc0\u55356 \u57324 -\f1 \\ud83c\\udfec department store\ - -\f0 \uc0\u55356 \u57325 -\f1 \\ud83c\\udfed factory\ - -\f0 \uc0\u55356 \u57326 -\f1 \\ud83c\\udfee izakaya lantern\ - -\f0 \uc0\u55356 \u57327 -\f1 \\ud83c\\udfef japanese castle\ - -\f0 \uc0\u55356 \u57328 -\f1 \\ud83c\\udff0 european castle\ - -\f0 \uc0\u55357 \u56332 -\f1 \\ud83d\\udc0c snail\ - -\f0 \uc0\u55357 \u56333 -\f1 \\ud83d\\udc0d snake\ - -\f0 \uc0\u55357 \u56334 -\f1 \\ud83d\\udc0e horse\ - -\f0 \uc0\u55357 \u56337 -\f1 \\ud83d\\udc11 sheep\ - -\f0 \uc0\u55357 \u56338 -\f1 \\ud83d\\udc12 monkey\ - -\f0 \uc0\u55357 \u56340 -\f1 \\ud83d\\udc14 chicken\ - -\f0 \uc0\u55357 \u56343 -\f1 \\ud83d\\udc17 boar\ - -\f0 \uc0\u55357 \u56344 -\f1 \\ud83d\\udc18 elephant\ - -\f0 \uc0\u55357 \u56345 -\f1 \\ud83d\\udc19 octopus\ - -\f0 \uc0\u55357 \u56346 -\f1 \\ud83d\\udc1a spiral shell\ - -\f0 \uc0\u55357 \u56347 -\f1 \\ud83d\\udc1b bug\ - -\f0 \uc0\u55357 \u56348 -\f1 \\ud83d\\udc1c ant\ - -\f0 \uc0\u55357 \u56349 -\f1 \\ud83d\\udc1d honeybee\ - -\f0 \uc0\u55357 \u56350 -\f1 \\ud83d\\udc1e lady beetle\ - -\f0 \uc0\u55357 \u56351 -\f1 \\ud83d\\udc1f fish\ - -\f0 \uc0\u55357 \u56352 -\f1 \\ud83d\\udc20 tropical fish\ - -\f0 \uc0\u55357 \u56353 -\f1 \\ud83d\\udc21 blowfish\ - -\f0 \uc0\u55357 \u56354 -\f1 \\ud83d\\udc22 turtle\ - -\f0 \uc0\u55357 \u56355 -\f1 \\ud83d\\udc23 hatching chick\ - -\f0 \uc0\u55357 \u56356 -\f1 \\ud83d\\udc24 baby chick\ - -\f0 \uc0\u55357 \u56357 -\f1 \\ud83d\\udc25 front-facing baby chick\ - -\f0 \uc0\u55357 \u56358 -\f1 \\ud83d\\udc26 bird\ - -\f0 \uc0\u55357 \u56359 -\f1 \\ud83d\\udc27 penguin\ - -\f0 \uc0\u55357 \u56360 -\f1 \\ud83d\\udc28 koala\ - -\f0 \uc0\u55357 \u56361 -\f1 \\ud83d\\udc29 poodle\ - -\f0 \uc0\u55357 \u56363 -\f1 \\ud83d\\udc2b bactrian camel\ - -\f0 \uc0\u55357 \u56364 -\f1 \\ud83d\\udc2c dolphin\ - -\f0 \uc0\u55357 \u56365 -\f1 \\ud83d\\udc2d mouse face\ - -\f0 \uc0\u55357 \u56366 -\f1 \\ud83d\\udc2e cow face\ - -\f0 \uc0\u55357 \u56367 -\f1 \\ud83d\\udc2f tiger face\ - -\f0 \uc0\u55357 \u56368 -\f1 \\ud83d\\udc30 rabbit face\ - -\f0 \uc0\u55357 \u56369 -\f1 \\ud83d\\udc31 cat face\ - -\f0 \uc0\u55357 \u56370 -\f1 \\ud83d\\udc32 dragon face\ - -\f0 \uc0\u55357 \u56371 -\f1 \\ud83d\\udc33 spouting whale\ - -\f0 \uc0\u55357 \u56372 -\f1 \\ud83d\\udc34 horse face\ - -\f0 \uc0\u55357 \u56373 -\f1 \\ud83d\\udc35 monkey face\ - -\f0 \uc0\u55357 \u56374 -\f1 \\ud83d\\udc36 dog face\ - -\f0 \uc0\u55357 \u56375 -\f1 \\ud83d\\udc37 pig face\ - -\f0 \uc0\u55357 \u56376 -\f1 \\ud83d\\udc38 frog face\ - -\f0 \uc0\u55357 \u56377 -\f1 \\ud83d\\udc39 hamster face\ - -\f0 \uc0\u55357 \u56378 -\f1 \\ud83d\\udc3a wolf face\ - -\f0 \uc0\u55357 \u56379 -\f1 \\ud83d\\udc3b bear face\ - -\f0 \uc0\u55357 \u56380 -\f1 \\ud83d\\udc3c panda face\ - -\f0 \uc0\u55357 \u56381 -\f1 \\ud83d\\udc3d pig nose\ - -\f0 \uc0\u55357 \u56382 -\f1 \\ud83d\\udc3e paw prints\ - -\f0 \uc0\u55357 \u56384 -\f1 \\ud83d\\udc40 eyes\ - -\f0 \uc0\u55357 \u56386 -\f1 \\ud83d\\udc42 ear\ - -\f0 \uc0\u55357 \u56387 -\f1 \\ud83d\\udc43 nose\ - -\f0 \uc0\u55357 \u56388 -\f1 \\ud83d\\udc44 mouth\ - -\f0 \uc0\u55357 \u56389 -\f1 \\ud83d\\udc45 tongue\ - -\f0 \uc0\u55357 \u56390 -\f1 \\ud83d\\udc46 white up pointing backhand index\ - -\f0 \uc0\u55357 \u56391 -\f1 \\ud83d\\udc47 white down pointing backhand index\ - -\f0 \uc0\u55357 \u56392 -\f1 \\ud83d\\udc48 white left pointing backhand index\ - -\f0 \uc0\u55357 \u56393 -\f1 \\ud83d\\udc49 white right pointing backhand index\ - -\f0 \uc0\u55357 \u56394 -\f1 \\ud83d\\udc4a fisted hand sign\ - -\f0 \uc0\u55357 \u56395 -\f1 \\ud83d\\udc4b waving hand sign\ - -\f0 \uc0\u55357 \u56396 -\f1 \\ud83d\\udc4c ok hand sign\ - -\f0 \uc0\u55357 \u56397 -\f1 \\ud83d\\udc4d thumbs up sign\ - -\f0 \uc0\u55357 \u56398 -\f1 \\ud83d\\udc4e thumbs down sign\ - -\f0 \uc0\u55357 \u56399 -\f1 \\ud83d\\udc4f clapping hands sign\ - -\f0 \uc0\u55357 \u56400 -\f1 \\ud83d\\udc50 open hands sign\ - -\f0 \uc0\u55357 \u56401 -\f1 \\ud83d\\udc51 crown\ - -\f0 \uc0\u55357 \u56402 -\f1 \\ud83d\\udc52 womans hat\ - -\f0 \uc0\u55357 \u56403 -\f1 \\ud83d\\udc53 eyeglasses\ - -\f0 \uc0\u55357 \u56404 -\f1 \\ud83d\\udc54 necktie\ - -\f0 \uc0\u55357 \u56405 -\f1 \\ud83d\\udc55 t-shirt\ - -\f0 \uc0\u55357 \u56406 -\f1 \\ud83d\\udc56 jeans\ - -\f0 \uc0\u55357 \u56407 -\f1 \\ud83d\\udc57 dress\ - -\f0 \uc0\u55357 \u56408 -\f1 \\ud83d\\udc58 kimono\ - -\f0 \uc0\u55357 \u56409 -\f1 \\ud83d\\udc59 bikini\ - -\f0 \uc0\u55357 \u56410 -\f1 \\ud83d\\udc5a womans clothes\ - -\f0 \uc0\u55357 \u56411 -\f1 \\ud83d\\udc5b purse\ - -\f0 \uc0\u55357 \u56412 -\f1 \\ud83d\\udc5c handbag\ - -\f0 \uc0\u55357 \u56413 -\f1 \\ud83d\\udc5d pouch\ - -\f0 \uc0\u55357 \u56414 -\f1 \\ud83d\\udc5e mans shoe\ - -\f0 \uc0\u55357 \u56415 -\f1 \\ud83d\\udc5f athletic shoe\ - -\f0 \uc0\u55357 \u56416 -\f1 \\ud83d\\udc60 high-heeled shoe\ - -\f0 \uc0\u55357 \u56417 -\f1 \\ud83d\\udc61 womans sandal\ - -\f0 \uc0\u55357 \u56418 -\f1 \\ud83d\\udc62 womans boots\ - -\f0 \uc0\u55357 \u56419 -\f1 \\ud83d\\udc63 footprints\ - -\f0 \uc0\u55357 \u56420 -\f1 \\ud83d\\udc64 bust in silhouette\ - -\f0 \uc0\u55357 \u56422 -\f1 \\ud83d\\udc66 boy\ - -\f0 \uc0\u55357 \u56423 -\f1 \\ud83d\\udc67 girl\ - -\f0 \uc0\u55357 \u56424 -\f1 \\ud83d\\udc68 man\ - -\f0 \uc0\u55357 \u56425 -\f1 \\ud83d\\udc69 woman\ - -\f0 \uc0\u55357 \u56426 -\f1 \\ud83d\\udc6a family\ - -\f0 \uc0\u55357 \u56427 -\f1 \\ud83d\\udc6b man and woman holding hands\ - -\f0 \uc0\u55357 \u56430 -\f1 \\ud83d\\udc6e police officer\ - -\f0 \uc0\u55357 \u56431 -\f1 \\ud83d\\udc6f woman with bunny ears\ - -\f0 \uc0\u55357 \u56432 -\f1 \\ud83d\\udc70 bride with veil\ - -\f0 \uc0\u55357 \u56433 -\f1 \\ud83d\\udc71 person with blond hair\ - -\f0 \uc0\u55357 \u56434 -\f1 \\ud83d\\udc72 man with gua pi mao\ - -\f0 \uc0\u55357 \u56435 -\f1 \\ud83d\\udc73 man with turban\ - -\f0 \uc0\u55357 \u56436 -\f1 \\ud83d\\udc74 older man\ - -\f0 \uc0\u55357 \u56437 -\f1 \\ud83d\\udc75 older woman\ - -\f0 \uc0\u55357 \u56438 -\f1 \\ud83d\\udc76 baby\ - -\f0 \uc0\u55357 \u56439 -\f1 \\ud83d\\udc77 construction worker\ - -\f0 \uc0\u55357 \u56440 -\f1 \\ud83d\\udc78 princess\ - -\f0 \uc0\u55357 \u56441 -\f1 \\ud83d\\udc79 japanese ogre\ - -\f0 \uc0\u55357 \u56442 -\f1 \\ud83d\\udc7a japanese goblin\ - -\f0 \uc0\u55357 \u56443 -\f1 \\ud83d\\udc7b ghost\ - -\f0 \uc0\u55357 \u56444 -\f1 \\ud83d\\udc7c baby angel\ - -\f0 \uc0\u55357 \u56445 -\f1 \\ud83d\\udc7d extraterrestrial alien\ - -\f0 \uc0\u55357 \u56446 -\f1 \\ud83d\\udc7e alien monster\ - -\f0 \uc0\u55357 \u56447 -\f1 \\ud83d\\udc7f imp\ - -\f0 \uc0\u55357 \u56448 -\f1 \\ud83d\\udc80 skull\ - -\f0 \uc0\u55357 \u56449 -\f1 \\ud83d\\udc81 information desk person\ - -\f0 \uc0\u55357 \u56450 -\f1 \\ud83d\\udc82 guardsman\ - -\f0 \uc0\u55357 \u56451 -\f1 \\ud83d\\udc83 dancer\ - -\f0 \uc0\u55357 \u56452 -\f1 \\ud83d\\udc84 lipstick\ - -\f0 \uc0\u55357 \u56453 -\f1 \\ud83d\\udc85 nail polish\ - -\f0 \uc0\u55357 \u56454 -\f1 \\ud83d\\udc86 face massage\ - -\f0 \uc0\u55357 \u56455 -\f1 \\ud83d\\udc87 haircut\ - -\f0 \uc0\u55357 \u56456 -\f1 \\ud83d\\udc88 barber pole\ - -\f0 \uc0\u55357 \u56457 -\f1 \\ud83d\\udc89 syringe\ - -\f0 \uc0\u55357 \u56458 -\f1 \\ud83d\\udc8a pill\ - -\f0 \uc0\u55357 \u56459 -\f1 \\ud83d\\udc8b kiss mark\ - -\f0 \uc0\u55357 \u56460 -\f1 \\ud83d\\udc8c love letter\ - -\f0 \uc0\u55357 \u56461 -\f1 \\ud83d\\udc8d ring\ - -\f0 \uc0\u55357 \u56462 -\f1 \\ud83d\\udc8e gem stone\ - -\f0 \uc0\u55357 \u56463 -\f1 \\ud83d\\udc8f kiss\ - -\f0 \uc0\u55357 \u56464 -\f1 \\ud83d\\udc90 bouquet\ - -\f0 \uc0\u55357 \u56465 -\f1 \\ud83d\\udc91 couple with heart\ - -\f0 \uc0\u55357 \u56466 -\f1 \\ud83d\\udc92 wedding\ - -\f0 \uc0\u55357 \u56467 -\f1 \\ud83d\\udc93 beating heart\ - -\f0 \uc0\u55357 \u56468 -\f1 \\ud83d\\udc94 broken heart\ - -\f0 \uc0\u55357 \u56469 -\f1 \\ud83d\\udc95 two hearts\ - -\f0 \uc0\u55357 \u56470 -\f1 \\ud83d\\udc96 sparkling heart\ - -\f0 \uc0\u55357 \u56471 -\f1 \\ud83d\\udc97 growing heart\ - -\f0 \uc0\u55357 \u56472 -\f1 \\ud83d\\udc98 heart with arrow\ - -\f0 \uc0\u55357 \u56473 -\f1 \\ud83d\\udc99 blue heart\ - -\f0 \uc0\u55357 \u56474 -\f1 \\ud83d\\udc9a green heart\ - -\f0 \uc0\u55357 \u56475 -\f1 \\ud83d\\udc9b yellow heart\ - -\f0 \uc0\u55357 \u56476 -\f1 \\ud83d\\udc9c purple heart\ - -\f0 \uc0\u55357 \u56477 -\f1 \\ud83d\\udc9d heart with ribbon\ - -\f0 \uc0\u55357 \u56478 -\f1 \\ud83d\\udc9e revolving hearts\ - -\f0 \uc0\u55357 \u56479 -\f1 \\ud83d\\udc9f heart decoration\ - -\f0 \uc0\u55357 \u56480 -\f1 \\ud83d\\udca0 diamond shape with a dot inside\ - -\f0 \uc0\u55357 \u56481 -\f1 \\ud83d\\udca1 electric light bulb\ - -\f0 \uc0\u55357 \u56482 -\f1 \\ud83d\\udca2 anger symbol\ - -\f0 \uc0\u55357 \u56483 -\f1 \\ud83d\\udca3 bomb\ - -\f0 \uc0\u55357 \u56484 -\f1 \\ud83d\\udca4 sleeping symbol\ - -\f0 \uc0\u55357 \u56485 -\f1 \\ud83d\\udca5 collision symbol\ - -\f0 \uc0\u55357 \u56486 -\f1 \\ud83d\\udca6 splashing sweat symbol\ - -\f0 \uc0\u55357 \u56487 -\f1 \\ud83d\\udca7 droplet\ - -\f0 \uc0\u55357 \u56488 -\f1 \\ud83d\\udca8 dash symbol\ - -\f0 \uc0\u55357 \u56489 -\f1 \\ud83d\\udca9 pile of poo\ - -\f0 \uc0\u55357 \u56490 -\f1 \\ud83d\\udcaa flexed biceps\ - -\f0 \uc0\u55357 \u56491 -\f1 \\ud83d\\udcab dizzy symbol\ - -\f0 \uc0\u55357 \u56492 -\f1 \\ud83d\\udcac speech balloon\ - -\f0 \uc0\u55357 \u56494 -\f1 \\ud83d\\udcae white flower\ - -\f0 \uc0\u55357 \u56495 -\f1 \\ud83d\\udcaf hundred points symbol\ - -\f0 \uc0\u55357 \u56496 -\f1 \\ud83d\\udcb0 money bag\ - -\f0 \uc0\u55357 \u56497 -\f1 \\ud83d\\udcb1 currency exchange\ - -\f0 \uc0\u55357 \u56498 -\f1 \\ud83d\\udcb2 heavy dollar sign\ - -\f0 \uc0\u55357 \u56499 -\f1 \\ud83d\\udcb3 credit card\ - -\f0 \uc0\u55357 \u56500 -\f1 \\ud83d\\udcb4 banknote with yen sign\ - -\f0 \uc0\u55357 \u56501 -\f1 \\ud83d\\udcb5 banknote with dollar sign\ - -\f0 \uc0\u55357 \u56504 -\f1 \\ud83d\\udcb8 money with wings\ - -\f0 \uc0\u55357 \u56505 -\f1 \\ud83d\\udcb9 chart with upwards trend and yen sign\ - -\f0 \uc0\u55357 \u56506 -\f1 \\ud83d\\udcba seat\ - -\f0 \uc0\u55357 \u56507 -\f1 \\ud83d\\udcbb personal computer\ - -\f0 \uc0\u55357 \u56508 -\f1 \\ud83d\\udcbc briefcase\ - -\f0 \uc0\u55357 \u56509 -\f1 \\ud83d\\udcbd minidisc\ - -\f0 \uc0\u55357 \u56510 -\f1 \\ud83d\\udcbe floppy disk\ - -\f0 \uc0\u55357 \u56511 -\f1 \\ud83d\\udcbf optical disc\ - -\f0 \uc0\u55357 \u56512 -\f1 \\ud83d\\udcc0 dvd\ - -\f0 \uc0\u55357 \u56513 -\f1 \\ud83d\\udcc1 file folder\ - -\f0 \uc0\u55357 \u56514 -\f1 \\ud83d\\udcc2 open file folder\ - -\f0 \uc0\u55357 \u56515 -\f1 \\ud83d\\udcc3 page with curl\ - -\f0 \uc0\u55357 \u56516 -\f1 \\ud83d\\udcc4 page facing up\ - -\f0 \uc0\u55357 \u56517 -\f1 \\ud83d\\udcc5 calendar\ - -\f0 \uc0\u55357 \u56518 -\f1 \\ud83d\\udcc6 tear-off calendar\ - -\f0 \uc0\u55357 \u56519 -\f1 \\ud83d\\udcc7 card index\ - -\f0 \uc0\u55357 \u56520 -\f1 \\ud83d\\udcc8 chart with upwards trend\ - -\f0 \uc0\u55357 \u56521 -\f1 \\ud83d\\udcc9 chart with downwards trend\ - -\f0 \uc0\u55357 \u56522 -\f1 \\ud83d\\udcca bar chart\ - -\f0 \uc0\u55357 \u56523 -\f1 \\ud83d\\udccb clipboard\ - -\f0 \uc0\u55357 \u56524 -\f1 \\ud83d\\udccc pushpin\ - -\f0 \uc0\u55357 \u56525 -\f1 \\ud83d\\udccd round pushpin\ - -\f0 \uc0\u55357 \u56526 -\f1 \\ud83d\\udcce paperclip\ - -\f0 \uc0\u55357 \u56527 -\f1 \\ud83d\\udccf straight ruler\ - -\f0 \uc0\u55357 \u56528 -\f1 \\ud83d\\udcd0 triangular ruler\ - -\f0 \uc0\u55357 \u56529 -\f1 \\ud83d\\udcd1 bookmark tabs\ - -\f0 \uc0\u55357 \u56530 -\f1 \\ud83d\\udcd2 ledger\ - -\f0 \uc0\u55357 \u56531 -\f1 \\ud83d\\udcd3 notebook\ - -\f0 \uc0\u55357 \u56532 -\f1 \\ud83d\\udcd4 notebook with decorative cover\ - -\f0 \uc0\u55357 \u56533 -\f1 \\ud83d\\udcd5 closed book\ - -\f0 \uc0\u55357 \u56534 -\f1 \\ud83d\\udcd6 open book\ - -\f0 \uc0\u55357 \u56535 -\f1 \\ud83d\\udcd7 green book\ - -\f0 \uc0\u55357 \u56536 -\f1 \\ud83d\\udcd8 blue book\ - -\f0 \uc0\u55357 \u56537 -\f1 \\ud83d\\udcd9 orange book\ - -\f0 \uc0\u55357 \u56538 -\f1 \\ud83d\\udcda books\ - -\f0 \uc0\u55357 \u56539 -\f1 \\ud83d\\udcdb name badge\ - -\f0 \uc0\u55357 \u56540 -\f1 \\ud83d\\udcdc scroll\ - -\f0 \uc0\u55357 \u56541 -\f1 \\ud83d\\udcdd memo\ - -\f0 \uc0\u55357 \u56542 -\f1 \\ud83d\\udcde telephone receiver\ - -\f0 \uc0\u55357 \u56543 -\f1 \\ud83d\\udcdf pager\ - -\f0 \uc0\u55357 \u56544 -\f1 \\ud83d\\udce0 fax machine\ - -\f0 \uc0\u55357 \u56545 -\f1 \\ud83d\\udce1 satellite antenna\ - -\f0 \uc0\u55357 \u56546 -\f1 \\ud83d\\udce2 public address loudspeaker\ - -\f0 \uc0\u55357 \u56547 -\f1 \\ud83d\\udce3 cheering megaphone\ - -\f0 \uc0\u55357 \u56548 -\f1 \\ud83d\\udce4 outbox tray\ - -\f0 \uc0\u55357 \u56549 -\f1 \\ud83d\\udce5 inbox tray\ - -\f0 \uc0\u55357 \u56550 -\f1 \\ud83d\\udce6 package\ - -\f0 \uc0\u55357 \u56551 -\f1 \\ud83d\\udce7 e-mail symbol\ - -\f0 \uc0\u55357 \u56552 -\f1 \\ud83d\\udce8 incoming envelope\ - -\f0 \uc0\u55357 \u56553 -\f1 \\ud83d\\udce9 envelope with downwards arrow above\ - -\f0 \uc0\u55357 \u56554 -\f1 \\ud83d\\udcea closed mailbox with lowered flag\ - -\f0 \uc0\u55357 \u56555 -\f1 \\ud83d\\udceb closed mailbox with raised flag\ - -\f0 \uc0\u55357 \u56558 -\f1 \\ud83d\\udcee postbox\ - -\f0 \uc0\u55357 \u56560 -\f1 \\ud83d\\udcf0 newspaper\ - -\f0 \uc0\u55357 \u56561 -\f1 \\ud83d\\udcf1 mobile phone\ - -\f0 \uc0\u55357 \u56562 -\f1 \\ud83d\\udcf2 mobile phone with rightwards arrow at left\ - -\f0 \uc0\u55357 \u56563 -\f1 \\ud83d\\udcf3 vibration mode\ - -\f0 \uc0\u55357 \u56564 -\f1 \\ud83d\\udcf4 mobile phone off\ - -\f0 \uc0\u55357 \u56566 -\f1 \\ud83d\\udcf6 antenna with bars\ - -\f0 \uc0\u55357 \u56567 -\f1 \\ud83d\\udcf7 camera\ - -\f0 \uc0\u55357 \u56569 -\f1 \\ud83d\\udcf9 video camera\ - -\f0 \uc0\u55357 \u56570 -\f1 \\ud83d\\udcfa television\ - -\f0 \uc0\u55357 \u56571 -\f1 \\ud83d\\udcfb radio\ - -\f0 \uc0\u55357 \u56572 -\f1 \\ud83d\\udcfc videocassette\ - -\f0 \uc0\u55357 \u56579 -\f1 \\ud83d\\udd03 clockwise downwards and upwards open circle arrows\ - -\f0 \uc0\u55357 \u56586 -\f1 \\ud83d\\udd0a speaker with three sound waves\ - -\f0 \uc0\u55357 \u56587 -\f1 \\ud83d\\udd0b battery\ - -\f0 \uc0\u55357 \u56588 -\f1 \\ud83d\\udd0c electric plug\ - -\f0 \uc0\u55357 \u56589 -\f1 \\ud83d\\udd0d left-pointing magnifying glass\ - -\f0 \uc0\u55357 \u56590 -\f1 \\ud83d\\udd0e right-pointing magnifying glass\ - -\f0 \uc0\u55357 \u56591 -\f1 \\ud83d\\udd0f lock with ink pen\ - -\f0 \uc0\u55357 \u56592 -\f1 \\ud83d\\udd10 closed lock with key\ - -\f0 \uc0\u55357 \u56593 -\f1 \\ud83d\\udd11 key\ - -\f0 \uc0\u55357 \u56594 -\f1 \\ud83d\\udd12 lock\ - -\f0 \uc0\u55357 \u56595 -\f1 \\ud83d\\udd13 open lock\ - -\f0 \uc0\u55357 \u56596 -\f1 \\ud83d\\udd14 bell\ - -\f0 \uc0\u55357 \u56598 -\f1 \\ud83d\\udd16 bookmark\ - -\f0 \uc0\u55357 \u56599 -\f1 \\ud83d\\udd17 link symbol\ - -\f0 \uc0\u55357 \u56600 -\f1 \\ud83d\\udd18 radio button\ - -\f0 \uc0\u55357 \u56601 -\f1 \\ud83d\\udd19 back with leftwards arrow above\ - -\f0 \uc0\u55357 \u56602 -\f1 \\ud83d\\udd1a end with leftwards arrow above\ - -\f0 \uc0\u55357 \u56603 -\f1 \\ud83d\\udd1b on with exclamation mark with left right arrow above\ - -\f0 \uc0\u55357 \u56604 -\f1 \\ud83d\\udd1c soon with rightwards arrow above\ - -\f0 \uc0\u55357 \u56605 -\f1 \\ud83d\\udd1d top with upwards arrow above\ - -\f0 \uc0\u55357 \u56606 -\f1 \\ud83d\\udd1e no one under eighteen symbol\ - -\f0 \uc0\u55357 \u56607 -\f1 \\ud83d\\udd1f keycap ten\ - -\f0 \uc0\u55357 \u56608 -\f1 \\ud83d\\udd20 input symbol for latin capital letters\ - -\f0 \uc0\u55357 \u56609 -\f1 \\ud83d\\udd21 input symbol for latin small letters\ - -\f0 \uc0\u55357 \u56610 -\f1 \\ud83d\\udd22 input symbol for numbers\ - -\f0 \uc0\u55357 \u56611 -\f1 \\ud83d\\udd23 input symbol for symbols\ - -\f0 \uc0\u55357 \u56612 -\f1 \\ud83d\\udd24 input symbol for latin letters\ - -\f0 \uc0\u55357 \u56613 -\f1 \\ud83d\\udd25 fire\ - -\f0 \uc0\u55357 \u56614 -\f1 \\ud83d\\udd26 electric torch\ - -\f0 \uc0\u55357 \u56615 -\f1 \\ud83d\\udd27 wrench\ - -\f0 \uc0\u55357 \u56616 -\f1 \\ud83d\\udd28 hammer\ - -\f0 \uc0\u55357 \u56617 -\f1 \\ud83d\\udd29 nut and bolt\ - -\f0 \uc0\u55357 \u56618 -\f1 \\ud83d\\udd2a hocho\ - -\f0 \uc0\u55357 \u56619 -\f1 \\ud83d\\udd2b pistol\ - -\f0 \uc0\u55357 \u56622 -\f1 \\ud83d\\udd2e crystal ball\ - -\f0 \uc0\u55357 \u56623 -\f1 \\ud83d\\udd2f six pointed star with middle dot\ - -\f0 \uc0\u55357 \u56624 -\f1 \\ud83d\\udd30 japanese symbol for beginner\ - -\f0 \uc0\u55357 \u56625 -\f1 \\ud83d\\udd31 trident emblem\ - -\f0 \uc0\u55357 \u56626 -\f1 \\ud83d\\udd32 black square button\ - -\f0 \uc0\u55357 \u56627 -\f1 \\ud83d\\udd33 white square button\ - -\f0 \uc0\u55357 \u56628 -\f1 \\ud83d\\udd34 large red circle\ - -\f0 \uc0\u55357 \u56629 -\f1 \\ud83d\\udd35 large blue circle\ - -\f0 \uc0\u55357 \u56630 -\f1 \\ud83d\\udd36 large orange diamond\ - -\f0 \uc0\u55357 \u56631 -\f1 \\ud83d\\udd37 large blue diamond\ - -\f0 \uc0\u55357 \u56632 -\f1 \\ud83d\\udd38 small orange diamond\ - -\f0 \uc0\u55357 \u56633 -\f1 \\ud83d\\udd39 small blue diamond\ - -\f0 \uc0\u55357 \u56634 -\f1 \\ud83d\\udd3a up-pointing red triangle\ - -\f0 \uc0\u55357 \u56635 -\f1 \\ud83d\\udd3b down-pointing red triangle\ - -\f0 \uc0\u55357 \u56636 -\f1 \\ud83d\\udd3c up-pointing small red triangle\ - -\f0 \uc0\u55357 \u56637 -\f1 \\ud83d\\udd3d down-pointing small red triangle\ - -\f0 \uc0\u55357 \u56656 -\f1 \\ud83d\\udd50 clock face one oclock\ - -\f0 \uc0\u55357 \u56657 -\f1 \\ud83d\\udd51 clock face two oclock\ - -\f0 \uc0\u55357 \u56658 -\f1 \\ud83d\\udd52 clock face three oclock\ - -\f0 \uc0\u55357 \u56659 -\f1 \\ud83d\\udd53 clock face four oclock\ - -\f0 \uc0\u55357 \u56660 -\f1 \\ud83d\\udd54 clock face five oclock\ - -\f0 \uc0\u55357 \u56661 -\f1 \\ud83d\\udd55 clock face six oclock\ - -\f0 \uc0\u55357 \u56662 -\f1 \\ud83d\\udd56 clock face seven oclock\ - -\f0 \uc0\u55357 \u56663 -\f1 \\ud83d\\udd57 clock face eight oclock\ - -\f0 \uc0\u55357 \u56664 -\f1 \\ud83d\\udd58 clock face nine oclock\ - -\f0 \uc0\u55357 \u56665 -\f1 \\ud83d\\udd59 clock face ten oclock\ - -\f0 \uc0\u55357 \u56666 -\f1 \\ud83d\\udd5a clock face eleven oclock\ - -\f0 \uc0\u55357 \u56667 -\f1 \\ud83d\\udd5b clock face twelve oclock\ - -\f0 \uc0\u55357 \u56827 -\f1 \\ud83d\\uddfb mount fuji\ - -\f0 \uc0\u55357 \u56828 -\f1 \\ud83d\\uddfc tokyo tower\ - -\f0 \uc0\u55357 \u56829 -\f1 \\ud83d\\uddfd statue of liberty\ - -\f0 \uc0\u55357 \u56830 -\f1 \\ud83d\\uddfe silhouette of japan\ - -\f0 \uc0\u55357 \u56831 -\f1 \\ud83d\\uddff moyai\ - -\f0 \uc0\u55357 \u56832 -\f1 \\ud83d\\ude00 grinning face\ - -\f0 \uc0\u55357 \u56839 -\f1 \\ud83d\\ude07 smiling face with halo\ - -\f0 \uc0\u55357 \u56840 -\f1 \\ud83d\\ude08 smiling face with horns\ - -\f0 \uc0\u55357 \u56846 -\f1 \\ud83d\\ude0e smiling face with sunglasses\ - -\f0 \uc0\u55357 \u56848 -\f1 \\ud83d\\ude10 neutral face\ - -\f0 \uc0\u55357 \u56849 -\f1 \\ud83d\\ude11 expressionless face\ - -\f0 \uc0\u55357 \u56853 -\f1 \\ud83d\\ude15 confused face\ - -\f0 \uc0\u55357 \u56855 -\f1 \\ud83d\\ude17 kissing face\ - -\f0 \uc0\u55357 \u56857 -\f1 \\ud83d\\ude19 kissing face with smiling eyes\ - -\f0 \uc0\u55357 \u56859 -\f1 \\ud83d\\ude1b face with stuck-out tongue\ - -\f0 \uc0\u55357 \u56863 -\f1 \\ud83d\\ude1f worried face\ - -\f0 \uc0\u55357 \u56870 -\f1 \\ud83d\\ude26 frowning face with open mouth\ - -\f0 \uc0\u55357 \u56871 -\f1 \\ud83d\\ude27 anguished face\ - -\f0 \uc0\u55357 \u56876 -\f1 \\ud83d\\ude2c grimacing face\ - -\f0 \uc0\u55357 \u56878 -\f1 \\ud83d\\ude2e face with open mouth\ - -\f0 \uc0\u55357 \u56879 -\f1 \\ud83d\\ude2f hushed face\ - -\f0 \uc0\u55357 \u56884 -\f1 \\ud83d\\ude34 sleeping face\ - -\f0 \uc0\u55357 \u56886 -\f1 \\ud83d\\ude36 face without mouth\ - -\f0 \uc0\u55357 \u56961 -\f1 \\ud83d\\ude81 helicopter\ - -\f0 \uc0\u55357 \u56962 -\f1 \\ud83d\\ude82 steam locomotive\ - -\f0 \uc0\u55357 \u56966 -\f1 \\ud83d\\ude86 train\ - -\f0 \uc0\u55357 \u56968 -\f1 \\ud83d\\ude88 light rail\ - -\f0 \uc0\u55357 \u56970 -\f1 \\ud83d\\ude8a tram\ - -\f0 \uc0\u55357 \u56973 -\f1 \\ud83d\\ude8d oncoming bus\ - -\f0 \uc0\u55357 \u56974 -\f1 \\ud83d\\ude8e trolleybus\ - -\f0 \uc0\u55357 \u56976 -\f1 \\ud83d\\ude90 minibus\ - -\f0 \uc0\u55357 \u56980 -\f1 \\ud83d\\ude94 oncoming police car\ - -\f0 \uc0\u55357 \u56982 -\f1 \\ud83d\\ude96 oncoming taxi\ - -\f0 \uc0\u55357 \u56984 -\f1 \\ud83d\\ude98 oncoming automobile\ - -\f0 \uc0\u55357 \u56987 -\f1 \\ud83d\\ude9b articulated lorry\ - -\f0 \uc0\u55357 \u56988 -\f1 \\ud83d\\ude9c tractor\ - -\f0 \uc0\u55357 \u56989 -\f1 \\ud83d\\ude9d monorail\ - -\f0 \uc0\u55357 \u56990 -\f1 \\ud83d\\ude9e mountain railway\ - -\f0 \uc0\u55357 \u56991 -\f1 \\ud83d\\ude9f suspension railway\ - -\f0 \uc0\u55357 \u56992 -\f1 \\ud83d\\udea0 mountain cableway\ - -\f0 \uc0\u55357 \u56993 -\f1 \\ud83d\\udea1 aerial tramway\ - -\f0 \uc0\u55357 \u56995 -\f1 \\ud83d\\udea3 rowboat\ - -\f0 \uc0\u55357 \u56998 -\f1 \\ud83d\\udea6 vertical traffic light\ - -\f0 \uc0\u55357 \u57006 -\f1 \\ud83d\\udeae put litter in its place symbol\ - -\f0 \uc0\u55357 \u57007 -\f1 \\ud83d\\udeaf do not litter symbol\ - -\f0 \uc0\u55357 \u57008 -\f1 \\ud83d\\udeb0 potable water symbol\ - -\f0 \uc0\u55357 \u57009 -\f1 \\ud83d\\udeb1 non-potable water symbol\ - -\f0 \uc0\u55357 \u57011 -\f1 \\ud83d\\udeb3 no bicycles\ - -\f0 \uc0\u55357 \u57012 -\f1 \\ud83d\\udeb4 bicyclist\ - -\f0 \uc0\u55357 \u57013 -\f1 \\ud83d\\udeb5 mountain bicyclist\ - -\f0 \uc0\u55357 \u57015 -\f1 \\ud83d\\udeb7 no pedestrians\ - -\f0 \uc0\u55357 \u57016 -\f1 \\ud83d\\udeb8 children crossing\ - -\f0 \uc0\u55357 \u57023 -\f1 \\ud83d\\udebf shower\ - -\f0 \uc0\u55357 \u57025 -\f1 \\ud83d\\udec1 bathtub\ - -\f0 \uc0\u55357 \u57026 -\f1 \\ud83d\\udec2 passport control\ - -\f0 \uc0\u55357 \u57027 -\f1 \\ud83d\\udec3 customs\ - -\f0 \uc0\u55357 \u57028 -\f1 \\ud83d\\udec4 baggage claim\ - -\f0 \uc0\u55357 \u57029 -\f1 \\ud83d\\udec5 left luggage\ - -\f0 \uc0\u55356 \u57101 -\f1 \\ud83c\\udf0d earth globe europe-africa\ - -\f0 \uc0\u55356 \u57102 -\f1 \\ud83c\\udf0e earth globe americas\ - -\f0 \uc0\u55356 \u57104 -\f1 \\ud83c\\udf10 globe with meridians\ - -\f0 \uc0\u55356 \u57106 -\f1 \\ud83c\\udf12 waxing crescent moon symbol\ - -\f0 \uc0\u55356 \u57110 -\f1 \\ud83c\\udf16 waning gibbous moon symbol\ - -\f0 \uc0\u55356 \u57111 -\f1 \\ud83c\\udf17 last quarter moon symbol\ - -\f0 \uc0\u55356 \u57112 -\f1 \\ud83c\\udf18 waning crescent moon symbol\ - -\f0 \uc0\u55356 \u57114 -\f1 \\ud83c\\udf1a new moon with face\ - -\f0 \uc0\u55356 \u57116 -\f1 \\ud83c\\udf1c last quarter moon with face\ - -\f0 \uc0\u55356 \u57117 -\f1 \\ud83c\\udf1d full moon with face\ - -\f0 \uc0\u55356 \u57118 -\f1 \\ud83c\\udf1e sun with face\ - -\f0 \uc0\u55356 \u57138 -\f1 \\ud83c\\udf32 evergreen tree\ - -\f0 \uc0\u55356 \u57139 -\f1 \\ud83c\\udf33 deciduous tree\ - -\f0 \uc0\u55356 \u57163 -\f1 \\ud83c\\udf4b lemon\ - -\f0 \uc0\u55356 \u57168 -\f1 \\ud83c\\udf50 pear\ - -\f0 \uc0\u55356 \u57212 -\f1 \\ud83c\\udf7c baby bottle\ - -\f0 \uc0\u55356 \u57287 -\f1 \\ud83c\\udfc7 horse racing\ - -\f0 \uc0\u55356 \u57289 -\f1 \\ud83c\\udfc9 rugby football\ - -\f0 \uc0\u55356 \u57316 -\f1 \\ud83c\\udfe4 european post office\ - -\f0 \uc0\u55357 \u56320 -\f1 \\ud83d\\udc00 rat\ - -\f0 \uc0\u55357 \u56321 -\f1 \\ud83d\\udc01 mouse\ - -\f0 \uc0\u55357 \u56322 -\f1 \\ud83d\\udc02 ox\ - -\f0 \uc0\u55357 \u56323 -\f1 \\ud83d\\udc03 water buffalo\ - -\f0 \uc0\u55357 \u56324 -\f1 \\ud83d\\udc04 cow\ - -\f0 \uc0\u55357 \u56325 -\f1 \\ud83d\\udc05 tiger\ - -\f0 \uc0\u55357 \u56326 -\f1 \\ud83d\\udc06 leopard\ - -\f0 \uc0\u55357 \u56327 -\f1 \\ud83d\\udc07 rabbit\ - -\f0 \uc0\u55357 \u56328 -\f1 \\ud83d\\udc08 cat\ - -\f0 \uc0\u55357 \u56329 -\f1 \\ud83d\\udc09 dragon\ - -\f0 \uc0\u55357 \u56330 -\f1 \\ud83d\\udc0a crocodile\ - -\f0 \uc0\u55357 \u56331 -\f1 \\ud83d\\udc0b whale\ - -\f0 \uc0\u55357 \u56335 -\f1 \\ud83d\\udc0f ram\ - -\f0 \uc0\u55357 \u56336 -\f1 \\ud83d\\udc10 goat\ - -\f0 \uc0\u55357 \u56339 -\f1 \\ud83d\\udc13 rooster\ - -\f0 \uc0\u55357 \u56341 -\f1 \\ud83d\\udc15 dog\ - -\f0 \uc0\u55357 \u56342 -\f1 \\ud83d\\udc16 pig\ - -\f0 \uc0\u55357 \u56362 -\f1 \\ud83d\\udc2a dromedary camel\ - -\f0 \uc0\u55357 \u56421 -\f1 \\ud83d\\udc65 busts in silhouette\ - -\f0 \uc0\u55357 \u56428 -\f1 \\ud83d\\udc6c two men holding hands\ - -\f0 \uc0\u55357 \u56429 -\f1 \\ud83d\\udc6d two women holding hands\ - -\f0 \uc0\u55357 \u56493 -\f1 \\ud83d\\udcad thought balloon\ - -\f0 \uc0\u55357 \u56502 -\f1 \\ud83d\\udcb6 banknote with euro sign\ - -\f0 \uc0\u55357 \u56503 -\f1 \\ud83d\\udcb7 banknote with pound sign\ - -\f0 \uc0\u55357 \u56556 -\f1 \\ud83d\\udcec open mailbox with raised flag\ - -\f0 \uc0\u55357 \u56557 -\f1 \\ud83d\\udced open mailbox with lowered flag\ - -\f0 \uc0\u55357 \u56559 -\f1 \\ud83d\\udcef postal horn\ - -\f0 \uc0\u55357 \u56565 -\f1 \\ud83d\\udcf5 no mobile phones\ - -\f0 \uc0\u55357 \u56576 -\f1 \\ud83d\\udd00 twisted rightwards arrows\ - -\f0 \uc0\u55357 \u56577 -\f1 \\ud83d\\udd01 clockwise rightwards and leftwards open circle arrows\ - -\f0 \uc0\u55357 \u56578 -\f1 \\ud83d\\udd02 clockwise rightwards and leftwards open circle arrows with circled one overlay\ - -\f0 \uc0\u55357 \u56580 -\f1 \\ud83d\\udd04 anticlockwise downwards and upwards open circle arrows\ - -\f0 \uc0\u55357 \u56581 -\f1 \\ud83d\\udd05 low brightness symbol\ - -\f0 \uc0\u55357 \u56582 -\f1 \\ud83d\\udd06 high brightness symbol\ - -\f0 \uc0\u55357 \u56583 -\f1 \\ud83d\\udd07 speaker with cancellation stroke\ - -\f0 \uc0\u55357 \u56585 -\f1 \\ud83d\\udd09 speaker with one sound wave\ - -\f0 \uc0\u55357 \u56597 -\f1 \\ud83d\\udd15 bell with cancellation stroke\ - -\f0 \uc0\u55357 \u56620 -\f1 \\ud83d\\udd2c microscope\ - -\f0 \uc0\u55357 \u56621 -\f1 \\ud83d\\udd2d telescope\ - -\f0 \uc0\u55357 \u56668 -\f1 \\ud83d\\udd5c clock face one-thirty\ - -\f0 \uc0\u55357 \u56669 -\f1 \\ud83d\\udd5d clock face two-thirty\ - -\f0 \uc0\u55357 \u56670 -\f1 \\ud83d\\udd5e clock face three-thirty\ - -\f0 \uc0\u55357 \u56671 -\f1 \\ud83d\\udd5f clock face four-thirty\ - -\f0 \uc0\u55357 \u56672 -\f1 \\ud83d\\udd60 clock face five-thirty\ - -\f0 \uc0\u55357 \u56673 -\f1 \\ud83d\\udd61 clock face six-thirty\ - -\f0 \uc0\u55357 \u56674 -\f1 \\ud83d\\udd62 clock face seven-thirty\ - -\f0 \uc0\u55357 \u56675 -\f1 \\ud83d\\udd63 clock face eight-thirty\ - -\f0 \uc0\u55357 \u56676 -\f1 \\ud83d\\udd64 clock face nine-thirty\ - -\f0 \uc0\u55357 \u56677 -\f1 \\ud83d\\udd65 clock face ten-thirty\ - -\f0 \uc0\u55357 \u56678 -\f1 \\ud83d\\udd66 clock face eleven-thirty\ - -\f0 \uc0\u55357 \u56679 -\f1 \\ud83d\\udd67 clock face twelve-thirty} \ No newline at end of file From 512264119d8d695fe8e2844520f06ec7f525dd90 Mon Sep 17 00:00:00 2001 From: Samuel H Leclerc Date: Sun, 15 Sep 2019 15:27:38 +0000 Subject: [PATCH 120/359] Fixed typo in error message displayed --- src/js/git/commands.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/js/git/commands.js b/src/js/git/commands.js index 9861f763..008fc48b 100644 --- a/src/js/git/commands.js +++ b/src/js/git/commands.js @@ -83,7 +83,7 @@ var assertOriginSpecified = function(generalArgs) { if (generalArgs[0] !== 'origin') { throw new GitError({ msg: intl.todo( - generalArgs[0] + ' is not a remote in your repository! try adding origin that argument' + generalArgs[0] + ' is not a remote in your repository! try adding origin to that argument' ) }); } @@ -823,14 +823,14 @@ var commandConfig = { var tagToRemove; assertIsRef(engine, tagID); - + command.oneArgImpliedHead(tagID); engine.tagCollection.each(function(tag) { if(tag.get('id') == tagID){ tagToRemove = tag; } }, true); - + if(tagToRemove == undefined){ throw new GitError({ msg: intl.todo( @@ -841,7 +841,7 @@ var commandConfig = { engine.tagCollection.remove(tagToRemove); delete engine.refs[tagID]; - + engine.gitVisuals.refreshTree(); return; } From 9e4e79323a16745430d26ceff3c96cf012b3da69 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 16 Sep 2019 21:35:18 +0200 Subject: [PATCH 121/359] Change upper value in 'git-error-args-few' string to lower --- src/js/intl/strings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js index b7c2c416..2b27a9ca 100755 --- a/src/js/intl/strings.js +++ b/src/js/intl/strings.js @@ -592,7 +592,7 @@ exports.strings = { 'es_ES': 'Espero al menos {lower} parámetros para {what}.', 'pt_BR': 'Espero pelo menos {lower} parâmetros para {what}', 'gl' : 'Agardo polo menos {lower} parámetros para {what}', - 'fr_FR': 'J\'attends au moins {upper} argument(s) pour {what}', + 'fr_FR': 'J\'attends au moins {lower} argument(s) pour {what}', 'ru_RU': 'Ожидается как минимум {lower} аргументов для {what}', 'uk': 'Я очікую як мінімум {lower} аргумент(ів) для {what}', 'ko': '{what}을 위해 최소 {lower}개의 인자를 받습니다.' From ec1690fdcdaee34696ad645ab6f2f3ed1fec42ab Mon Sep 17 00:00:00 2001 From: Daniel Zabari Date: Thu, 19 Sep 2019 14:10:35 -0400 Subject: [PATCH 122/359] Update index.js this is a HUGE missed opportunity for a pun, and I think the pun fits better with the tone of the site generally --- src/levels/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/index.js b/src/levels/index.js index 957193c7..922bfabf 100644 --- a/src/levels/index.js +++ b/src/levels/index.js @@ -190,7 +190,7 @@ var sequenceInfo = exports.sequenceInfo = { 'uk' : 'Переміщуємо роботу туди-сюди' }, about: { - 'en_US': 'Get comfortable with modifying the source tree', + 'en_US': 'Git comfortable with modifying the source tree', 'de_DE': 'Gewöhn dich daran, den Git-Baum zu verändern', 'fr_FR': 'Soyez à l\'aise pour modifier l\'arbre Git', 'es_AR': 'Ponete cómodo con modificar el directorio fuente', From 25bc2350d2f951053c39e2752c0c883db35f71b4 Mon Sep 17 00:00:00 2001 From: Daniel Zabari Date: Fri, 20 Sep 2019 17:30:09 -0400 Subject: [PATCH 123/359] Update index.js made it clear that this is not a typo :P --- src/levels/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/index.js b/src/levels/index.js index 922bfabf..5d343e2a 100644 --- a/src/levels/index.js +++ b/src/levels/index.js @@ -190,7 +190,7 @@ var sequenceInfo = exports.sequenceInfo = { 'uk' : 'Переміщуємо роботу туди-сюди' }, about: { - 'en_US': 'Git comfortable with modifying the source tree', + 'en_US': '"Git" comfortable with modifying the source tree :P', 'de_DE': 'Gewöhn dich daran, den Git-Baum zu verändern', 'fr_FR': 'Soyez à l\'aise pour modifier l\'arbre Git', 'es_AR': 'Ponete cómodo con modificar el directorio fuente', From f245c97a1b10cf5a87663e71c3edee3b4da308c7 Mon Sep 17 00:00:00 2001 From: hongarc Date: Sun, 22 Sep 2019 09:19:15 +0700 Subject: [PATCH 124/359] Update contributor - top 30 contributor --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d70e865f..efb33dc3 100644 --- a/README.md +++ b/README.md @@ -115,12 +115,14 @@ Alternatively, you can also build and run the app in a pre-configured online wor + + @@ -131,8 +133,6 @@ Alternatively, you can also build and run the app in a pre-configured online wor - - [//]: contributor-faces From fa5638f3b89f3f73cffc82232d926c445d6b5cb8 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Wed, 25 Sep 2019 10:40:43 +0800 Subject: [PATCH 125/359] Resolves #608 -- enforce word boundary --- src/js/sandbox/commands.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/sandbox/commands.js b/src/js/sandbox/commands.js index 7f4e359d..1a4c1365 100644 --- a/src/js/sandbox/commands.js +++ b/src/js/sandbox/commands.js @@ -15,12 +15,12 @@ var Warning = Errors.Warning; var CommandResult = Errors.CommandResult; var instantCommands = [ - [/^ls/, function() { + [/^ls\b/, function() { throw new CommandResult({ msg: intl.str('ls-command') }); }], - [/^cd/, function() { + [/^cd\b/, function() { throw new CommandResult({ msg: intl.str('cd-command') }); From d8ea1dbb5c50b0143e7044e7be5b04ef1d848491 Mon Sep 17 00:00:00 2001 From: hongarc Date: Tue, 24 Sep 2019 23:43:18 +0700 Subject: [PATCH 126/359] fix: get `ls` and `cd` with right way --- src/js/sandbox/commands.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/sandbox/commands.js b/src/js/sandbox/commands.js index 7f4e359d..953d4084 100644 --- a/src/js/sandbox/commands.js +++ b/src/js/sandbox/commands.js @@ -15,12 +15,12 @@ var Warning = Errors.Warning; var CommandResult = Errors.CommandResult; var instantCommands = [ - [/^ls/, function() { + [/^ls( |$)/, function() { throw new CommandResult({ msg: intl.str('ls-command') }); }], - [/^cd/, function() { + [/^cd( |$)/, function() { throw new CommandResult({ msg: intl.str('cd-command') }); From ca846c9d0c32e1b55a9ad625ce3a950d33afbe97 Mon Sep 17 00:00:00 2001 From: Philip Enchin Date: Thu, 3 Oct 2019 12:47:56 -0400 Subject: [PATCH 127/359] Disable "git fakeTeamwork" in push level (remote6) --- src/levels/remote/push.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/levels/remote/push.js b/src/levels/remote/push.js index 9377579e..92a3f681 100644 --- a/src/levels/remote/push.js +++ b/src/levels/remote/push.js @@ -1,4 +1,7 @@ exports.level = { + "disabledMap": { + "git fakeTeamwork": true, + }, "goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C3\",\"id\":\"master\",\"remoteTrackingBranchID\":\"o/master\",\"localBranchesThatTrackThis\":null},\"o/master\":{\"target\":\"C3\",\"id\":\"o/master\",\"remoteTrackingBranchID\":null,\"localBranchesThatTrackThis\":[\"master\"]}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C2\"],\"id\":\"C3\"}},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"},\"originTree\":{\"branches\":{\"master\":{\"target\":\"C3\",\"id\":\"master\",\"remoteTrackingBranchID\":null,\"localBranchesThatTrackThis\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C2\"],\"id\":\"C3\"}},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}}", "solutionCommand": "git commit;git commit;git push", "startTree": "{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":\"o/master\"},\"o/master\":{\"target\":\"C1\",\"id\":\"o/master\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"}},\"tags\":{},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"},\"originTree\":{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"}},\"tags\":{},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}}", From 2f938ffd50b8dc439b4a8bbe859f9aa55ffea113 Mon Sep 17 00:00:00 2001 From: Philip Enchin Date: Thu, 3 Oct 2019 14:28:30 -0400 Subject: [PATCH 128/359] Disable "git branch" and "git checkout" in source nothing level (remoteAdvanced7) --- src/levels/remote/sourceNothing.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/levels/remote/sourceNothing.js b/src/levels/remote/sourceNothing.js index d94359be..7b7e58c0 100644 --- a/src/levels/remote/sourceNothing.js +++ b/src/levels/remote/sourceNothing.js @@ -1,4 +1,8 @@ exports.level = { + "disabledMap": { + "git branch": true, + "git checkout": true + }, "goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":\"o/master\"},\"o/master\":{\"target\":\"C1\",\"id\":\"o/master\",\"remoteTrackingBranchID\":null},\"bar\":{\"target\":\"C1\",\"id\":\"bar\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"}},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"},\"originTree\":{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"}},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}}", "solutionCommand": "git push origin :foo;git fetch origin :bar", "startTree": "{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":\"o/master\"},\"o/master\":{\"target\":\"C1\",\"id\":\"o/master\",\"remoteTrackingBranchID\":null},\"o/foo\":{\"target\":\"C1\",\"id\":\"o/foo\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"}},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"},\"originTree\":{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":null},\"foo\":{\"target\":\"C1\",\"id\":\"foo\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"}},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}}", From 8fdcdb544448a772c6641fc22352e67df4ce01c0 Mon Sep 17 00:00:00 2001 From: "Andreas Neumann (e007186)" Date: Wed, 16 Oct 2019 18:30:36 +0200 Subject: [PATCH 129/359] german text corrected --- src/levels/remote/pushArgs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/remote/pushArgs.js b/src/levels/remote/pushArgs.js index c7d72ea9..f1810aec 100644 --- a/src/levels/remote/pushArgs.js +++ b/src/levels/remote/pushArgs.js @@ -610,7 +610,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Ok, in diesem Level lass und sowohl `foo` als auch `master` auf dem Remote aktualisieren. Um's spannender zu machen, ist `git checkout` in diesem Level deaktiviert." + "Ok, in diesem Level lass uns sowohl `foo` als auch `master` auf dem Remote aktualisieren. Um's spannender zu machen, ist `git checkout` in diesem Level deaktiviert." ] } } From bd98c4a6b28be713dfdb4c8c9d5f6b4542e13371 Mon Sep 17 00:00:00 2001 From: "Andreas Neumann (e007186)" Date: Wed, 16 Oct 2019 18:35:57 +0200 Subject: [PATCH 130/359] increase readability of german text --- src/levels/remote/fetchArgs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/remote/fetchArgs.js b/src/levels/remote/fetchArgs.js index da9882a1..ee0bccd9 100644 --- a/src/levels/remote/fetchArgs.js +++ b/src/levels/remote/fetchArgs.js @@ -954,7 +954,7 @@ exports.level = { "markdowns": [ "Wenn das so ist, was passiert dann wenn ich explizit Quelle und Ziel im Ort angebe?", "", - "Wenn du Commits wirklich per `fetch` *direkt* auf einen lokalen Branch holen willst, dann, ja, kannst du das mit einer Ref-Spezifikation erreichen. Das funktioniert nicht mit deinem gerade ausgecheckten Branch, aber davon abgesehen lässt Git es zu.", + "Wenn du Commits wirklich per `fetch` *direkt* auf einen lokalen Branch holen willst, dann kannst du das mit einer Ref-Spezifikation erreichen. Das funktioniert nicht mit deinem gerade ausgecheckten Branch, aber davon abgesehen lässt Git es zu.", "", "Nur ein Haken -- `` bezeichnet jetzt einen Ort auf dem *entfernten* Server und `` ist ein *lokaler* Ort, wo die Commits hin sollen. Es ist genau umgekehrt wie bei `git push` und das ist logisch, denn wir übertragen die Daten ja auch in die umgekehrte Richtung!", "", From e512510e66b6a91ad1ae2880b41f79aa351f1aca Mon Sep 17 00:00:00 2001 From: David Zampino Date: Tue, 22 Oct 2019 16:59:27 -0500 Subject: [PATCH 131/359] Change where HEAD points to match objective --- src/levels/rampup/detachedHead.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/rampup/detachedHead.js b/src/levels/rampup/detachedHead.js index 498c55bd..14c30287 100644 --- a/src/levels/rampup/detachedHead.js +++ b/src/levels/rampup/detachedHead.js @@ -1,7 +1,7 @@ exports.level = { "goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\"},\"bugFix\":{\"target\":\"C4\",\"id\":\"bugFix\"}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"}},\"HEAD\":{\"target\":\"C4\",\"id\":\"HEAD\"}}", "solutionCommand": "git checkout C4", - "startTree": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\"},\"bugFix\":{\"target\":\"C4\",\"id\":\"bugFix\"}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"}},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}", + "startTree": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\"},\"bugFix\":{\"target\":\"C4\",\"id\":\"bugFix\"}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}", "name": { "en_US": "Detach yo' HEAD", "es_AR": "Desatacheá tu HEAD", From 1aa75a27bf4e2ecaa6b78f71d389cc92fe173122 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Sun, 3 Nov 2019 21:21:01 -0800 Subject: [PATCH 132/359] Resolves #618 -- remove todo --- todo.txt | 201 ------------------------------------------------------- 1 file changed, 201 deletions(-) delete mode 100644 todo.txt diff --git a/todo.txt b/todo.txt deleted file mode 100644 index d586514b..00000000 --- a/todo.txt +++ /dev/null @@ -1,201 +0,0 @@ -Big Things -~~~~~~~~~~~~~~~~~~~~~~~~~ -[ ] compare settings for a level!!! integrated into builder... -[ ] casperjs for visuals regression testing? it works with canvas so - it could be a nice way to move super fast with visuals refactoring - -Medium things: -~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[ ] figure out what to do with instant commands (and parse waterfall and the like) -[ ] disable git commands on hg levels (and vice versa) -[ ] capture unexpected exceptions and print - -Small things to implement: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Minor Bugs to fix: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Big Bugs to fix: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Ideas for cleaning -~~~~~~~~~~~~~ - -Done things: -(I only started this on Dec 17th 2012 to get a better sense of what was done) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[x] flip trees upside down from command (look at refresh tree as a way to do this) -[x] make show solution easier -[x] make helper bar clickable with goal vis floating -[x] huge update to level you wrote. that you said is true for - git fetch and git push (basically) but pull is not the same. basically - its going to ignore where you are during the fetch -[x] IDEA!!! just talk about arguments for each command one at a time. build - concept of place first and then expand on it! -[x] FIX the level you came up with -[x] aka fetch + merge, - just like expected. ill probably still update o/master just for sanity - master is the source on the remote and HEAD is the source on local - (place to merge). o/master gets updated regardless -[x] ok say I have branch banana and its one commit ahead of master. if I git - pull origin master while checked out on banana, it fetches those commits - (doesn't update origin/master) and then merges them into banana. -[x] and then "git pull origin banana:origin/banana" works because it goes into - the remote branch and then merges the fetch HEAD with current location -[x] oh boy heres another data point. git fetch banana:banana will actually - fast-forward banana to what remote has, but not update o/banana. weirdly it - doesn't let you do this if you are checked out on banana -[x] furthermore, if banana has commits and its not a FF, it will reject the command. wth?? -[x] test is failing because we create banana when we should only really be creating o/banana -[x] work on TABBED levels layout -[x] EASY -- make colors the same between remote branches and their remote counterparts -[x] fix undo not syncing the remote tracking -[x] get clone as a before command working in demonstration views (related to test infra as well) -[x] importTreeNow fails if origin isn't updated -[x] set checkout -b branch __remoteBranch to track the remote branch -[x] test coverage for hg!!! (in progress) -[x] tree pruning -[x] TONS of hg stuff -[x] finally work on an upload / download animation -[x] factor out golf thing too -[x] factor regexes and instant commands into one module -[x] big command refactor to get everything in one place -[x] get demonstration view to show origin / remote -- z index ugliness -[x] get goal visualization to show origin / remote.... hrm :O -[x] MASSIVE EFFIN REFACTOR of all command options outside of git engine and into separate module -[x] facebook page link :D -[x] tree comparison with origin.... done! not too bad -[x] green refactor tree compare to have map -[x] increase test coverage over everything - - unit and integration, but mostly for git operations -[x] figure out gh-pages force -[x] add visuals and text to show compare method -[x] green refactor tree compare to have map -[x] fix tests by stubbing out animation factory to resolve promises -[x] better git clone and fake teamwork anywhere -[x] git pull animation -[x] use the graph difference algorithm to then implement git push -[x] work on git pull --rebase animation, send down the deferred and it should work? -[x] why is rebase -i broken? don't emulate touch events -[x] tree compare test coverage -[x] remote branch it is tracking (points to a remote branch model) -[x] fix branch -a and branch -r to: show remote branches or all branches -[x] fix branch -f to not allow moving remote branches? -[x] fix checkout to: if you go to __remoteBranch, it just goes to the commit since its read-only. -[x] is remote (custom getter) -[x] hash agnotisc comparison with asserts for amends -[x] level builder intl aware -[x] rest of views/index translation -[x] git/index.js translation -- rest of the strings -[x] next level confirm translation -[x] fix clickthrough when goal is shown -[x] hash agnostic comparison -[x] get automated SHA hash appending in the html source :OOOOO... template? or what?t -[x] import random level JSON -[x] export / import tree from JSON -[x] rebase bug... ugh -[x] bug with weird tree string: -[x] optimistic parsing of level and level builder commands, man that was toughwith circular imports -[x] edit dialog -[x] level builder dialog builder -[x] level builder dialog tester -[x] turn off button clicking for demonstration view :O -[x] text grabber for commands -[x] way to close testing view -[x] allow demonstration view to have git commands beforehand -[x] demonstration builder progress -[x] markdowngrabber -[x] sandbox and level command refresh -[x] level builder finish -[x] level builder? :OOO - * basically just an extension of level (or sandbox), that has commands like - ```save tree beginning``` or ```save tree goal``` and then a final - dialog typing area thingy -[x] vis branch z index reflow bug -[x] fix terminal input field in general -[x] warning for window size -[x] esc on multiview quits absolutely -[x] cross browser support... firefox only LULZ. should be just css right? WRONG -[x] keyboard navigation for level selector -[x] optional multiview on start -[x] local storage for solved map -[x] what if they just type "levels" ? -[x] hookup for when solving happens -[x] levels dropdown selection? -[x] git demonstration view -- shouldn't be too bad. LOL WHAT A FUCKING JOKE like 4 hours -[x] gotoSandbox command -[x] "next level?" dialog after beating level -[x] keyboard input for confirm / cancel -[x] level arbiter (has everything by ID) -[x] flip branches on the sides!! i wonder how to determine... -[x] click handlers on goal visualization for the actual canvas elements -[x] sandbox can launch and takedown levels -[x] TWO epic bugs squashed: - * Raphael process.nextTick needed - * _.debounce on prototype -[x] window zoom alert thing -- this just needs to be timeouted one more time -[x] level teardown -[x] great die for levels -[x] show which level you are in! with a little thing on the top -[x] allow command history to clear finished ones -[x] put in some > into the rules for CSS -[x] fix bug for multiview, i think its from the die() on everyone -[x] fixed bug in command queue -[x] better compare in levels -[x] show solution -[x] show goal -[x] reset for sandbox command -[x] do an after-paper-initialize type thing so we can insert git shim once - git engine is done. -[x] promise-based levels -[x] fixed that to-do entry with the toggle Z thing. now its much more consistent -[x] sandbox a real view now -[x] awesome before and after shims with event baton stealing and passing back -[x] sip from buffer with post-command hooks. ideally the git engine - knows nothing about the level being played -[x] fix tests -[x] transition to deferreds / promises for command callbacks -[x] awesome ability to have dialogs and such handle command processing and block -[x] figure out why multiview baton passing doesn't work... -[x] multiple things can process!!! -[x] move command creation outside of the command view so multiple things - can be responsible for specifying the waterfall associated with a command! -[x] awesome zoom level polling and sweet event baton stealing :DDDDDDDDDDDDDD -[x] then refactor keyboard input and UI.listen() to that event system -[x] make some kind of "single listener" event system... will make keyboard stuff easy - because then you just steal and release for modals and such -[x] text input from the commandPromptView must flow down into - filters. no hacky stuff anymore where it's part of the option parser, - wtf -[x] ok fuckit here is the deal. Command model has minimal logic -- it calls - to a parse waterfall that expands any shortcuts needed, handles any instant - commands, and then finally will handle the dispatching. I think this will be - really nice :D -[x] disabled map for levels -[x] better click events on branches and commits -[x] change to returning a promise for multiview -[x] multiViews with multiple terminals... -[x] debounce the forward and back methods -[x] multiview makes all these arrow views which fire events -[x] markdown parsing yay!! -[x] check animation for command entry fading nicely wtf -[x] no more CSS ids in views -[x] promise-based confirm cancel -[x] rebase buttons view & styling -[x] rebase entries styling -[x] view for anything above the fold (modal view) -[x] rebase styling (get it better. even cuter -- make it like a command window) -[x] fix multiple rebases -[x] z index reflow update -[x] level finish animation -[x] refactor visualization -[x] aliases replace when put into commands -[x] headless Git for testing (send it commands and expected trees) -[x] few tests -[x] Great git test coverage -[x] gitEngine loads from tree immediately, not the weird thing we have now! -[x] nice opacity fade in -[x] clean up require -[x] promise based callback for interactive rebase WITH FAIL awesome - From 3a74fb345d2ebcc5a640a39f16d51cb81b82a0f4 Mon Sep 17 00:00:00 2001 From: edward Date: Thu, 5 Dec 2019 08:26:36 +0700 Subject: [PATCH 133/359] Add Vietnamese language switcher to helperbar. --- src/js/react_views/IntlHelperBarView.jsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/js/react_views/IntlHelperBarView.jsx b/src/js/react_views/IntlHelperBarView.jsx index 411019a8..ee7d0917 100644 --- a/src/js/react_views/IntlHelperBarView.jsx +++ b/src/js/react_views/IntlHelperBarView.jsx @@ -96,6 +96,12 @@ class IntlHelperBarView extends React.Component{ onClick: function() { this.fireCommand('locale uk; levels'); }.bind(this) + }, { + text: 'Tiếng Việt', + testID: 'vietnamese', + onClick: function() { + this.fireCommand('locale vi; levels'); + }.bind(this) }, { text: 'Galego', testID: 'galician', From 7ffb80e1ce2b9229e06b64d28bc52f0aac8f2378 Mon Sep 17 00:00:00 2001 From: edward Date: Thu, 5 Dec 2019 08:27:22 +0700 Subject: [PATCH 134/359] Add translation of index page. --- src/levels/index.js | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/src/levels/index.js b/src/levels/index.js index 5d343e2a..6a42de27 100644 --- a/src/levels/index.js +++ b/src/levels/index.js @@ -65,7 +65,8 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_TW': '基礎篇', 'ko' : 'git 기본', 'ru_RU': 'Введение', - 'uk' : 'Вступ' + 'uk' : 'Вступ', + 'vi' : 'Giới thiệu chuỗi luyện tập' }, about: { 'en_US': 'A nicely paced introduction to the majority of git commands', @@ -79,7 +80,8 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_TW': '循序漸進地介紹 git 主要命令', 'ko' : 'git의 주요 명령어를 깔끔하게 알려드립니다', 'ru_RU': 'Хорошо подобранное введение в основные команды git', - 'uk' : 'Гарно підібране введення в основні команди git' + 'uk' : 'Гарно підібране введення в основні команди git', + 'vi' : 'Bước làm quen độc đáo tới phần lớn lệnh điều khiển git' } }, rampup: { @@ -95,7 +97,8 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_TW': '進階篇', 'ru_RU': 'Едем дальше', 'uk' : 'Їдемо далі', - 'ko' : '다음 단계로' + 'ko' : '다음 단계로', + 'vi' : 'Vượt chướng ngại vật' }, about: { 'en_US': 'The next serving of 100% git awesomes-ness. Hope you\'re hungry', @@ -109,7 +112,8 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_TW': '接下來是 git 非常厲害的地方!相信你已經迫不及待了吧!', 'ru_RU': 'Следующая порция абсолютной git-крутотенюшки. Проголодались?', 'uk' : 'Наступна порція абсолютної git-дивини. Сподіваюсь, ви зголодніли', - 'ko' : 'git은 아주 멋져요. 왜 멋진지 알려드립니다' + 'ko' : 'git은 아주 멋져요. 왜 멋진지 알려드립니다', + 'vi' : 'Những món tuyệt đỉnh tiếp theo. Hi vọng bạn còn đói.' } }, remote: { @@ -126,7 +130,8 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_TW': 'Push & Pull -- Git Remotes!', 'ru_RU': 'Push & Pull - удалённые репозитории в Git!', 'uk' : 'Push & Pull -- віддалені репозиторії в Git!', - 'ko' : 'Push & Pull -- Git 원격 저장소!' + 'ko' : 'Push & Pull -- Git 원격 저장소!', + 'vi' : 'Push & Pull -- Các git remote!' }, about: { 'en_US': 'Time to share your 1\'s and 0\'s kids; coding just got social', @@ -140,7 +145,8 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_TW': '是時候分享你的程式碼了', 'ru_RU': 'Настало время поделиться своими единичками и нулями. Время коллективного программирования', 'uk' : 'Настав час поділитися своїми нулями та одиничками; соціальне програмування', - 'ko' : '내 코드를 공개할 때가 되었습니다. 코드를 공개해봅시다!' + 'ko' : '내 코드를 공개할 때가 되었습니다. 코드를 공개해봅시다!', + 'vi' : 'Chia sẻ đứa con tinh thần 0 và 1 của bạn; mã tới với cộng đồng' } }, remoteAdvanced: { @@ -157,7 +163,8 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_TW': '關於 origin 和其它 repo,git remote 的進階指令', 'ru_RU': 'Через origin – к звёздам. Продвинутое использование Git Remotes', 'uk' : 'Через origin – до зірок. Прогресивне використання Git Remotes', - 'ko' : '"origin"그 너머로 -- 고급 Git 원격 저장소' + 'ko' : '"origin"그 너머로 -- 고급 Git 원격 저장소', + 'vi' : 'Gửi quê hương và các xứ xa -- nâng cao về các git remote' }, about: { 'en_US': 'And you thought being a benevolent dictator would be fun...', @@ -171,7 +178,8 @@ var sequenceInfo = exports.sequenceInfo = { 'de_DE': 'Git Remotes für Fortgeschrittene', 'ru_RU': 'Весело было быть всесильным мудрым правителем...', 'uk' : 'А ти думав, що бути всесильним диктатором весело...', - 'ko' : '자비로운 독재자가 되는게 재밌을 줄 알았겠지만...' + 'ko' : '자비로운 독재자가 되는게 재밌을 줄 알았겠지만...', + 'vi' : 'Làm một tay độc tài toàn năng bác ái cũng vui lắm...' } }, move: { @@ -187,7 +195,8 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_CN': '移动提交记录', 'zh_TW': '調整提交順序', 'ru_RU': 'Перемещаем труды туда-сюда', - 'uk' : 'Переміщуємо роботу туди-сюди' + 'uk' : 'Переміщуємо роботу туди-сюди', + 'vi' : 'Bốc bốc xếp xếp' }, about: { 'en_US': '"Git" comfortable with modifying the source tree :P', @@ -201,7 +210,8 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_CN': '自由修改提交树', 'zh_TW': '自由修改提交樹', 'ru_RU': 'Не стесняйтесь менять историю', - 'uk' : 'Не соромимось змінювати історію' + 'uk' : 'Не соромимось змінювати історію', + 'vi' : 'Chỉnh sửa cây lịch sử Git không hề khó' } }, mixed: { @@ -217,7 +227,8 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_CN': '杂项', 'zh_TW': '活用 git 的指令', 'ru_RU': 'Сборная солянка', - 'uk' : 'Всяке' + 'uk' : 'Всяке', + 'vi' : 'Những trò mèo đáng đồng tiền bát gạo' }, about: { 'en_US': 'A mixed bag of Git techniques, tricks, and tips', @@ -231,7 +242,8 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_CN': 'Git 技术、技巧与贴士大集合', 'zh_TW': 'git 的技術,招數與技巧', 'ru_RU': 'Ассорти из приёмов работы с Git, хитростей и советов', - 'uk' : 'Різні прийоми роботи з Git, хитрощі та поради' + 'uk' : 'Різні прийоми роботи з Git, хитрощі та поради', + 'vi' : 'Các kỹ thuật, bí quyết, và mẹo vặt hữu ích' } }, advanced: { @@ -247,7 +259,8 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_TW': '進階主題', 'ru_RU': 'Продвинутый уровень', 'uk' : 'Досвідчений рівень', - 'ko' : '고급 문제' + 'ko' : '고급 문제', + 'vi' : 'Các chủ đề nâng cao' }, about: { 'en_US': 'For the truly brave!', @@ -261,7 +274,8 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_TW': '來成為真正的強者吧!', 'ru_RU': 'Если ты смелый, ловкий, умелый – потренируйся тут', 'uk' : 'Для хоробрих', - 'ko' : '용기있는 도전자를 위해 준비한 문제입니다' + 'ko' : '용기있는 도전자를 위해 준비한 문제입니다', + 'vi' : 'Mạnh mẽ lên!' } } }; From 886170f6271548c0c806f520b216d43c5e4aabb1 Mon Sep 17 00:00:00 2001 From: duongtiendat1990 <48908567+duongtiendat1990@users.noreply.github.com> Date: Wed, 11 Dec 2019 17:28:29 +0700 Subject: [PATCH 135/359] translate commits.js --- src/levels/intro/commits.js | 48 +++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/src/levels/intro/commits.js b/src/levels/intro/commits.js index 9f74fc72..b86b0228 100644 --- a/src/levels/intro/commits.js +++ b/src/levels/intro/commits.js @@ -11,7 +11,8 @@ exports.level = { 'zh_CN': 'Git Commit', 'zh_TW': '介紹 git commit ', 'ru_RU': 'Знакомство с Git Commit ', - 'uk': 'Знайомство з комітами в Git' + 'uk': 'Знайомство з комітами в Git', + 'vi': 'Giới thiệu về Git Commit' }, "goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C3\",\"id\":\"master\"}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C2\"],\"id\":\"C3\"}},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}", "solutionCommand": "git commit;git commit", @@ -28,7 +29,8 @@ exports.level = { "ja" : "'git commit'コマンドを2回打てば完成!", "ko": "'git commit'이라고 두 번 치세요!", "ru_RU": "Попробуй дважды выполнить команду 'git commit' ;)", - "uk": "Спробуй двічі виконати команду 'git commit' ;)" + "uk": "Спробуй двічі виконати команду 'git commit' ;)", + 'vi': "Đơn giản là cứ gõ 'git commit' 2 lần" }, "disabledMap": { "git revert": true @@ -547,6 +549,48 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Commits", + "Một commit trong một git repository(kho chứa) lưu trữ một ảnh chụp của tất cả các file trong thư mục của bạn. Như kiểu copy và paste cõ bự, thậm chí còn tốt hơn thế!", + "", + "Thế nhưng Git muốn giữ cho các commit nhẹ hết mức có thể, cho nên git không copy tất cả thư mục một cách mù quáng mỗi khi bạn commit. Nó có thể(khi khả dĩ) nén commit như một tập hợp các thay đổi, hay là một \"bản so sánh\", giũa một phiên bản kho chứa git với phiên bản tiếp theo.", + "", + "Đồng thời Git cũng lưu trữ lịch sử commit nào được tạo ra lúc nào. Đó là tại sao hầu hết các commit có commit tổ tiên phía trên nó -- chúng tôi đã hình tượng hóa mối quan hệ này bằng các mũi tên. Trong cộng tác nhóm thì việc gìn giữ lịch sử là rất có ích!", + "", + "Có vẻ là hơi nhiều lý thuyết rồi, bây giờ bạn chỉ cần hiều các commit là các lát cắt của dự án. Các commit rất nhẹ nên việc chuyển qua lại giữa chúng thì nhanh vô cùng!" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Thử thực hành chút nào. Ở bên phải chúng ta có mô tả một kho git (nhỏ). Hiện tại đang có 2 commit, một là commit khởi nguyên `C0`, và một commit sau đó `C1` có thể đã có một vài thay đổi.", + "", + "Bấm nút bên dưới để tạo một commit mới" + ], + "afterMarkdowns": [ + "Đúng rồi! Tuyệt vời. Bạn vừa tạo thay đổi cho kho chứa và lưu vào commit. Cái commit bạn vừa tạo nó có cha, là `C1` đấy, là commit mà nó được tạo ra từ đó." + ], + "command": "git commit", + "beforeCommand": "" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Nào bây giờ thì thử tự làm bài tập nào! Sau khi đóng cửa sổ này, tạo ra 2 commit để hoàn thành cấp độ" + ] + } + } + ] } } }; From cbed632b74e6171b8846a3444477954b4c0f9acd Mon Sep 17 00:00:00 2001 From: flyingbot91 Date: Wed, 11 Dec 2019 23:31:52 +0100 Subject: [PATCH 136/359] Translated 'intro' levels to Spanish 'es_ES' --- src/levels/intro/branching.js | 80 +++++++++++++++++++++++++++++++++++ src/levels/intro/commits.js | 44 +++++++++++++++++++ src/levels/intro/merging.js | 71 +++++++++++++++++++++++++++++++ src/levels/intro/rebasing.js | 69 ++++++++++++++++++++++++++++++ 4 files changed, 264 insertions(+) diff --git a/src/levels/intro/branching.js b/src/levels/intro/branching.js index 7ecdc005..7294e7d7 100644 --- a/src/levels/intro/branching.js +++ b/src/levels/intro/branching.js @@ -7,6 +7,7 @@ exports.level = { "ja" : "Gitのブランチ", "ko": "Git에서 브랜치 쓰기", "es_AR": "Brancheando en Git", + "es_ES": "Creando ramas en Git", "pt_BR": "Ramos no Git", "gl" : "Ramas en Git", "fr_FR": "Gérer les branches avec Git", @@ -20,6 +21,7 @@ exports.level = { "de_DE": 'Lege mit "git branch " einen neuen Branch an und checke ihn mit "git checkout aus', "ja" : "ブランチの作成(\"git branch [ブランチ名]\")と、チェックアウト(\"git checkout [ブランチ名]\")", "es_AR": "Hacé una nueva rama con \"git branch [nombre]\" y cambiá a ella con \"git checkout [nombre]\"", + "es_ES": "Crea una nueva rama con \"git branch [nombre]\" y sitúate en ella con \"git checkout [nombre]\"", "pt_BR": "Crie um novo ramo com \"git branch [nome]\" e mude para ele com \"git checkout [nome]\"", "gl" : "Crea unha nova rama con \"git branch [nome]\" e cambiate a ela facendo \"git checkout [nome]\"", "fr_FR": "Faites une nouvelle branche avec \"git branch [nom]\" positionnez-vous dans celle-ci avec \"git checkout [nom]\"", @@ -344,6 +346,84 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Ramas en Git", + "", + "Las ramas (branches) en Git son increíblemente livianas. Son sólo referencias a un commit específico - nada más. Por esto es que tantos entusiastas de Git siguen el mantra:", + "", + "```", + "crea ramas al principio y hazlo también de manera frecuente", + "```", + "", + "Como no hay consumo extra de almacenamiento ni memoria al crear varias ramas, lógicamente es más fácil dividir tu trabajo que trabajar solamente con un par de ramas grandes.", + "", + "Cuando empecemos a mezclar ramas y commits, vamos a ver cómo se combinan estas dos herramientas. Por ahora, en cambio, simplemente recuerda que una rama esencialmente dice \"Quiero incluir el trabajo de este commit y todos su ancestros\"." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos cómo son las ramas en la práctica.", + "", + "Ahora vamos a crear una rama nueva llamada `newImage`" + ], + "afterMarkdowns": [ + "Ahí está, ¡eso es todo lo que hay que hacer para crear una rama! La rama `newImage` ahora referencia al commit `C1`" + ], + "command": "git branch newImage", + "beforeCommand": "" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Pongamos algo de trabajo en esta nueva rama. Aprieta el botón de aquí abajo" + ], + "afterMarkdowns": [ + "¡Vaya! ¡La rama `master` avanzó, pero `newImage` no! Eso es porque no estábamos \"en\" la rama nueva, y por eso el asterisco (*) estaba en `master`" + ], + "command": "git commit", + "beforeCommand": "git branch newImage" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Digámosle a git que queremos hacer checkout a esa rama con", + "", + "```", + "git checkout [name]", + "```", + "", + "Esto va a situarnos en esa rama antes de hacer un commit con nuestros cambios" + ], + "afterMarkdowns": [ + "¡Ahí estamos! Nuestros cambios se registraron en nuestra nueva rama" + ], + "command": "git checkout newImage; git commit", + "beforeCommand": "git branch newImage" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¡Perfecto! Ya estás listo para trabajar con ramas. Cuando se cierre esta ventana,", + "crea una nueva rama llamada `bugFix` y cámbiate a ella" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/intro/commits.js b/src/levels/intro/commits.js index 9f74fc72..dd04cb69 100644 --- a/src/levels/intro/commits.js +++ b/src/levels/intro/commits.js @@ -3,6 +3,7 @@ exports.level = { "en_US": "Introduction to Git Commits", "de_DE": "Einführung in Git Commits", "es_AR": "Introducción a los commits de Git", + "es_ES": "Introducción a los commits de Git", "pt_BR": "Introdução aos commits no Git", "gl" : "Introducción ós commits de Git", "fr_FR": "Introduction aux commits avec Git", @@ -20,6 +21,7 @@ exports.level = { "en_US": "Just type in 'git commit' twice to finish!", "de_DE": "Gib einfach zweimal 'git commit' ein um den Level abzuschließen", "es_AR": "¡Simplemente tipeá 'git commit' dos veces para terminar!", + "es_ES": "¡Simplemente escribe 'git commit' dos veces para terminar!", "pt_BR": "Simplesmente digite 'git commit' duas vezes para concluir!", "gl" : "Simplemente escribe 'git commit' dúas veces para terminar.", "fr_FR": "Il suffit de saisir 'git commit' deux fois pour réussir !", @@ -206,6 +208,48 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Commits de Git", + "Un commit en un repositorio git registra un snapshot de todos los archivos en tu directorio. Es como un _gran_ copy&paste, ¡pero incluso mejor!", + "", + "Git pretende mantener los commits tan livianos como sea posible, por lo que no copia ciegamente el directorio completo cada vez que haces un commit. Puede (cuando es posible) comprimir un commit como un conjunto de cambios (o un _\"delta\"_) entre una versión de tu repositorio y la siguiente.", + "", + "Git mantiene, también, un historial de qué commits se hicieron y cuándo. Es por eso que la mayoría de los commits tienen commits ancestros encima -- designamos esto con flechas en nuestra visualización. ¡Mantener el historial es genial para todos los que trabajan en el proyecto!", + "", + "Hay un montón en lo que ahondar, pero por ahora puedes pensar en los commits como snapshots de tu proyecto. Los commits son muy livianos, y ¡cambiar de uno a otro es terriblemente rápido!" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos cómo se ve esto en la práctica. A la derecha tenemos una visualización de un (pequeño) repositorio git. Hay dos commits: el commit inicial, `C0`, y un commit que lo sigue, `C1`, que podría tener algunos cambios interesantes.", + "", + "Dale al botón de abajo para crear un nuevo commit" + ], + "afterMarkdowns": [ + "¡Allá va! Increíble. Acabamos de hacer cambios al repositorio y los guardamos como un commit. El commit que acabamos de crear tiene un padre, `C1`, que referencia al commit en el que se basó este." + ], + "command": "git commit", + "beforeCommand": "" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¡Venga, inténtalo ahora! Cuando se cierre esta ventana, crea dos commits para completar el nivel." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/intro/merging.js b/src/levels/intro/merging.js index 894501ff..6ee5e46e 100644 --- a/src/levels/intro/merging.js +++ b/src/levels/intro/merging.js @@ -5,6 +5,7 @@ exports.level = { "en_US": "Merging in Git", "de_DE": "Mergen in git", "es_AR": "Mergeando en Git", + "es_ES": "Haciendo merge en Git", "pt_BR": "Merge no Git", "gl" : "Merge en Git", "fr_FR": "Faire des 'merge' (fusions de branches) avec Git", @@ -20,6 +21,7 @@ exports.level = { "de_DE": "Denk dran in der angegebenen Reihenfolge zu committen (erst bugFix, dann master)", "ja"   : "指示された順番でコミットすること(masterの前にbugFixで)", "es_AR": "Acordate de commitear en el orden especificado (bugFix antes de master)", + "es_ES": "Acuérdate de hacer commit en el orden especificado (bugFix antes de master)", "pt_BR": "Lembre-se de commitar na ordem especificada (bugFix antes de master)", "gl" : "Lembrate de facer commit na orde específica (bugFix antes de master)", "fr_FR": "Pensez à faire des commits dans l'ordre indiqué (bugFix avant master)", @@ -309,6 +311,75 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Haciendo merge en ramas", + "", + "¡Genial! Ya sabemos cómo crear un commit y cómo crear ramas. Ahora tenemos que aprender algún modo de unificar el trabajo de dos ramas diferentes. Esto nos va a permitir abrir una nueva rama de desarrollo, implementar alguna nueva funcionalidad, y después unirla de nuevo con el trabajo principal.", + "", + "El primer método para combinarlas que vamos a explorar es `git merge`. Hacer merge en Git crea un commit especial que tiene dos padres diferentes. Un commit con dos padres escencialmente significa \"Quiero incluir todo el trabajo de estos dos padres , *y* del conjunto de todos sus ancestros\"", + "", + "Es más simple visualizarlo, veámoslo a continuación" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Aquí tenemos dos ramas, y cada una tiene un commit que le es único. Esto significa que ninguna de las ramas incluye \"todo el trabajo\" que hay en nuestro repositorio. Hagamos un merge para solucionar eso.", + "", + "Vamos a `merge`ar la rama `bugFix` a `master`" + ], + "afterMarkdowns": [ + "¡Caramba! ¿Viste eso? Antes de nada, `master` ahora apunta a un commit que tiene dos padres. Si sigues las flechas por el árbol de commits empezando desde `master` vas a cruzarte con cada commit del repositorio hasta llegar a la raíz. Esto significa que `master` ahora contiene todo el trabajo que hay en el repositorio.", + "", + "Además, ¿viste cómo cambiaron los colores de los commits? Para ayudar al aprendizaje, he incluido algunas convenciones de colores. Cada rama tiene un color propio. Cada commmit se vuelve del color resultante de mezclar los colores de todas las ramas que lo contienen.", + "", + "Así que aquí vemos que el color de la rama `master` participa en la mezcla de todos los commits, pero que el de `bugFix` no. Arreglemos eso..." + ], + "command": "git merge bugFix", + "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Hagamos merge de `master` a `bugFix`:" + ], + "afterMarkdowns": [ + "Como `bugFix` era un ancestro de `master`, git no tuvo que hacer ningún trabajo; simplemente movió `bugFix` al mismo commit al que estaba anexado `master`.", + "", + "Ahora todos los commits son del mismo color, lo que significa que cada rama contiene todo el trabajo que hay en el repositorio. ¡Genial!" + ], + "command": "git checkout bugFix; git merge master", + "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, sigue estos pasos:", + "", + "* Crea una nueva rama, llamada `bugFix`", + "* Haz checkout de la rama `bugFix` usando `git checkout bugFix`", + "* Crea un commit", + "* Vuelve a `master` con `git checkout`", + "* Crea otro commit", + "* Haz merge de la rama `bugFix` a `master` usando `git merge`", + "", + "*Recuerda: siempre puedes volver a ver este mensaje escribiendo \"objective\"!*" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/intro/rebasing.js b/src/levels/intro/rebasing.js index 29a46107..ebcfcbda 100644 --- a/src/levels/intro/rebasing.js +++ b/src/levels/intro/rebasing.js @@ -6,6 +6,7 @@ exports.level = { "de_DE": "Einführung in Rebase", "ja" : "Rebaseの解説", "es_AR": "Introducción a rebase", + "es_ES": "Introducción a rebase", "pt_BR": "Introdução ao rebase", "gl" : "Introducción a rebase", "fr_FR": "Introduction à rebase", @@ -21,6 +22,7 @@ exports.level = { "ja" : "初めにbugFixを指した状態でコミットする", "fr_FR": "Assurez-vous de bien faire votre commit sur bugFix en premier", "es_AR": "Asegurate de commitear desde bugFix primero", + "es_ES": "Asegúrate de hacer commit desde bugFix primero", "pt_BR": "O bugFix precisa ser commitado primeiro", "gl" : "Asegurate de facer o commit dende bugFix primeiro", "ko": "bugFix 브랜치에서 먼저 커밋하세요", @@ -301,6 +303,73 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Rebase", + "", + "El segundo modo de combinar el trabajo de distintas ramas es el *rebase*. Hacer rebase escencialmente selecciona un conjunto de commits, los \"copia\", y los aplica en algún otro lado.", + "", + "Aunque esto pueda sonar confuso, la ventaja de hacer rebase es que puede usarse para conseguir una secuencia de commits lineal, más bonita. El historial / log de commits del repositorio va a estar mucho más claro si sólo usas rebase.", + "", + "Veámoslo en acción..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Aquí tenemos dos ramas otra vez. Observa que la rama bugFix está actualmente seleccionada (tiene un asterisco)", + "", + "Nos gustaría mover nuestro trabajo de bugFix directamente sobre el trabajo de master. De ese modo, parecería que esas dos tareas se desarrollaron secuencialmente, cuando en realidad se hicieron en paralelo.", + "", + "Hagámoslo usando el comando `git rebase`" + ], + "afterMarkdowns": [ + "¡Genial! Ahora el trabajo de nuestra rama bugFix está justo encima del de master, y tenemos una secuencia lineal de commits.", + "", + "Nota que el commit C3 sigue existiendo en algún lado (aparece medio desvanecido en el árbol), y C3' es la \"copia\" que rebaseamos sobre master.", + "", + "El único problema es que master todavía no se actualizó, resolvámoslo ahora..." + ], + "command": "git rebase master", + "beforeCommand": "git commit; git checkout -b bugFix C1; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Ahora estamos parados sobre la rama `master`. Avancemos y hagamos rebase sobre `bugFix`..." + ], + "afterMarkdowns": [ + "¡Ahí está! Como `master` era un ancestro de `bugFix`, git simplemente movió la referencia de `master` hacia adelante en la historia." + ], + "command": "git rebase bugFix", + "beforeCommand": "git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, haz lo siguiente:", + "", + "* Haz checkout de una nueva rama llamada `bugFix`", + "* Crea un commit", + "* Vuelve a la rama master y crea otro commit", + "* Haz checkout en bugFix otra vez y haz rebase sobre master", + "", + "¡Misión cumplida!" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { From 64bd768db4f380ad0bbbc96313be5328261cb69d Mon Sep 17 00:00:00 2001 From: flyingbot91 Date: Wed, 11 Dec 2019 23:32:24 +0100 Subject: [PATCH 137/359] Translated 'advanced' levels to Spanish 'es_ES' --- src/levels/advanced/multipleParents.js | 89 ++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/src/levels/advanced/multipleParents.js b/src/levels/advanced/multipleParents.js index 7b40b4dc..dd822ad0 100644 --- a/src/levels/advanced/multipleParents.js +++ b/src/levels/advanced/multipleParents.js @@ -9,6 +9,7 @@ exports.level = { "de_DE": "Mehrere Vorgänger", "ja" : "複数の親", "es_AR": "Múltiples padres", + "es_ES": "Múltiples padres", "pt_BR": "Múltiplos pais", "gl" : "Múltiples pais", "zh_TW": "多個 parent commit", @@ -23,6 +24,7 @@ exports.level = { 'fr_FR': 'Utilisez "git branch bugWork" avec un commit pour créer une référence manquante', "zh_CN": "使用 `git branch bugWork` 加上一个目标提交记录来创建消失的引用。", "es_AR": "Usá `git branch bugWork` sobre algún commit para crear la referencia faltante", + "es_ES": "Usa `git branch bugWork` sobre algún commit para crear la referencia que falta", "pt_BR": "Use `git branch bugWork` com um commit alvo para criar a referência que falta", "gl" : "Usa `git branch bugWork` sobre calquera commit para crear a referencia que falta", "zh_TW": "在一個指定的 commit 上面使用 `git branch bugWork`。", @@ -466,6 +468,93 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Especificando los padres", + "", + "Como el modificador de `~`, `^` también acepta un número opcional después de él.", + "", + "En lugar de especificar cuántas generaciones hacia atrás ir (como `~`), el modificador de `^` especifica por cuál de las referencias padres seguir en un commit de merge. Recuerda que un commit de merge tiene múltiples padres, por lo que el camino a seguir es ambiguo.", + "", + "Git normalmente sigue el \"primer\" padre de un commit de merge, pero especificando un número junto con `^` cambia este comportamiento predefinido.", + "", + "Demasiada charla, veámoslo en acción.", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Aquí tenemos un commit de merge. Si hacemos checkout de `master^`, sin modificadores, vamos a seguir al primer padre después del commit de merge. ", + "", + "(*En nuestras visualizaciones, el primer padre se ubica directamente arriba del commit de merge.*)" + ], + "afterMarkdowns": [ + "Fácil -- esto es a lo que estamos acostumbrados." + ], + "command": "git checkout master^", + "beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Ahora tratemos de especificar el segundo padre, en cambio..." + ], + "afterMarkdowns": [ + "¿Ves? Seguimos al otro padre hacia arriba." + ], + "command": "git checkout master^2", + "beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Los modificadores de `^` y `~` son muy poderosos a la hora de movernos en un árbol:" + ], + "afterMarkdowns": [ + "¡Rapidísimo!" + ], + "command": "git checkout HEAD~; git checkout HEAD^2; git checkout HEAD~2", + "beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Más loco aún, ¡estos modificadores pueden encadenarse entre sí! Mira esto:" + ], + "afterMarkdowns": [ + "El mismo movimiento que antes, pero todo en uno." + ], + "command": "git checkout HEAD~^2~2", + "beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Ponlo en práctica", + "", + "Para completar este nivel, crea una nueva rama en la ubicación indicada.", + "", + "Obviamente sería muy fácil especificar el commit directamente (algo como `C6`), pero te reto a usar los modificadores de los que estuvimos hablando, mejor" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { From 0d02559fe4ee024ff6a2252ba8dd26d166fb6980 Mon Sep 17 00:00:00 2001 From: flyingbot91 Date: Wed, 11 Dec 2019 23:37:28 +0100 Subject: [PATCH 138/359] Writing typos --- src/levels/intro/branching.js | 4 ++-- src/levels/intro/commits.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/levels/intro/branching.js b/src/levels/intro/branching.js index 7ecdc005..85f69dc3 100644 --- a/src/levels/intro/branching.js +++ b/src/levels/intro/branching.js @@ -280,9 +280,9 @@ exports.level = { "brancheá temprano, y brancheá seguido", "```", "", - "Como no hay consumo extra de alamcenamiento ni memoria al hacer varias ramas, es más fácil dividir lógicamente tu trabajo que tener un par de ramas grandes.", + "Como no hay consumo extra de almacenamiento ni memoria al hacer varias ramas, es más fácil dividir lógicamente tu trabajo que tener un par de ramas grandes.", "", - "Cuando empecemos a mezclar ramas y commits, vamos a ver cómo se combinan estas dos herramientas. Por ahora, en cambio, simplemente recordá que una rama escencialmente dice \"Quiero incluir el trabajo de este commit y todos su ancestros\"." + "Cuando empecemos a mezclar ramas y commits, vamos a ver cómo se combinan estas dos herramientas. Por ahora, en cambio, simplemente recordá que una rama esencialmente dice \"Quiero incluir el trabajo de este commit y todos su ancestros\"." ] } }, diff --git a/src/levels/intro/commits.js b/src/levels/intro/commits.js index 9f74fc72..133f5f2c 100644 --- a/src/levels/intro/commits.js +++ b/src/levels/intro/commits.js @@ -173,7 +173,7 @@ exports.level = { "## Commits de Git", "Un commit en un repositorio git registra un snapshot de todos los archivos en tu directorio. Es como un _gran_ copy&paste, ¡pero incluso mejor!", "", - "Git pretende mantener los commits tan livianos como sea posible, por lo que no copia ciegamente el directorio completo cada vez que commiteás. Puede (cuando es posible) comprimir un commit como un conjunto de cambios (o un _\"delta\"_) entre una versión de tu repositorio y la siguiente.", + "Git pretende mantener los commits tan livianos como sea posible, por lo que no copia ciegamente el directorio completo cada vez que commiteás. Puede (cuando sea posible) comprimir un commit como un conjunto de cambios (o un _\"delta\"_) entre una versión de tu repositorio y la siguiente.", "", "Git mantiene, también, un historial de qué commits se hicieron cuándo. Es por eso que la mayoría de los commits tienen commits ancestros arriba suyo -- designamos esto con flechas en nuestra visualización. ¡Mantener el historial es genial para todos los que trabajan en el proyecto!", "", From a4e13ba14e889d1070689b8e68df0e9c3eaea984 Mon Sep 17 00:00:00 2001 From: flyingbot91 Date: Thu, 12 Dec 2019 22:21:19 +0100 Subject: [PATCH 139/359] Translated 'mixed' levels to Spanish 'es_ES' --- src/levels/mixed/describe.js | 65 +++++++++++++++++++++++++++ src/levels/mixed/grabbingOneCommit.js | 41 +++++++++++++++++ src/levels/mixed/jugglingCommits.js | 37 +++++++++++++++ src/levels/mixed/jugglingCommits2.js | 45 +++++++++++++++++++ src/levels/mixed/tags.js | 54 ++++++++++++++++++++++ 5 files changed, 242 insertions(+) diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js index 0bef2010..24df2e35 100644 --- a/src/levels/mixed/describe.js +++ b/src/levels/mixed/describe.js @@ -8,6 +8,7 @@ exports.level = { "de_DE": "Git Describe", "ja" : "Git Describe", "es_AR": "Git Describe", + "es_ES": "Git Describe", "pt_BR": "Git Describe", "gl" : "Git Describe", "zh_TW": "git describe", @@ -22,6 +23,7 @@ exports.level = { "de_DE": "Committe nur einmal auf bugFix, wenn du soweit bist", "ja" : "次に進む準備が整ったなら、bugFixに対して一回commitしてください", "es_AR": "Simplemente commiteá una vez en bugFix cuando estés listo para seguir", + "es_ES": "Simplemente crea un commit en la rama bugFix cuando estés listo para seguir", "pt_BR": "Simplesmente commite uma vez em bugFix quando quiser parar de experimentar", "gl" : "Simplemente fai commit en bugFix cando estés listo para continuar.", "zh_TW": "當你要移動的時候,只要在 bugFix 上面 commit 就好了", @@ -348,6 +350,69 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Git Describe", + "", + "Como los tags sirven tanto para marcar \"hitos\" en el código, git tiene un comando para *describir* (_describe_) dónde estás relativo al \"hito\" más cercano (digamos, \"tag\"). Y ese comamndo se llama ¡`git describe`!", + "", + "Git describe puede ayudarte a saber dónde estás después de que te hayas movido varios commits hacia adelante o atrás en la historia. Esto puede pasarte después de que termines un git bisect (una búsqueda que te ayuda a debuggear problemas) o cuando te sientas delante de la computadora de un compañero de trabajo que acaba de volver de unas vacaciones." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Git describe tiene la siguiente forma:", + "", + "`git describe `", + "", + "Donde `` es cualquier cosa que git puede resolver a un commit. Si no especificas ninguna referencia, git simplemente usa el commit en el que estás parado ahora (`HEAD`).", + "", + "La salida de ese comando se ve así:", + "", + "`__g`", + "", + "Donde `tag` es el tag más cercano en la historia, `numCommits` dice a cuántos commits de ese tag estás, y `` es el hash del commit que estás describiendo." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos un ejemplo breve. Para este árbol de commits:" + ], + "afterMarkdowns": [ + "El comando `git describe master` mostraría:", + "", + "`v1_2_gC2`", + "", + "Mientras que `git describe side` debería mostrar:", + "", + "`v2_1_gC4`" + ], + "command": "git tag v2 C3", + "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¡Eso es prácticamente todo lo que hay sobre git describe! Prueba con algunas referencias en este nivel para familiarizarte con el comando.", + "", + "Cuando estés listo, crea un commit para terminar el nivel. Te estamos dando una gratis :P" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/mixed/grabbingOneCommit.js b/src/levels/mixed/grabbingOneCommit.js index 42e748d3..86400368 100644 --- a/src/levels/mixed/grabbingOneCommit.js +++ b/src/levels/mixed/grabbingOneCommit.js @@ -19,6 +19,7 @@ exports.level = { "fr_FR": "Choisir seulement 1 commit", "de_DE": "Einen Commit pflücken", "es_AR": "Tomando un único commit", + "es_ES": "Tomando un único commit", "pt_BR": "Pegando um único commit", "gl" : "Escollendo un único commit", "ja": "一つのコミットのみを取得", @@ -32,6 +33,7 @@ exports.level = { "de_DE": "Vergiss nicht: hier kommst du mit interaktivem Rebase oder Cherry-Picking weiter", "fr_FR": "Souvenez-vous, les rebases interactifs ou cherry-pick sont vos amis ici.", "es_AR": "Acordate, el rebase interactivo o cherry-pick son tus amigos acá", + "es_ES": "Recuerda, el rebase interactivo y el cherry-pick son tus amigos", "pt_BR": "Lembre-se, o rebase interativo ou o cherry-pick são seus amigos aqui", "gl" : "Recorda, o rebase interativo ou cherry-pick é un dos teus colegas aquí", "ja": "このレベルではインタラクティブモードのrebaseやcherry-pickがクリアのカギです", @@ -157,6 +159,45 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Commits localmente stackeados", + "", + "Esta es una escena que suele pasar cuando uno desarrolla: estoy tratando de encontrar un bug bastante escurridizo. Para ayudar en mi tarea de detective, agrego un par de comandos de debug, y algunas sentencias para imprimir el estado de mi sistema.", + "", + "Todas estas cosas de imprimir y debuggear estan en su propia rama. Finalmente encuentro el problema, lo soluciono, ¡y disfruto!", + "", + "El único problema es que ahora necesito llevar mi `bugFix` a la rama `master`. Si simplemente fast-forwardeo `master`, entonces `master` va a tener todos mis agregados de debugging, lo cual no es deseable. Tiene que haber otro modo..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Necesitamos decirle a git que sólo copie uno de los commits. Esto es tal como los niveles anteriores de mover commits por ahí -- podemos usar los mismos comandos:", + "", + "* `git rebase -i`", + "* `git cherry-pick`", + "", + "Para conseguir este resultado." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Este es un nivel más avanzado, así que debes decidir cuál de los dos comandos quieres usar, pero para completar el nivel asegurate de que `master` recibe el commit que `bugFix` referencia." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/mixed/jugglingCommits.js b/src/levels/mixed/jugglingCommits.js index 747a518e..f4b254c8 100644 --- a/src/levels/mixed/jugglingCommits.js +++ b/src/levels/mixed/jugglingCommits.js @@ -23,6 +23,7 @@ exports.level = { "de_DE": "Jonglieren mit Commits", "fr_FR": "Jongler avec les commits", "es_AR": "Haciendo malabares con los commits", + "es_ES": "Haciendo malabares con los commits", "pt_BR": "Malabarismo com commits", "gl" : "Argallando cos commits", "ja": "コミットをやりくりする", @@ -36,6 +37,7 @@ exports.level = { "de_DE": "Der erste Befehl ist git rebase -i HEAD~2", "fr_FR": "La première commande est git rebase -i HEAD~2", "es_AR": "El primer comando es git rebase -i HEAD~2", + "es_ES": "El primer comando es git rebase -i HEAD~2", "pt_BR": "O primeiro comando é git rebase -i HEAD~2", "gl" : "O primeiro comando é git rebase -i HEAD~2", "ja": "最初に打つコマンドはgit rebase -i HEAD~2", @@ -150,6 +152,41 @@ exports.level = { }, ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Haciendo malabares con los commits", + "", + "Esta es otra situación algo común. Tienes algunos cambios (`newImage`) y otro conjunto de cambios (`caption`) que están relacionados, entonces están apilados en tu repositorio uno encima del otro (es decir, uno después del otro).", + "", + "El tema es que a veces tienes que hacer una pequeña modificación a un commit previo. En este caso, la gente de diseño requiere que cambiemos ligeramente las dimensiones de `newImage`, ¡incluso aunque ese commit ya se encuentre atrás en nuestra historia!" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Superaremos esta dificultad haciendo lo siguiente:", + "", + "* Vamos a reordenar los commits para que el que queremos cambiar quede arriba de los demás con `git rebase -i`", + "* Vamos a hacer `commit --amend` para aplicar la ligera modificación", + "* Después vamos a reordenar los commits a como estaban con `git rebase -i`", + "* Finalmente, vamos a mover master a esta parte actualizada de nuestro árbol de commits para terminar el nivel (usando el método que prefieras)", + "", + "Hay varias maneras de lograr este objetivo en general (ya te veo haciéndole ojitos al cherry-pick), y veremos algunos más después, pero por ahora concentrémonos en esta técnica.", + "", + "Por último, presta atención al estado final -- como movemos los commits dos veces, ambos quedan con un apóstrofe. El commit que corregimos tiene un apóstrofe extra, y así nos queda nuestro árbol final", + "", + "Habiendo dicho eso, puedo comparar los niveles basándome ahora en la estructura y las diferencias relativas de apóstrofes. Mientras que tu rama `master` tenga la misma estructura y diferencias relativas de apóstrofes, te voy a dar el puntaje completo" + ] + } + }, + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/mixed/jugglingCommits2.js b/src/levels/mixed/jugglingCommits2.js index 29a97a31..bfac0c16 100644 --- a/src/levels/mixed/jugglingCommits2.js +++ b/src/levels/mixed/jugglingCommits2.js @@ -21,6 +21,7 @@ exports.level = { "en_US": "Juggling Commits #2", "fr_FR": "Jongler avec les commits #2", "es_AR": "Haciendo malabares con los commits #2", + "es_ES": "Haciendo malabares con los commits #2", "pt_BR": "Malabarismo com commits #2", "gl" : "Argallando cos commits #2", "de_DE": "Jonglieren mit Commits Teil 2", @@ -34,6 +35,7 @@ exports.level = { "en_US": "Don't forget to forward master to the updated changes!", "fr_FR": "N'oubliez pas d'appliquer les changements depuis la branche master", "es_AR": "¡No te olvides de avanzar master a los cambios actualizados!", + "es_ES": "¡No te olvides de avanzar master a los cambios actualizados!", "pt_BR": "Não se esqueça de avançar a referência do master para as mudanças efetuadas!", "gl" : "¡Non te esquezas de avanzar master ós cambios actualizados!", "de_DE": "Vergiss nicht den master auf die aktuelle Version vorzuspulen", @@ -174,6 +176,49 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Haciendo malabares con los commits #2", + "", + "*Si no completaste Haciendo malabares con los commits #1 (el nivel anterior), hazlo antes de continuar*", + "", + "Como viste en el último nivel, usamos `rebase -i` para reordenar los commits. Una vez que el commit que queríamos cambiar se encontraba arriba de todo, pudimos `--amend`earlo fácilmente y reordenarlo a como queríamos.", + "", + "El único problema con esto es que hay mucho reordenamiento, que puede generar conflictos al rebasear. Veamos otro método usando `git cherry-pick`" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Recuerda que git cherry-pick va a traer un commit de cualquier parte del árbol sobre HEAD (siempre que ese otro commit no sea un ancestro de HEAD).", + "", + "Una pequeña demo para refrescar la idea:" + ], + "afterMarkdowns": [ + "¡Bien! Sigamos..." + ], + "command": "git cherry-pick C2", + "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Entonces, en este nivel vamos a lograr el mismo objetivo de corregir `C2`, pero sin usar `rebase -i`. Te dejo a ti el darte cuenta cómo :D", + "", + "Recuerda, la cantidad exacta de apóstrofes (') en el commit no es importante, sólo la diferencia relativa. Por ejemplo, le voy a dar una puntuación a un árbol que coincida con el objetivo pero cuyos commits tengan todos un apóstrofe extra" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/mixed/tags.js b/src/levels/mixed/tags.js index 511d62f0..860ddcfb 100644 --- a/src/levels/mixed/tags.js +++ b/src/levels/mixed/tags.js @@ -7,6 +7,7 @@ exports.level = { "de_DE": "Git Tags", "ja" : "Gitのタグ", "es_AR": "Tags en git", + "es_ES": "Tags en git", "pt_BR": "Tags no Git", "gl" : "Etiquetas en git", "fr_FR": "Git Tags", @@ -22,6 +23,7 @@ exports.level = { "de_DE": "Du kannst den Checkout entweder direkt auf den Commit oder das Tag machen.", "ja" : "コミットを直接チェックアウトできますが、簡単にタグでチェックアウトすることも可能!", "es_AR": "Podés checkoutear directamente el commit, ¡o simplemente el tag!", + "es_ES": "Puedes hacer checkout directamente el commit, ¡o simplemente el tag!", "pt_BR": "Você pode fazer checkout diretamente no commit ou na tag correspondente!", "gl" : "Podes saltar directamente ó commit, ¡ou a etiqueta, que é máis doado!", "zh_TW": "你可以直接 checkout 到 commit 上,或是簡單的 checkout 到 tag 上", @@ -291,6 +293,58 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Tags en git", + "", + "Como aprendiste en lecciones anteriores, las ramas pueden moverse fácilmente, y en general van referenciando distintos commits a medida que el trabajo se va completando en ellas. Las ramas cambian fácilmente, suelen ser temporales, y siempre cambiantes.", + "", + "Si ese es el caso, te podrías estar preguntando si hay una manera de marcar *permanentemente* puntos en la historia de tu proyecto. Para cosas como releases mayores o grandes merges, ¿hay algún modo de marcar esos commits con algo más permanente que un branch?", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¡Seguro que hay! Los tags de git soportan exactamente este caso de uso -- marcan (bastante) permanentemente determinados commits como \"hitos\" que puedes referenciar como a un branch.", + "", + "Aún más importante, los tags no avanzan cuando se crean nuevos commits. No puedes hacer checkout a un tag y completar el trabajo en ese tag - los tags son marcas fijas en el árbol de commits que designan ciertos puntos.", + "", + "Veamos cómo se ven los tags en práctica..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Creemos un tag en `C1`, que es nuestro prototipo de la versión 1" + ], + "afterMarkdowns": [ + "¡Ahí está! Bastante simple. Nombramos al tag `v1` y referenciamos explícitamente al commit `C1`. Si no especificas el commit, git va a usar al apuntado por `HEAD`" + ], + "command": "git tag v1 C1", + "beforeCommand": "git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para este nivel, simplemente crea los tags en la visualización final y después haz checkout con `v1`. Observa cómo entras en el estado detached -- esto es porque no puedes hacer commit directamente sobre el tag `v1`.", + "", + "En el próximo nivel vamos a examinar un caso de uso más interesante para los tags." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { From 257bb1c0c2a19dee22216c14139fb55803972446 Mon Sep 17 00:00:00 2001 From: flyingbot91 Date: Thu, 12 Dec 2019 22:30:05 +0100 Subject: [PATCH 140/359] Translated index.js to Spanish 'es_ES' --- src/levels/index.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/levels/index.js b/src/levels/index.js index 5d343e2a..af4eebe1 100644 --- a/src/levels/index.js +++ b/src/levels/index.js @@ -59,6 +59,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : 'まずはここから', 'fr_FR': 'Séquence d\'introduction', 'es_AR': 'Secuencia introductoria', + 'es_ES': 'Secuencia introductoria', 'pt_BR': 'Sequência introdutória', 'gl' : 'Secuencia introductoria', 'zh_CN': '基础篇', @@ -73,6 +74,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : 'gitの基本的なコマンド群をほどよいペースで学ぶ', 'fr_FR': 'Une introduction en douceur à la majorité des commandes git', 'es_AR': 'Una breve introducción a la mayoría de los comandos de git', + 'es_ES': 'Una breve introducción a la mayoría de los comandos de git', 'pt_BR': 'Uma breve introdução à maioria dos comandos do git', 'gl' : 'Unha breve introducción á maioría dos comandos de git', 'zh_CN': '循序渐进地介绍 Git 主要命令', @@ -89,6 +91,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : '次のレベルに進もう', 'fr_FR': 'Montée en puissance', 'es_AR': 'Acelerando', + 'es_ES': 'Acelerando', 'pt_BR': 'Acelerando', 'gl' : 'Alixeirando', 'zh_CN': '高级篇', @@ -103,6 +106,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : '更にgitの素晴らしさを堪能しよう', 'fr_FR': 'Le prochain excellent plat de pur git. J\'espère que vous êtes affamés', 'es_AR': 'La próxima porción de 100% maravillas git. Espero que estés hambriento', + 'es_ES': 'La próxima ración de git. Espero que estés hambriento', 'pt_BR': 'A próxima porção de maravilhas do git. Faminto?', 'gl' : 'A próxima porción das marabillas de git. Agardo que estés esfameado', 'zh_CN': '要开始介绍 Git 的超棒特性了,快来吧!', @@ -120,6 +124,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : 'Push及びPullコマンド -- Gitリモート', 'fr_FR': 'Push & Pull -- dépôts gits distants !', 'es_AR': 'Push & Pull -- Git Remotes!', + 'es_ES': 'Push y Pull -- Git Remotes!', 'pt_BR': 'Push & Pull -- repositórios remotos no Git!', 'gl' : 'Push & Pull -- Repositorios remotos no Git!', 'zh_CN': 'Push & Pull —— Git 远程仓库!', @@ -134,6 +139,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : '自分のコードをより広く公開しましょう', 'de_DE': 'Zeit Eure 1en und 0en zu teilen; Coding mit sozialer Komponente', 'es_AR': 'Hora de compartir sus 1\'s y 0\'s, chicos; programar se volvió social!', + 'es_ES': 'Hora de compartir vuestros 1\'s y 0\'s, chicos; programar se volvió social!', 'pt_BR': 'Hora de compartilhar seus 1\'s e 0\'s, crianças; programar agora é social!', 'gl' : 'Hora de compartilos seus 1\' e 0\'s, rapaces; programar agora é social!', 'zh_CN': '是时候分享你的代码了,让编码变得社交化吧', @@ -151,6 +157,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : '"origin"とその先へ -- Gitリモート上級編', 'fr_FR': 'Vers l\'infini et au-delà -- dépôts distants version avancée', 'es_AR': 'Hasta el origin y más allá -- Git Remotes avanzado!', + 'es_ES': 'Hasta el origen y más allá -- Git Remotes avanzado!', 'pt_BR': 'Até a origin e além -- repositórios remotos avançados!', 'gl' : 'Ata á orixe e máis aló -- repositorios remotos avanzados!', 'zh_CN': '关于 origin 和它的周边 —— Git 远程仓库高级操作', @@ -164,6 +171,7 @@ var sequenceInfo = exports.sequenceInfo = { 'fr_FR': 'Et vous pensiez qu\'être un dictateur bienfaisant serait amusant...', 'ja' : '絶えず上級者の仕事は存在する。。。', 'es_AR': 'Y pensabas que ser un dictador benévolo sería divertido...', + 'es_ES': 'Y pensabas que ser un dictador benévolo sería divertido...', 'pt_BR': 'E você achava que ser um déspota esclarecido seria mais divertido...', 'gl' : 'E pensabas que ser un dictador benévolo sería divertido...', 'zh_CN': '做一名仁慈的独裁者一定会很有趣……', @@ -180,6 +188,7 @@ var sequenceInfo = exports.sequenceInfo = { 'de_DE': 'Code Umherschieben', 'fr_FR': 'Déplacer le travail', 'es_AR': 'Moviendo el trabajo por ahí', + 'es_ES': 'Moviendo el trabajo por ahí', 'pt_BR': 'Movendo trabalho por aí', 'gl' : 'Movendo o traballo por ahí', 'ja' : 'コードの移動', @@ -194,6 +203,7 @@ var sequenceInfo = exports.sequenceInfo = { 'de_DE': 'Gewöhn dich daran, den Git-Baum zu verändern', 'fr_FR': 'Soyez à l\'aise pour modifier l\'arbre Git', 'es_AR': 'Ponete cómodo con modificar el directorio fuente', + 'es_ES': 'Ponte cómodo cuando modifiques el directorio fuente', 'pt_BR': 'Fique confortável em modificar a árvore de códigos', 'gl' : 'Ponte cómodo modificando a árbore de git', 'ko' : '작업 트리를 수정하는건 식은죽 먹기지요 이제', @@ -211,6 +221,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : '様々なtips', 'fr_FR': 'Un assortiment', 'es_AR': 'Bolsa de gatos', + 'es_ES': 'Un poco de todo', 'pt_BR': 'Sortidos', 'gl' : 'Todo mesturado', 'ko' : '종합선물세트', @@ -225,6 +236,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : 'gitを使う上での様々なtipsやテクニックなど', 'fr_FR': 'Un assortiment de techniques et astuces pour utiliser Git', 'es_AR': 'Un rejunte de técnicas, trucos y tips sobre Git', + 'es_ES': 'Un batiburrillo de técnicas, trucos y sugerencias sobre Git', 'pt_BR': 'Técnicas, truques e dicas sortidas sobre Git', 'gl' : 'Mestura de técnicas, trucos e consellos', 'ko' : 'Git을 다루는 다양한 팁과 테크닉을 다양하게 알아봅니다', @@ -241,6 +253,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : '上級トピック', 'fr_FR': 'Sujets avancés', 'es_AR': 'Temas avanzados', + 'es_ES': 'Temas avanzados', 'pt_BR': 'Temas avançados', 'gl' : 'Temas avanzados', 'zh_CN': '高级话题', @@ -255,6 +268,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : '勇気ある人のみ!', 'fr_FR': 'Pour les plus courageux !', 'es_AR': '¡Para los verdaderos valientes!', + 'es_ES': '¡Para los verdaderos valientes!', 'pt_BR': 'Para os verdadeiros valentes!', 'gl' : '¡Para os verdadeiros valerosos!', 'zh_CN': '只为真正的勇士!', From 2dab4adf69e8234a85c95747c28d8c83a82c87cf Mon Sep 17 00:00:00 2001 From: flyingbot91 Date: Thu, 12 Dec 2019 22:50:38 +0100 Subject: [PATCH 141/359] Translated 'rampup' levels to Spanish 'es_ES' --- src/levels/rampup/cherryPick.js | 59 +++++++++++++++++++ src/levels/rampup/detachedHead.js | 80 ++++++++++++++++++++++++++ src/levels/rampup/interactiveRebase.js | 67 +++++++++++++++++++++ src/levels/rampup/relativeRefs.js | 77 +++++++++++++++++++++++++ src/levels/rampup/relativeRefs2.js | 71 +++++++++++++++++++++++ src/levels/rampup/reversingChanges.js | 65 +++++++++++++++++++++ 6 files changed, 419 insertions(+) diff --git a/src/levels/rampup/cherryPick.js b/src/levels/rampup/cherryPick.js index 41f1bad7..c146eb73 100644 --- a/src/levels/rampup/cherryPick.js +++ b/src/levels/rampup/cherryPick.js @@ -12,6 +12,7 @@ exports.level = { "de_DE": "Einführung Cherry-picking", "ja" : "cherry-pick入門", "es_AR": "Introducción a cherry-pick", + "es_ES": "Introducción a cherry-pick", "pt_BR": "Introdução ao cherry-pick", "gl" : "Introuducción a cherry-pick", "zh_CN": "Git Cherry-pick", @@ -26,6 +27,7 @@ exports.level = { "de_DE": "git cherry-pick gefolgt von Commit-Namen.", "ja" : "git cherry-pickの後にコミット名を追加", "es_AR": "git cherry-pick seguido de los nombres de los commits", + "es_ES": "git cherry-pick seguido de los nombres de los commits", "pt_BR": "git cherry-pick seguido dos nomes dos commits", "gl" : "git cherry-pick seguido das referencias a commits", "zh_CN": "git cherry-pick 后面要跟提交的名字", @@ -206,6 +208,63 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Moviendo el trabajo por ahí", + "", + "Hasta ahora cubrimos lo básico de git -- hacer commits, crear ramas, y movernos por el árbol de commits. Estos conceptos alcanzan para aprovechar el 90% del poder de los repositorios de git y cubrir las necesidades principales de los desarrolladores.", + "", + "El 10% restante, sin embargo, puede ser bastante útil en flujos de trabajo complejos (o cuando te metiste en algún problema complicado). El próximo concepto que vamos a cubrir es el de \"mover el trabajo por ahí\" -- en otras palabras, una forma que tienen los desarrolladores de decir \"Quiero este trabajo aquí y este otro allí\" de una manera precisa, elocuente y flexible.", + "", + "Puede parecer un montón, pero es un concepto bastante simple." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Cherry-pick", + "", + "El primer comando en esta serie se llama `git cherry-pick`. Tiene la siguiente forma:", + "", + " `git cherry-pick <...>`", + "", + "Es una manera bastante directa de decir que quieres copiar una serie de commits sobre tu ubicación actual (`HEAD`). Personalmente amo `cherry-pick` porque hay muy poca magia involucrada y es bastante simple de entender.", + "", + "¡Veamos una demo!", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "A continuación tenemos un repositorio con algo de trabajo en la rama `side` que queremos copiar a `master`. Podríamos lograrlo con un rebase (y ya aprendimos cómo), pero veamos cómo se comporta cherry-pick." + ], + "afterMarkdowns": [ + "¡Eso es todo! Queríamos los commits `C2` y `C4` y git los aplicó justo donde estábamos. ¡Tan simple como eso!" + ], + "command": "git cherry-pick C2 C4", + "beforeCommand": "git checkout -b side; git commit; git commit; git commit; git checkout master; git commit;" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, simplemente copia algo de trabajo desde otras tres ramas a master. Puedes ver qué commits queremos en la visualización del objetivo.", + "" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/rampup/detachedHead.js b/src/levels/rampup/detachedHead.js index 14c30287..9e372678 100644 --- a/src/levels/rampup/detachedHead.js +++ b/src/levels/rampup/detachedHead.js @@ -5,6 +5,7 @@ exports.level = { "name": { "en_US": "Detach yo' HEAD", "es_AR": "Desatacheá tu HEAD", + "es_ES": "Desatachea tu HEAD", "pt_BR": "Solte a sua cabeça", "gl" : "Abandona o teu HEAD", "fr_FR": "Détacher votre HEAD", @@ -19,6 +20,7 @@ exports.level = { "hint": { "en_US": "Use the label (hash) on the commit for help!", "es_AR": "¡Usá la etiqueta (hash) sobre el commit para ayudarte!", + "es_ES": "¡Usa la etiqueta (hash) sobre el commit para ayudarte!", "pt_BR": "Use o identificador (hash) sobre o commit para te ajudar!", "gl" : "¡Usa a etiqueta (hash) sobre o commit para axudarte!", "de_DE": "Benutze den Bezeichner (den Hash) des Commits.", @@ -187,6 +189,84 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Moviéndote por ahí con Git", + "", + "Antes de meternos en algunas de las funcionalidades más avanzadas de git, es importante entender las distintas maneras de moverse por el árbol de commits que representa tu proyecto.", + "", + "Una vez que estés cómodo moviendote por ahí, tus poderes con los otros comandos de git ¡van a amplificarse!", + "", + "", + "", + "", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## HEAD", + "", + "Primero tenemos que hablar de \"HEAD\". HEAD es el nombre simbólico del commit sobre el que hemos hecho checkout -- es, básicamente, el commit sobre el que estás trabajando.", + "", + "HEAD siempre apunta al commit más reciente, reflejado en el árbol de commits. La mayoría de los comandos de git que hacen cambios al árbol de commits empiezan modificando HEAD.", + "", + "Normalmente HEAD apunta al nombre de una rama (como bugFix). Cuando creas un commit, el estado de bugFix se altera y este cambio es visible a través de HEAD." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veámoslo en acción. A continuación vamos a ver a HEAD antes y después de un commit." + ], + "afterMarkdowns": [ + "¡Ves! HEAD estuvo oculta bajo nuestra rama `master` todo este tiempo." + ], + "command": "git checkout C1; git checkout master; git commit; git checkout C2", + "beforeCommand": "" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "### Detacheando HEAD", + "", + "Detachear (_des-adjuntar_) HEAD simplemente significa adjuntarla a un commit en lugar de a un branch. Así es como se ve de antemano:", + "", + "HEAD -> master -> C1", + "" + ], + "afterMarkdowns": [ + "Y así queda ahora:", + "", + "HEAD -> C1" + ], + "command": "git checkout C1", + "beforeCommand": "" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, detaheemos HEAD de `bugFix` y atacheemosla al commit, en cambio.", + "", + "Especifica este commit por su hash. El hash de cada commit se muestra en el círculo que lo representa." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/rampup/interactiveRebase.js b/src/levels/rampup/interactiveRebase.js index 39ceeeb8..74ba4a17 100644 --- a/src/levels/rampup/interactiveRebase.js +++ b/src/levels/rampup/interactiveRebase.js @@ -9,6 +9,7 @@ exports.level = { "hint": { "en_US": "you can use either branches or relative refs (HEAD~) to specify the rebase target", "es_AR": "podés usar tanto ramas como referencias relativas (HEAD~) para especificar el objetivo del rebase", + "es_ES": "puedes usar tanto ramas como referencias relativas (HEAD~) para especificar el objetivo del rebase", "pt_BR": "Você pode usar ou ramos ou referências relativas (HEAD~) para especificar o alvo do rebase", "gl" : "Podes usar ramas ou referencias relativas (HEAD~) para especificar o obxectivo do rebase", "de_DE": "Du kannst entweder Branches oder relative Ref-Angaben (z.B. HEAD~) benutzen, um das Ziel des Rebase anzugeben.", @@ -23,6 +24,7 @@ exports.level = { "name": { "en_US": "Interactive Rebase Intro", "es_AR": "Introducción al rebase interactivo", + "es_ES": "Introducción al rebase interactivo", "pt_BR": "Introdução ao rebase interativo", "gl" : "Introducción ó rebase interativo", "de_DE": "Einführung Interactive Rebase", @@ -360,6 +362,71 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## git rebase interactivo", + "", + "git cherry-pick es genial cuando sabes qué commits quieres (_y_ sabes sus hashes) -- es dificil superar la simpleza que provee.", + "", + "Pero ¿qué pasa cuando no sabes qué commits quieres? Por suerte ¡git te cubre en esta situación, también! Podemos usar el rebase interactivo para esto -- es la mejor manera de revisar una serie de commits que estás a punto de rebasear.", + "", + "Entremos en los detalles..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Todo rebase interactivo significa usar el comando `rebase` con la opción `-i`.", + "", + "Si incluyes esta opción, git abrirá una UI para mostrarte qué commits están a punto de ser copiados sobre el objetivo del rebase. También muestra sus hashes y mensajes, que ayuda mucho para saber qué es cada commit.", + "", + "Para el git \"de verdad\", la UI signfica abrir un archivo en un editor de textos como `vim`. Para nuestro propósito, hice una pequeña interfaz que se comporta de ese mismo modo." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Cuando el diálogo de rebase interactivo se abre, tienes la capacidad de hacer 3 cosas:", + "", + "* Puedes reordenar los commits con solamente cambiar su orden en la UI (en nuestra ventana, eso significa hacer drag & drop con el mouse).", + "* Puedes elegir ignorar completamente algunos commits. Esto se designa con `pick` -- no hacerle `pick` a algún commit significa que quieres ignorarlo.", + "* Finalmente, puedes _squashear_ commits. Desafortunadamente, nuestros niveles no soportan esto por cuestiones logísticas, por lo que voy a ahorrarte los detalles. Resumiendo, te permite combinar varios commits en uno solo.", + "", + "¡Genial! Veamos un ejemplo." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Cuando aprietes el botón, va a aparecer una ventana de rebase interactivo. Reordena los commits (siéntete libre de ignorar alguno, también) ¡y observa el resultado!" + ], + "afterMarkdowns": [ + "¡Zas! Git copió los commits exactamente de la misma manera que lo especificaste en la UI" + ], + "command": "git rebase -i HEAD~4 --aboveAll", + "beforeCommand": "git commit; git commit; git commit; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar el nivel, haz un rebase interactivo y alcanza el orden que se muestra en la visualización objetivo. Recuerda que siempre puedes hacer `undo` y `reset` para arreglar errores :D" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/rampup/relativeRefs.js b/src/levels/rampup/relativeRefs.js index 0a8b3da8..f075f70e 100644 --- a/src/levels/rampup/relativeRefs.js +++ b/src/levels/rampup/relativeRefs.js @@ -9,6 +9,7 @@ exports.level = { "zh_CN": "相对引用(^)", "zh_TW": "相對引用(^)", "es_AR": "Referencias relativas (^)", + "es_ES": "Referencias relativas (^)", "pt_BR": "Referências relativas (^)", "gl" : "Referencias relativas (^)", "de_DE": "Relative Referenzen (^)", @@ -22,6 +23,7 @@ exports.level = { "ja" : "相対リファレンス(^)を思い出して!", "de_DE": "Denk an den Dach-Operator (^)!", "es_AR": "¡No te olvides del operador ^!", + "es_ES": "¡No te olvides del operador ^!", "pt_BR": "Não se esqueça do operador circunflexo (^)", "gl" : "Non se esqueza do operador circunflexo (^)", "zh_CN": "记住操作符(^)!", @@ -331,6 +333,81 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Referencias relativas", + "", + "Moverse por git usando los hashes de los commits puede volverse un tanto tedioso. En el mundo real no vas a tener una visualización de commits tan linda en la terminal, así que vas a tener que usar `git log` para ver los hashes.", + "", + "Peor aún, los hashes en general son mucho más largos en el git real, también. Por ejemplo, el hash del commit que introduje en el nivel anterior es `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. No es algo particularmente fácil de nombrar...", + "", + "Lo interesante es que git es bastante astuto con los hashes. Sólo requiere que especifiques una cantidad de caracteres suficientes para identificar unívocamente al commit. Entonces, yo podría simplemente tipear `fed2` en lugar de esa cadena larga de arriba." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Como ya dije, especificar los commits por su hash no es la manera más conveniente, y por eso git tiene referencias relativas. ¡Son geniales!", + "", + "Con las referencias relativas puedes arrancar de algún lugar recordable (como la rama `bugFix`, o `HEAD`) y trabajar desde ahí.", + "", + "Los commits relativos son poderosos, pero ahora vamos a presentar sólo dos formas simples:", + "", + "* Moverse un commit hacia atrás con `^`", + "* Moverse una cantidad de commits hacia atrás con `~`" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos el operador ^ primero. Cada vez que le agregas eso al nombre de una referencia, le estás diciendo a git que use el padre del commit especificado.", + "", + "Entonces, decir `master^` es equivalente a \"el primer padre de `master`\".", + "", + "`master^^` es el _abuelo_ (segunda generación de ancestros) de `master`", + "", + "Veamos el commit que está antes de master aquí" + ], + "afterMarkdowns": [ + "¡Zas! Ahí está. Mucho más simple que escribir el hash de ese commit" + ], + "command": "git checkout master^", + "beforeCommand": "git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "También puedes referenciar a `HEAD` como una referencia relativa. Usémoslo un par de veces para movernos hacia atrás en nuestro árbol" + ], + "afterMarkdowns": [ + "¡Fácil! Podemos volver en el tiempo con `HEAD^`" + ], + "command": "git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^", + "beforeCommand": "git commit; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, haz checkout sobre el padre del commit de `bugFix`. Esto va a detachear a `HEAD`.", + "", + "Puedes especificar el hash si quieres, pero mejor ¡trata de usar la referencia relativa!" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/rampup/relativeRefs2.js b/src/levels/rampup/relativeRefs2.js index 4d269a8c..96396bfe 100644 --- a/src/levels/rampup/relativeRefs2.js +++ b/src/levels/rampup/relativeRefs2.js @@ -8,6 +8,7 @@ exports.level = { "zh_CN": "这一关至少要用到一次直接引用 (即哈希值)", "zh_TW": "這一關至少要用到一次直接參考(hash)", "es_AR": "Vas a necesitar usar al menos una referencia directa (hash) para completar este nivel", + "es_ES": "Vas a necesitar usar al menos una referencia directa (hash) para completar este nivel", "pt_BR": "Você precisará usar pelo menos uma referência direta (hash) para completar este nível", "gl" : "Precisarás usar polo menos unha referencia directa (hash) para completar este nivel", "de_DE": "Du musst mindestens einen Hash benutzen, um dieses Level zu schaffen", @@ -21,6 +22,7 @@ exports.level = { "de_DE": "Relative Referenzen #2 (~)", "ja" : "相対リファレンス その2 (~)", "es_AR": "Referencias relativas #2 (~)", + "es_ES": "Referencias relativas #2 (~)", "pt_BR": "Referências relativas #2 (~)", "gl" : "Referencias relativas #2 (~)", "fr_FR": "Références relatives #2 (~)", @@ -169,6 +171,75 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### El operador \"~\"", + "", + "Digamos que quieres moverte un montón de niveles atrás en tu árbol de commits. Podría ser tedioso escribir `^` muchas veces, por lo que git tiene el operador ~.", + "", + "", + "El operador ~ (opcionalmente) toma una cantidad que especifica la cantidad de padres que quieres volver hacia atrás. Veámoslo en acción" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Especifiquemos una cantidad de commits hacia atrás con `~`." + ], + "afterMarkdowns": [ + "¡Zas! Bien conciso -- las referencias relativas la rompen." + ], + "command": "git checkout HEAD~4", + "beforeCommand": "git commit; git commit; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Forzando las ramas", + "", + "Ahora que eres un experto en las referencias relativas, *usémoslas* para algo.", + "", + "Una de las formas más comunes en que uso las referencias relativas es para mover las ramas. Puedes reasignar directamente una rama a un commit usando la opción `-f`. Algo así como:", + "", + "`git branch -f master HEAD~3`", + "", + "Mueve (forzadamente) la rama master tres padres por detrás de HEAD." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos ese comando previo en acción" + ], + "afterMarkdowns": [ + "¡Allá vamos! Las referencias relativas nos proporcionaron una manera concisa de referenciar a `C1`, y forzar la rama (`-f`) nos dio una manera rápida de mover la rama a esa ubicación" + ], + "command": "git branch -f master HEAD~3", + "beforeCommand": "git commit; git commit; git commit; git checkout -b bugFix" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ahora que viste las referencias relativas y el forzar ramas combinados, usémoslos para resolver el siguiente nivel.", + "", + "Para completar este nivel, mueve `HEAD`, `master` y `bugFix` a sus destinos finales." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/rampup/reversingChanges.js b/src/levels/rampup/reversingChanges.js index b1c8f926..0cedd55b 100644 --- a/src/levels/rampup/reversingChanges.js +++ b/src/levels/rampup/reversingChanges.js @@ -9,6 +9,7 @@ exports.level = { "ja" : "変更を元に戻す", "fr_FR": "Annuler des changements avec Git", "es_AR": "Revirtiendo cambios en git", + "es_ES": "Revirtiendo cambios en git", "pt_BR": "Revertendo mudanças no Git", "gl" : "Revertindo cambios en git", "ko" : "Git에서 작업 되돌리기", @@ -22,6 +23,7 @@ exports.level = { "de_DE": "Beachte, dass revert und reset unterschiedliche Argumente benötigen", "fr_FR": "Notez que `revert` et `reset` n'ont pas les mêmes arguments.", "es_AR": "Notá que revert y reset toman parámetros distintos", + "es_ES": "Observa que revert y reset utilizan parámetros distintos", "pt_BR": "Lembre que revert e reset recebem parâmetros diferentes", "gl" : "Lembra que revert e reset usan parámetros distintos", "zh_CN": "注意 revert 和 reset 使用的参数不同。", @@ -158,6 +160,69 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Revirtiendo cambios en git", + "", + "Hay varias maneras de revertir cambios en git. Y, tal como al commitear, revertir cambios en git tiene tanto un componente de bajo nivel (indexar archivos o fragmentos individualmente) como un componente de alto nivel (cómo son efectivamente revertidos los cambios). Nuestra aplicación se va a concentrar en esto último.", + "", + "Hay dos formas principales de deshacer cambios en git -- uno es usando `git reset` y el otro es usando `git revert`. Vamos a ver cada uno de ellos a continuación", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "## Git Reset", + "", + "`git reset` deshace los cambios moviendo la referencia de una rama hacia atrás en el tiempo a un commit anterior. En este sentido puedes imaginarlo como \"reescribir la historia\". `git reset` va a mover la rama hacia atrás, como si el commit nunca se hubiera hecho.", + "", + "Veamos cómo es eso:" + ], + "afterMarkdowns": [ + "¡Genial! git simplemente movió la referencia de la rama master atrás hacia `C1`. Ahora tu repositorio local está en un estado como si `C2` nunca hubiera ocurrido" + ], + "command": "git reset HEAD~1", + "beforeCommand": "git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "## Git Revert", + "", + "Mientras que resetear los cambios funciona estupendamente para ramas locales en tu máquina, su método de \"reescribir la historia\" no funciona para ramas remotas que otros están usando.", + "", + "Para revertir cambios y *compartir* esa _revertida_ con otros, necesitamos usar `git revert`. Veámoslo en acción" + ], + "afterMarkdowns": [ + "Extraño. Hay un nuevo commit aplicado sobre el que queríamos revertir. Eso es porque este nuevo commit `C2'` introduce *cambios* - sólo que esos cambios son exactamente los necesarios para revertir los que introdujo `C2`.", + "", + "Cuando utilices revert, puedes hacer push sobre ese cambio para compartirlo con otros." + ], + "command": "git revert HEAD", + "beforeCommand": "git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, deshaz los dos commits más recientes, tanto en `local` como en `pushed`.", + "", + "Ten en cuenta que `pushed` es una rama remota y `local` es una rama local -- eso debería ayudarte a elegir qué métodos usar." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { From 159cf8dce2017a9c36e8dddfc512e144e63760b9 Mon Sep 17 00:00:00 2001 From: flyingbot91 Date: Thu, 12 Dec 2019 22:58:06 +0100 Subject: [PATCH 142/359] Translated 'rebase' levels to Spanish 'es_ES' --- src/levels/rebase/manyRebases.js | 20 ++++++++++++++++++++ src/levels/rebase/selectiveRebase.js | 22 ++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/src/levels/rebase/manyRebases.js b/src/levels/rebase/manyRebases.js index 6da53c7b..e3c6d939 100644 --- a/src/levels/rebase/manyRebases.js +++ b/src/levels/rebase/manyRebases.js @@ -11,6 +11,7 @@ exports.level = { "en_US": "Rebasing over 9000 times", "de_DE": "10000 Rebases unter dem `HEAD`", "es_AR": "Rebaseando más de 9000 veces", + "es_ES": "Rebaseando más de 9000 veces", "pt_BR": "Fazendo mais de 9000 rebases", "gl" : "Facendo máis de 9000 rebases", "fr_FR": "Rebaser plus de 1000 fois", @@ -25,6 +26,7 @@ exports.level = { "en_US": "Remember, the most efficient way might be to only update master at the end...", "de_DE": "Nicht vergessen: die effizienteste Möglichkeit könnte sein, schließlich einfach nur den master zu aktualisieren ...", "es_AR": "Acordate, la manera más eficiente podría ser actualizar master sólo al final...", + "es_ES": "Recuerda, la manera más eficiente podría ser actualizar master sólo al final...", "pt_BR": "Lembre-se, a forma mais eficiente pode ser atualizar o master por último...", "gl" : "Lembra, a forma máis eficiente pode ser actualizar a rama master ó final...", "fr_FR": "Rappelez-vous, la façon la plus efficace peut être de mettre à jour master seulement à la fin ...", @@ -72,6 +74,24 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Rebaseando múltiples ramas", + "", + "Fíjate, ¡hay un montón de ramas aquí! Rebaseemos todo el trabajo de esas ramas sobre master.", + "", + "La gente de administración nos está haciendo las cosas un poco complicadas, igual -- quieren que nuestros commits estén todos en orden secuencial. Esto significa que nuestro árbol final tendría que tener `C7` al final, `C6` antes de ese, y así siguiendo, todos en orden.", + "", + "Si te haces un lío durante el proceso, siéntete libre de usar `reset` para empezar de nuevo. ¡Asegúrate de verificar tu solución y ver si puedes realizarla en un número inferior de commandos!" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/rebase/selectiveRebase.js b/src/levels/rebase/selectiveRebase.js index b38d3ddf..9fb87eed 100644 --- a/src/levels/rebase/selectiveRebase.js +++ b/src/levels/rebase/selectiveRebase.js @@ -12,6 +12,7 @@ exports.level = { "fr_FR": "Branche spaghetti", "de_DE": "Branch-Spaghetti", "es_AR": "Enslada de branches", + "es_ES": "Ensalada de ramas", "pt_BR": "Espaguete de ramos", "gl" : "Espaguete de ramas", "ja": "ブランチスパゲッティ", @@ -25,6 +26,7 @@ exports.level = { "fr_FR": "Faites attention à tout faire dans le bon ordre ! La branche one d'abord, puis la seconde, puis la troisième", "de_DE": "Stelle sicher, dass du alles in der richtigen Reihenfolge machst! Branche erst one, dann two, dann three.", "es_AR": "¡Asegurate de hacer las cosas en el orden correcto! Brancheá `one` primero, después `two`, y después `three`.", + "es_ES": "¡Asegúrate de hacer las cosas en el orden correcto! Crea primero la rama `one`, después `two`, y después `three`.", "pt_BR": "Certifique-se de fazer tudo na ordem correta! Crie o ramo `one` primeiro, depois `two`, depois `three`.", "gl" : "¡Afiánzate de facer as cousas no orde correcto! Crea ramas `one` de primeiras, e logo `two` e `three`.", "ja": "全て正しい順番で処理すること!oneが最初で、次がtwo、最後にthreeを片付ける。", @@ -95,6 +97,26 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Ensalada de ramas", + "", + "¡Vaya, vaya! Tenemos un _pequeño_ objetivo al que llegar en este nivel.", + "", + "La rama `master` se encuentra algunos commits por delante de `one`, `two` y `three`. Por alguna razón, necesitamos actualizar esas tres ramas con versiones modificadas de los últimos commits de master.", + "", + "La rama `one` necesita reordenarse, y eliminar `C5`. `two` necesita sólo reordenamiento, y `three` ¡sólo necesita un commit!", + "", + "Vamos a dejar que intentes resolver este -- asegúrate de mirar la solución, después, usando `show solution`. " + ] + } + } + ] + }, "pt_BR": { "childViews": [ { From 85caa4a0a1501b8bfd37c6c8c110cf65f5aa7a2c Mon Sep 17 00:00:00 2001 From: flyingbot91 Date: Thu, 12 Dec 2019 23:02:32 +0100 Subject: [PATCH 143/359] es_AR Typos fixed --- src/levels/index.js | 4 ++-- src/levels/mixed/jugglingCommits.js | 4 ++-- src/levels/rampup/detachedHead.js | 4 ++-- src/levels/rebase/selectiveRebase.js | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/levels/index.js b/src/levels/index.js index 5d343e2a..0fd3247e 100644 --- a/src/levels/index.js +++ b/src/levels/index.js @@ -119,7 +119,7 @@ var sequenceInfo = exports.sequenceInfo = { 'de_DE': 'Push & Pull -- entfernte Repositorys', 'ja' : 'Push及びPullコマンド -- Gitリモート', 'fr_FR': 'Push & Pull -- dépôts gits distants !', - 'es_AR': 'Push & Pull -- Git Remotes!', + 'es_AR': 'Push y Pull -- Git Remotes!', 'pt_BR': 'Push & Pull -- repositórios remotos no Git!', 'gl' : 'Push & Pull -- Repositorios remotos no Git!', 'zh_CN': 'Push & Pull —— Git 远程仓库!', @@ -150,7 +150,7 @@ var sequenceInfo = exports.sequenceInfo = { 'de_DE': 'Bis zum origin und noch weiter', 'ja' : '"origin"とその先へ -- Gitリモート上級編', 'fr_FR': 'Vers l\'infini et au-delà -- dépôts distants version avancée', - 'es_AR': 'Hasta el origin y más allá -- Git Remotes avanzado!', + 'es_AR': 'Hasta el origen y más allá -- Git Remotes avanzado!', 'pt_BR': 'Até a origin e além -- repositórios remotos avançados!', 'gl' : 'Ata á orixe e máis aló -- repositorios remotos avanzados!', 'zh_CN': '关于 origin 和它的周边 —— Git 远程仓库高级操作', diff --git a/src/levels/mixed/jugglingCommits.js b/src/levels/mixed/jugglingCommits.js index 747a518e..0ecc69f7 100644 --- a/src/levels/mixed/jugglingCommits.js +++ b/src/levels/mixed/jugglingCommits.js @@ -123,7 +123,7 @@ exports.level = { "markdowns": [ "## Haciendo malabares con los commits", "", - "Estaes otra situación algo común. Tenés algunos cambios (`newImage`) y otro conjunto de cambios (`caption`) que están relacionados, entonces están apilados en tu repositorio uno encima del otro (es decir, uno después del otro).", + "Esta es otra situación algo común. Tenés algunos cambios (`newImage`) y otro conjunto de cambios (`caption`) que están relacionados, entonces están apilados en tu repositorio uno encima del otro (es decir, uno después del otro).", "", "El tema es que a veces tenés que hacer una pequeña modificación a un commit previo. En este caso, la gente de diseño requiere que cambiemos ligeramente las dimensiones de `newImage`, ¡incluso aunque ese commit ya esté atrás en nuestra historia!" ] @@ -138,7 +138,7 @@ exports.level = { "* Vamos a reordenar los commits para que el que queremos cambiar quede arriba de todo con `git rebase -i`", "* Vamos a hacer `commit --amend` para aplicar la ligera modificación", "* Después vamos a reordenar los commits a como estaban con `git rebase -i`", - "* Finalmente, vamos a mover master a esta parte actualizada de nuestor árbol de commits para terminar el nivel (usando el método que prefieras)", + "* Finalmente, vamos a mover master a esta parte actualizada de nuestro árbol de commits para terminar el nivel (usando el método que prefieras)", "", "Hay varias maneras de lograr este objetivo en general (ya te veo haciéndole ojitos al cherry-pick), y veremos algunos más después, pero por ahora concentrémonos en esta técnica.", "", diff --git a/src/levels/rampup/detachedHead.js b/src/levels/rampup/detachedHead.js index 14c30287..7459ea1c 100644 --- a/src/levels/rampup/detachedHead.js +++ b/src/levels/rampup/detachedHead.js @@ -146,7 +146,7 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Veamoslo en acción. Acá vamos a ver a HEAD antes y después de un commit." + "Veámoslo en acción. Acá vamos a ver a HEAD antes y después de un commit." ], "afterMarkdowns": [ "¡Ves! HEAD estuvo oculta bajo nuestra rama `master` todo este tiempo." @@ -179,7 +179,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Para completar este nivel, detacheemos HEAD de `bugFix` y ataccheemosla al commit, en cambio.", + "Para completar este nivel, detacheemos HEAD de `bugFix` y atacheemosla al commit, en cambio.", "", "Especificá este commit por su hash. El hash de cada commit se muestra en el círculo que lo representa." ] diff --git a/src/levels/rebase/selectiveRebase.js b/src/levels/rebase/selectiveRebase.js index b38d3ddf..34375f38 100644 --- a/src/levels/rebase/selectiveRebase.js +++ b/src/levels/rebase/selectiveRebase.js @@ -11,7 +11,7 @@ exports.level = { "en_US": "Branch Spaghetti", "fr_FR": "Branche spaghetti", "de_DE": "Branch-Spaghetti", - "es_AR": "Enslada de branches", + "es_AR": "Ensalada de branches", "pt_BR": "Espaguete de ramos", "gl" : "Espaguete de ramas", "ja": "ブランチスパゲッティ", From 5eb9de500a815460ca1995d33262bb4d7ebf2cdd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 14 Dec 2019 02:37:44 +0000 Subject: [PATCH 144/359] Bump mixin-deep from 1.3.1 to 1.3.2 Bumps [mixin-deep](https://github.com/jonschlinkert/mixin-deep) from 1.3.1 to 1.3.2. - [Release notes](https://github.com/jonschlinkert/mixin-deep/releases) - [Commits](https://github.com/jonschlinkert/mixin-deep/compare/1.3.1...1.3.2) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e0639cbb..5f477b4b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2873,9 +2873,9 @@ minizlib@^1.1.1: minipass "^2.2.1" mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" From 4631475b3912717a01f895b1fae58b4c711f832d Mon Sep 17 00:00:00 2001 From: flyingbot91 Date: Wed, 18 Dec 2019 22:41:08 +0100 Subject: [PATCH 145/359] Translated 'remote' levels to Spanish 'es_ES' --- src/levels/remote/clone.js | 59 ++++++++++ src/levels/remote/fakeTeamwork.js | 56 ++++++++++ src/levels/remote/fetch.js | 75 +++++++++++++ src/levels/remote/fetchArgs.js | 125 +++++++++++++++++++++ src/levels/remote/fetchRebase.js | 145 +++++++++++++++++++++++++ src/levels/remote/mergeManyFeatures.js | 47 ++++++++ src/levels/remote/pull.js | 61 +++++++++++ src/levels/remote/pullArgs.js | 76 +++++++++++++ src/levels/remote/push.js | 43 ++++++++ src/levels/remote/pushArgs.js | 74 +++++++++++++ src/levels/remote/pushArgs2.js | 72 ++++++++++++ src/levels/remote/pushManyFeatures.js | 55 ++++++++++ src/levels/remote/remoteBranches.js | 63 +++++++++++ src/levels/remote/sourceNothing.js | 55 ++++++++++ src/levels/remote/tracking.js | 122 +++++++++++++++++++++ 15 files changed, 1128 insertions(+) diff --git a/src/levels/remote/clone.js b/src/levels/remote/clone.js index 5ef9ff65..65d8d850 100644 --- a/src/levels/remote/clone.js +++ b/src/levels/remote/clone.js @@ -7,6 +7,7 @@ exports.level = { "de_DE": "Clone Einführung", "ja" : "Clone入門", "es_AR": "Introducción a clone", + "es_ES": "Introducción a clone", "pt_BR": "Introdução à clonagem", "gl" : "Introducción a clone", "zh_CN": "Git Clone", @@ -22,6 +23,7 @@ exports.level = { "ja" : "単にgit clone!", "zh_CN": "只要 git clone 就可以了!", "es_AR": "Simplemente hacé git clone!", + "es_ES": "¡Simplemente escribe `git clone`!", "pt_BR": "Basta fazer um git clone!", "gl" : "¡Chega con facer git clone!", "zh_TW": "只要 git clone 就好了", @@ -201,6 +203,63 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Remotes", + "", + "Los repositorios remotos no son _tan_ complicados. En el mundo actual de la computación en la nube es bastante facil pensar que hay un montón de magia detrás de los remotes de git, pero en realidad sólo son copias de tu repositorio en otra computadora. Típicamente vas a hablar con esta otra computadora a través de Internet, lo que permite transferir commits de un lado a otro.", + "", + "Habiendo dicho eso, los repositorios remotos tienen un par de propiedades interesantes:", + "", + "- Primero y principal, los remotos ¡son un backup genial! Los repositorios locales de git tienen la habilidad de restaurar archivos a un estado previo (como ya sabes), pero toda esa información se encuentra almacenada localmente. Al tener copias de tu repositorio git en otras computadoras, puedes perder todos tus datos locales y aún así retomar el trabajo en el punto donde lo habías dejado.", + "", + "- Más importante, ¡los remotos sociabilizan la programación! Ahora que hay una copia de tu proyecto hosteada en otro lugar, tus amigos pueden contribuir a tu proyecto (o bajarse los últimos cambios) de un modo muy sencillo.", + "", + "Se volvió bastante popular el uso de sitios web que muestran la actividad de los repositorios (como [Github](https://github.com/) or [Phabricator](http://phabricator.org/)), pero esos repositorios remotos _siempre_ sirven como la base subyacente de esas herramientas. Así que ¡es importante entenderlos!" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Nuestro comando para crear remotos", + "", + "Hasta este punto, Learn Git Branching se centró en enseñar las bases del trabajo _local_ con repositorios (crear ramas, mergear, rebasear, etc). Sin embargo, ahora que queremos aprender sobre el trabajo con repositorios remotos, necesitamos un comando para inicializar nuestro entorno para esas lecciones. Ese comando será `git clone`", + "", + "Técnicamente, `git clone` en el mundo real es el comando que usarías para crear copias _locales_ de un repositorio remoto (uno de GitHub, por ejemplo). Aquí usamos este comando de un modo un tanto distinto, en cambio -- `git clone` va a crear un repositorio remoto a partir del tuyo local. Estamos de acuerdo en que es el significado técnicamente opuesto al del comando real, pero ayuda bastante a entender la conexión entre el clonado y el trabajo en un repositorio remoto, así que vamos a vivir con ello por ahora.", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Comencemos despacio y simplemente veamos cómo se ve un repositorio remoto en nuestra visualización.", + "" + ], + "afterMarkdowns": [ + "¡Ahí está! Ahora tenemos un repositorio remoto de nuestro proyecto. Parece bastante similar, salvando algunos cambios visuales para hacer evidente la distinción -- en niveles posteriores vas a ver cómo compartir trabajo entre estos repositorios." + ], + "command": "git clone", + "beforeCommand": "" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, simplemente ejecuta `git clone` en tu repositorio existente. El verdadero aprendizaje viene en las próximas lecciones." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/fakeTeamwork.js b/src/levels/remote/fakeTeamwork.js index ca08387f..44795ede 100644 --- a/src/levels/remote/fakeTeamwork.js +++ b/src/levels/remote/fakeTeamwork.js @@ -8,6 +8,7 @@ exports.level = { "de_DE": "Teamarbeit simulieren", "ja" : "擬似的なチーム作業", "es_AR": "Simulando el trabajo en equipo", + "es_ES": "Simulando el trabajo en equipo", "pt_BR": "Simulando trabalho em equipe", "gl" : "Simulando o traballo no repositorio", "zh_CN": "模拟团队合作", @@ -22,6 +23,7 @@ exports.level = { "de_DE": "Nicht vergessen, du kannst angeben wieviele Commits simuliert werden sollen.", "ja" : "擬似的に作成するコミット数を指定できるのをお忘れなく", "es_AR": "Acordate que podés especificar cuántos commits simular", + "es_ES": "Recuerda que puedes especificar cuántos commits simular", "pt_BR": "Lembre-se que você pode especificar quantos commits quer simular", "gl" : "Lembra que podes especifar cantos commits queres simular", "zh_CN": "记住你可以指定仿真提交的个数", @@ -193,6 +195,60 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Simulando la colaboración", + "", + "Entonces, hay algo un poco tramposo -- para algunas de las lecciones siguientes, necesitamos explicarte cómo descargar cambios introducidos en el repositorio remoto.", + "", + "Eso significa que escencialmente tenemos que \"tener en cuenta\" que el repositorio remoto fue actualizado por algún colega, amigo o colaborador tuyo, incluso a veces en alguna rama específica o una cantidad determinada de commits.", + "", + "Para lograr esto, introdujimos el bien llamado comando ¡`git fakeTeamwork`! Es bastante autoexplicativo: simula trabajo de nuestros colegas. Veamos una demo..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "El comportamiento por default de `fakeTeamwork` es simplemente crear un commit en master" + ], + "afterMarkdowns": [ + "Ahí está: el remoto se actualizó con un nuevo commit, y todavía no nos bajamos ese commit porque aún no hicimos `git fetch`." + ], + "command": "git fakeTeamwork", + "beforeCommand": "git clone" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "También puedes especificar la cantidad de commits o la ramma agregándolos al comando" + ], + "afterMarkdowns": [ + "Con un único comando simulamos que un compañero de equipo pusheó tres commits a la rama `foo` de nuestro remoto" + ], + "command": "git fakeTeamwork foo 3", + "beforeCommand": "git branch foo; git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Los niveles siguientes van a ser algo difíciles, así que vamos a exigirte un poco más en este nivel.", + "", + "Anímate y crea un remoto (con `git clone`), simula algunos cambios en ese remoto, haz commit en tu repo local, y luego haz pull de esos cambios. ¡Es como si fueran varias lecciones en una!" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/fetch.js b/src/levels/remote/fetch.js index 29c94e80..9d1b645c 100644 --- a/src/levels/remote/fetch.js +++ b/src/levels/remote/fetch.js @@ -8,6 +8,7 @@ exports.level = { "de_DE": "Git Fetch", "ja" : "Git Fetch", "es_AR": "git fetch", + "es_ES": "git fetch", "pt_BR": "Git Fetch", "gl" : "Git Fetch", "zh_CN": "Git Fetch", @@ -22,6 +23,7 @@ exports.level = { "de_DE": "Einfach git fetch ausführen!", "ja" : "単にgit fetchを実行!", "es_AR": "Simplemente ¡hacé git fetch!", + "es_ES": "Simplemente ¡escribe git fetch!", "pt_BR": "Simplesmente chame git fetch!", "gl" : "¡Sinxelamente fai git fetch!", "zh_CN": "只需要运行 git fetch 命令!", @@ -250,6 +252,79 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Fetch", + "", + "Trabajar con remotos en git en realidad se reduce a transferir datos _de_ y _hacia_ otros repositorios. Mientras podamos mandar commits de un lado al otro, podemos compartir cualquier tipo de actualización registrada por git (y, por ende, compartir trabajo, archivos nuevos, ideas nuevas, cartas de amor, etc).", + "", + "En esta lección aprenderemos cómo traer (hacer `fetch`) datos _desde_ un repositorio remoto - el comando para esto se llama, convenientemente, `git fetch`).", + "", + "Vas a notar que a medida que actualicemos nuestra representación de nuestro repositorio remoto, nuestras ramas _remotas_ van a actualizarse para reflejar esa nueva representación. Esto está ligado a la lección anterior sobre ramas remotas" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Antes de entrar en los detalles de `git fetch`, veámoslo en acción. Aquí tenemos un repositorio remoto que contiene dos commits que nuestro repositorio local no tiene." + ], + "afterMarkdowns": [ + "¡Allá vamos! Bajamos los commits `C2` y `C3` a nuestro repositorio local, y nuestra rama remota `o/master` fue actualizada para reflejar este cambio." + ], + "command": "git fetch", + "beforeCommand": "git clone; git fakeTeamwork 2" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### ¿Qué hace fetch?", + "", + "`git fetch` hace dos simples pasos, y sólo dos simples pasos:", + "", + "* baja los commits que el remoto tiene pero no están en nuestro repositorio local, y...", + "* actualiza a dónde apuntan nuestras ramas remotas (por ejemplo, `o/master`)", + "", + "`git fetch` escencialmente sincroniza nuestra representación _local_ del repositorio remoto con el _verdadero_ estado del repositorio remoto (en este momento).", + "", + "Si recuerdas la lección anterior, dijimos que las ramas remotas reflejan el estado de los repositorios remotos _desde_ la última vez que hablaste con ellos. ¡`git fetch` es la manera en la que hablas con esos remotos! Espero que ahora esté clara la conexión entre las ramas remotas y `git fetch`.", + "", + "Usualmente, `git fetch` habla con el repositorio a través de internet (usando un protocolo como `http://` o `git://`).", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### ¿Qué *no* hace fetch?", + "", + "Sin embargo, `git fetch` no modifica en absoluto _tu_ estado local. No va a actualizar tu rama `master` ni va a cambiar nada sobre cómo se ve tu sistema de archivos en este momento.", + "", + "Es importante entender esto, porque un montón de desarrolladores piensan que correr `git fetch` hará que su estado local refleje el estado del remoto. `git fetch` puede descargar los datos necesarios para hacerlo, pero *no* cambia ninguno de tus archivos locales. Vamos a aprender otros comandos para hacer eso más adelante :D", + "", + "Entonces, después de todo, puedes pensar sobre `git fetch` como un proceso de descarga." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, simplemente ejecuta `git fetch` y bájate todos los commits" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/fetchArgs.js b/src/levels/remote/fetchArgs.js index ee0bccd9..05919a88 100644 --- a/src/levels/remote/fetchArgs.js +++ b/src/levels/remote/fetchArgs.js @@ -8,6 +8,7 @@ exports.level = { "zh_CN": "Git fetch 的参数", "zh_TW": "fetch 的參數", "es_AR": "Parámetros de fetch", + "es_ES": "Parámetros de fetch", "pt_BR": "Parâmetros do fetch", "gl" : "Parámetros de fetch", "de_DE": "Optionen für Fetch", @@ -22,6 +23,7 @@ exports.level = { "zh_CN": "注意下提交对象的 id 是如何交换的! 你可以通过 `help level` 重新阅读本关卡的所有对话框!", "zh_TW": "注意 commit 的 id 是怎麼被交換的!你可以透過 `help level` 來閱讀對話視窗!", "es_AR": "¡Prestá atención a cómo podrían haberse invertido los ids de los commits! Podés volver a leer toda la lección usando \"help level\"", + "es_ES": "¡Presta atención a cómo podrían haberse invertido los ids de los commits! Puedes volver a leer toda la lección usando \"help level\"", "pt_BR": "Preste atenção em como os identificadores dos commits podem ter trocado! Você pode ler os slides novamente com \"help level\"", "gl" : "Preste atención en como poderían invertirse os ids dos commits! Podes volver ler toda a lección usando \"help level\"", "de_DE": "Beachte wie die Commit IDs getauscht wurden! Du kannst den Einführungsdialog mit \"help level\" erneut anzeigen", @@ -400,6 +402,129 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Parámetros de git fetch", + "", + "Acabamos de aprender todo sobre los parámetros de push, como el parámetro ``, e incluso las referencias separadas por dos puntos (`:`). ¿Podremos usar todo ese conocimiento para `git fetch`, también?", + "", + "¡Dalo por hecho! Los parámetros para `git fetch` son realmente *muy, muy* similares a los de `git push`. Es el mismo tipo de conceptos, pero aplicados en la dirección opuesta (dado que ahora estás bajando commits en lugar de subirlos).", + "", + "Veamos los conceptos de a uno en uno..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### El parámetro ``", + "", + "Si especificas un lugar con git fetch como en el comando siguiente:", + "", + "`git fetch origin foo`", + "", + "Git va a ir a la rama `foo` en el remoto, va a traer todos los commits que no estén presentes localmente, y luego los aplicará sobre la rama `o/foo` localmente.", + "", + "Veámoslo en acción (refresquemos el concepto)." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Especificando un lugar..." + ], + "afterMarkdowns": [ + "Sólo bajamos los commits de `foo` y los ubicamos en `o/foo`" + ], + "command": "git fetch origin foo", + "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Te podrás estar preguntando \"¿Por qué git aplicó esos commits sobre la rama `origin/foo` en lugar de aplicarlos sobre la rama `foo` local? Pensé que el parámetro `` era un lugar que existía tanto local como remotamente\"", + "", + "Bueno, git hace una excepción especial en este caso, porque podrías tener trabajo en la rama `foo` que no quieras mezclar. Esto hace referencia a la lección anterior sobre `git fetch` - no actualiza tus ramas locales no-remotas, sólo descarga los commits (para que pueadas verlos o mergearlos después).", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "\"Bueno, y, en ese caso, ¿qué pasa si explícitamente defino el origen y destino con `:`?\"", + "", + "Si te sientes lo suficientemente seguro como para traer commits *directamente* a una rama local, entonces, sí, puedes especificarlo usando una referencia con dos puntos. No puedes traer commits a una rama que sobre la que hayas hecho checkout, pero en cualquier otro caso git te lo va a permitir.", + "", + "Este es el único problema, igual: `` es ahora un lugar en el *remoto*, y `` es un lugar *local* en donde poner esos commits. Es exactamente lo opuesto a git push, y eso tiene sentido dado que ¡estamos transfiriendo los datos en la dirección opuesta!", + "", + "Habiendo dicho esto, difícilmente alguien use esto en la práctica. Lo estoy presentando principalmente como un modo de conceptualizar que `fetch` y `push` son bastante similares, sólo que en direcciones opuestas." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos esta locura en acción:" + ], + "afterMarkdowns": [ + "¡Caramba! Mira: git resolvió `foo~1` como un lugar en el origin y bajó esos commits a `bar` (que era una rama local). Observa como `foo` y `o/foo` no fueron actualizados, dado que especificamos un destino." + ], + "command": "git fetch origin foo~1:bar", + "beforeCommand": "git branch foo; git clone; git branch bar; git fakeTeamwork foo 2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Qué pasa si el destino no existe antes de ejecutar este comando? Veamos el último ejemplo pero sin que `bar` exista de antemano." + ], + "afterMarkdowns": [ + "Mira: es IGUAL que git push. Git creó el destino localmente antes de hacer el fetch, tal como git creará el destino en el remoto antes de hacer push (si no existiera)." + ], + "command": "git fetch origin foo~1:bar", + "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Sin argumentos?", + "", + "Si `git fetch` no recibe ningún argumento, simplemente descarga todos los commits del remoto a todas las ramas remotas..." + ], + "afterMarkdowns": [ + "Bastante simple, pero merece la pena verlo al menos una vez." + ], + "command": "git fetch", + "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork master" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Bueno, demasiada charla. Para completar este nivel, haz fetch sólo de los commits especificados en la visualización del objetivo. ¡Familiarízate con esos comandos!", + "", + "Vas a tener que especificar el origen y el destino para ambos comandos fetch. Presta atención al objetivo dado que ¡los IDs pueden estar invertidos!" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/fetchRebase.js b/src/levels/remote/fetchRebase.js index f1d6fdde..e54280a3 100644 --- a/src/levels/remote/fetchRebase.js +++ b/src/levels/remote/fetchRebase.js @@ -7,6 +7,7 @@ exports.level = { "zh_CN": "偏离的提交历史", "zh_TW": "diverged history", "es_AR": "Historia divergente", + "es_ES": "Historia divergente", "pt_BR": "Histórico divergente", "gl" : "Histórico diverxente", "de_DE": "Abweichende History", @@ -21,6 +22,7 @@ exports.level = { "zh_CN": "按照目标中的提交树的顺序进行检出", "zh_TW": "確認視覺化的目標中的順序", "es_AR": "Prestá atención al orden del objetivo", + "es_ES": "Presta atención al orden del objetivo", "pt_BR": "Preste atenção na ordem da visualização do objetivo", "gl" : "Presta atención ó orixe do obxectivo", "de_DE": "Beachte die Reihenfolge in der Zieldarstellung", @@ -460,6 +462,149 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Trabajo divergente", + "", + "Hasta ahora hemos visto cómo hacer pull a commits de otros y cómo hacer push a los nuestros. Parece bastante simple, así que ¿cómo puede confundirse tanto la gente?", + "", + "La dificultad viene cuando la historia de los repositorios *diverge*. Antes de entrar en detalles, veamos un ejemplo...", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Imagínate que clonas un repositorio el lunes y empiezas a desarrollar algo. Para el viernes ya estás listo para publicar tu trabajo, pero, ¡vaya! Tus colegas también han estado escribiendo código durante la semana, haciendo que tu trabajo quede desactualizado (y obsoleto). Además, ellos publicaron esos commits en el repositorio remoto, así que ahora *tu* trabajo está basado en una versión *vieja* del proyecto, que ya no le interesa a nadie.", + "", + "En este caso, el comando `git push` es ambiguo. Si ejecutas `git push`, ¿git debería cambiar el repositorio a como estaba el lunes? ¿Debería tratar de agregar tu código sin eliminar el código nuevo? ¿O debería ignorar completamente tus cambios porque están desactualizados?", + "", + "Como hay tanta ambiguedad en esta situación (en la que la historia divirgió), git no te permite hacer push de tus cambios. En cambio, te fuerza a integrar el último estado del repositorio remoto antes de poder compartir tu trabajo." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¡Demasiada charla, veámoslo en acción!" + ], + "afterMarkdowns": [ + "¿Ves? No pasó nada, porque el comando falla. `git push` falla porque `C3`, tu commit más reciente, está basado en el remoto sobre `C1`. El remoto fue actualizado a `C2` desde entonces, por lo que git rechaza tu push" + ], + "command": "git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¿Cómo puedes resolver esta situación? Es fácil, todo lo que tienes que hacer es basar tu trabajo en la versión más reciente de la rama remota.", + "", + "Hay un par de maneras de hacer esto, pero la más simple es mover tu trabajo haciendo un rebase. Probémoslo a ver cómo se ve." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Ahora, si hacemos rebase antes de hacer push..." + ], + "afterMarkdowns": [ + "¡Zas! Actualizamos nuestra representación local del remoto con `git fetch`, hacemos rebase de nuestro trabajo para reflejar los nuevos cambios del remoto, y después los subimos con `git push`" + ], + "command": "git fetch; git rebase o/master; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¿Hay otra manera de actualizar mi trabajo si actualizaron el repositorio remoto? ¡Claro que sí! Veamos cómo hacer lo mismo pero usando `merge`.", + "", + "Por más que `git merge` no mueva tu trabajo (sólo crea un commit de merge), es un modo de decirle a git que integraste todos los cambios del remoto. Esto es porque ahora una rama remota pasó a ser un *ancestro* de tu propia rama, lo que significa que tu commit refleja los cambios de todos los commits de la rama remota.", + "", + "Veamos una muestra..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Si en lugar de hacer rebase hacemos un merge..." + ], + "afterMarkdowns": [ + "¡Zas! Actualizamos nuestra representación local del remoto usando `git fetch`, *mergeamos* el nuevo trabajo junto con el nuestro (para reflejar los nuevos cambios en el remoto), y después los subimos usando `git push`" + ], + "command": "git fetch; git merge o/master; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¡Asombroso! ¿Hay forma de hacer esto sin escribir tantos comandos?", + "", + "¡Claro que sí! Ya sabes que `git pull` es simplemente un atajo para hacer fetch y merge. Convenientemente, ¡`git pull --rebase` es un atajo para hacer fetch y rebase!", + "", + "Veamos estos atajos funcionando." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Primero con `--rebase`..." + ], + "afterMarkdowns": [ + "¡Igual que antes! Sólo que bastante más corto." + ], + "command": "git pull --rebase; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Y ahora un `pull` común" + ], + "afterMarkdowns": [ + "Otra vez, ¡exactamente lo mismo que antes!" + ], + "command": "git pull; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Toda este tinglado de hacer fetch, rebase/merge y push es bastante común. En lecciones futuras vamos a ver formas más complejas de estos flujos de trabajo, pero por ahora vamos a probar esto que acabamos de ver.", + "", + "Para resolver este nivel, haz lo siguiente:", + "", + "* Clona tu repositorio", + "* Simula algo de trabajo de un colega (1 commit)", + "* Haz commit de algún cambio tuyo (1 commit)", + "* Publica tu trabajo *rebaseando*" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/mergeManyFeatures.js b/src/levels/remote/mergeManyFeatures.js index 136a202c..7c22e2e1 100644 --- a/src/levels/remote/mergeManyFeatures.js +++ b/src/levels/remote/mergeManyFeatures.js @@ -7,6 +7,7 @@ exports.level = { "zh_CN": "合并远程仓库", "zh_TW": "merge with remotes", "es_AR": "Mergeando con los remotos", + "es_ES": "Haciendo merge con los remotos", "pt_BR": "Merge com remotos", "gl" : "Merge cos repos remotos", "de_DE": "Änderungen vom Remote zusammenführen", @@ -21,6 +22,7 @@ exports.level = { "zh_CN": "注意目标树!", "zh_TW": "注意最後要完成的目標!", "es_AR": "¡Prestá atención al árbol final!", + "es_ES": "¡Presta atención al árbol final!", "pt_BR": "Preste atenção na árvore do objetivo!", "gl" : "Presta atención á arbore final!", "de_DE": "Beachte den Ziel-Baum!", @@ -167,6 +169,51 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## ¿Por qué no hacer merge?", + "", + "Para hacer push con tus novedades al remoto, todo lo que tienes que hacer es *integrar* los últimos cambios del remoto con los tuyos. Eso significa que puedes hacer tanto rebase como merge con la rama remota (por ejemplo, `o/master`).", + "", + "Así que si puedes hacer cualquiera de las dos, ¿por qué las lecciones sólo se han centrado en rebasear hasta ahora? ¿Por qué no dedicarle algo de amor al `merge` cuando trabajamos con remotos?", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Hay mucho debate entre los desarrolladores sobre los pros y contras de mergear vs rebasear. Aquí te mostraré los pros y contras de rebasear:", + "", + "Pros:", + "", + "* Rebasear hace que tu árbol de commits se vea bastante limpio, porque todos los commits siguen una única línea", + "", + "Contras:", + "", + "* Rebasear modifica la historia (aparente) de tu árbol de commits.", + "", + "Por ejemplo, el commit `C1` puede rebasearse para que aparezca *después* de `C3`. Entonces, parece que el trabajo de `C1'` se hizo después de `C3`, cuando en realizad se había hecho antes.", + "", + "Algunos desarrolladores prefieren preservar la historia, por lo que deciden mergear. Otros (como yo) preferimos tener un árbol de commits limpios, y preferimos rebasear. Todo es una cuestión de preferencias :D" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para este nivel, tratemos de resolver el nivel anterior, pero *mergeando*. Puede volverse un poco cuesta arriba, pero ilustra la idea bastante bien." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/pull.js b/src/levels/remote/pull.js index a19a0f80..5ae8701e 100644 --- a/src/levels/remote/pull.js +++ b/src/levels/remote/pull.js @@ -7,6 +7,7 @@ exports.level = { "zh_CN": "Git Pull", "zh_TW": "git pull", "es_AR": "git pull", + "es_ES": "git pull", "pt_BR": "Git Pull", "gl" : "Git Pull", "de_DE": "Git Pull", @@ -21,6 +22,7 @@ exports.level = { "zh_CN": "运行 git pull 命令就可以了!", "zh_TW": "只要下 git pull 這個指令即可", "es_AR": "Simplemente ¡hacé git pull!", + "es_ES": "Simplemente ¡ejecuta git pull!", "pt_BR": "Basta executar git pull!", "gl" : "Sinxelamente fai git pull!", "de_DE": "Führe einfach git pull aus.", @@ -208,6 +210,65 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Pull", + "", + "Ahora que vimos cómo traer datos de un repositorio remoto con `git fetch`, ¡actualicemos nuestro trabajo local para reflejar esos cambios!", + "", + "Realmente hay varias formas de hacer esto: una vez que tienes los commits disponibles localmente, puedes integrarlos como si fueran commits comunes de otras ramas. Esto significa que podrías ejecutar comandos como:", + "", + "* `git cherry-pick o/master`", + "* `git rebase o/master`", + "* `git merge o/master`", + "* etc., etc.", + "", + "De hecho, el flujo de trabajo de *fetchear* cambios remotos y después *mergearlos* es tan común que git incluye un comando que hace ambas cosas de una: ¡`git pull`!" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos primero un `fetch` y un `merge` ejecutados secuencialmente" + ], + "afterMarkdowns": [ + "Zas: descargamos `C3` con un `fetch` y luego lo mergeamos con `git merge o/master`. Ahora nuestra rama `master` refleja el nuevo trabajo del remoto (en este caso, llamado `origin`)" + ], + "command": "git fetch; git merge o/master", + "beforeCommand": "git clone; git commit; git fakeTeamwork" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Qué pasaría si en cambio utilizásemos `git pull`?" + ], + "afterMarkdowns": [ + "¡Lo mismo! Eso debería dejar bien claro que `git pull` es básicamente un atajo para hacer `git fetch` seguido por un merge con la rama que hayamos descargado." + ], + "command": "git pull", + "beforeCommand": "git clone; git commit; git fakeTeamwork" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Exploraremos los detalles de `git pull` después (incluyendo sus opciones y parámetros), pero por ahora probémoslo en este nivel.", + "", + "Recuerda: puedes ejecutar este comando simplemente con `fetch` y `merge`, pero eso te costaría un comando extra :P" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/pullArgs.js b/src/levels/remote/pullArgs.js index c719162a..e9e1cbb4 100644 --- a/src/levels/remote/pullArgs.js +++ b/src/levels/remote/pullArgs.js @@ -7,6 +7,7 @@ exports.level = { "zh_CN": "Git pull 的参数", "zh_TW": "pull 的參數", "es_AR": "Parámetros de pull", + "es_ES": "Parámetros de pull", "pt_BR": "Parâmetros do pull", "gl" : "Parámetros de pull", "de_DE": "Optionen für Pull", @@ -21,6 +22,7 @@ exports.level = { "zh_CN": "记住, 你可以通过 fetch/pull 创建本地分支", "zh_TW": "記住,你可以透過 fetch 以及 pull 來建立一個新的 local 的 branch", "es_AR": "Acordate de que podés crear nuevas ramas locales usando los parámetros de fetch/pull", + "es_ES": "Recuerda que puedes crear nuevas ramas locales usando los parámetros de fetch/pull", "pt_BR": "Lembre-se que você pode criar novos ramos locais com parâmetros de fetch/pull", "gl" : "Lémbrate que podes crear novas ramas locais con parámetros de fetch/pull", "de_DE": "Du kannst neue lokale Branches mittels fetch / pull erstellen", @@ -253,6 +255,80 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Parámetros de git pull", + "", + "Ahora que sabes prácticamente *todo* lo que hay que saber sobre los parámetros de `git fetch` y `git push`, casi no queda nada por cubrir del comando git pull :)", + "", + "Eso es porque git pull es simplemente un atajo para hacer un fetch seguido de un merge. Puedes imaginártelo como ejecutar git fetch con los *mismos* parámetros, y después hacer merge de ello hacia donde esos commits hayan ido a parar.", + "", + "Esto aplica incluso cuando utilizas parámetros rebuscados en exceso. Veamos algunos ejemplos:" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Estos son algunos comandos equivalentes de git:", + "", + "`git pull origin foo` equivale a:", + "", + "`git fetch origin foo; git merge o/foo`", + "", + "Y...", + "", + "`git pull origin bar~1:bugFix` equivale a:", + "", + "`git fetch origin bar~1:bugFix; git merge bugFix`", + "", + "¿Ves? git pull es simplemente un atajo para un fetch + merge, y todo lo que le importa a git pull es dónde terminaron esos commits (el parámetro `destino` que determina durante el fetch).", + "", + "Veamos una demostración:" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Si especificamos el lugar desde donde hacer fetch, todo ocurre como antes, pero sólo mergeamos lo que se fetcheó" + ], + "afterMarkdowns": [ + "¡Ves! Especificando `master` descargamos los commits a `o/master` como siempre. Después mergeamos `o/master` a nuestra rama actual, *sin importar* qué había en nuestra copia de trabajo." + ], + "command": "git pull origin master", + "beforeCommand": "git clone; go -b bar; git commit; git fakeTeamwork" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Esto funciona con origen y destino, también? ¡Más vale! Veámoslo:" + ], + "afterMarkdowns": [ + "Caramba, eso es una BARBARIDAD en un único comando. Creamos una nueva rama local llamada `foo`, descargamos los commits del master del remoto a esta rama `foo`, y después mezclamos esa rama a nuestra rama actual `bar`. ¡¡¡Supera los 9000!!!" + ], + "command": "git pull origin master:foo", + "beforeCommand": "git clone; git fakeTeamwork; go -b bar; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "OK: para terminar, intenta alcanzar el estado del objetivo. Vas a necesitar descargar algunos commits, crear algunas ramas nuevas, y mergear esas ramas junto con otras, pero no debería llevar demasiados comandos :P" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/push.js b/src/levels/remote/push.js index 92a3f681..bdd0cc64 100644 --- a/src/levels/remote/push.js +++ b/src/levels/remote/push.js @@ -10,6 +10,7 @@ exports.level = { "zh_CN": "Git Push", "zh_TW": "git push", "es_AR": "git push", + "es_ES": "git push", "pt_BR": "Git Push", "gl" : "Git Push", "de_DE": "Git Push", @@ -24,6 +25,7 @@ exports.level = { "zh_CN": "推送之前需要先克隆", "zh_TW": "push 之前你需要先 clone", "es_AR": "¡Acordate que tenés que clonar antes de pushear!", + "es_ES": "¡Recuerda que tienes que clonar antes de hacer push!", "pt_BR": "Lembre-se de clonar antes de fazer o push!", "de_DE": "Denk dran, dass du einen Clone brauchst bevor du Pushen kannst!", "ja" : "Pushができるようになるには、まずリポジトリをcloneする必要があるのをお忘れなく", @@ -160,6 +162,47 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## git push", + "", + "Entendido, entonces ya descargué los cambios de un repositorio remoto y los integré en mi trabajo localmente. Esto suena muy bien... pero ¿cómo comparto _mis_ cambios con el resto?", + "", + "Bueno, la forma de subir el trabajo compartido es la opuesta a cómo descargar trabajo. Y ¿qué es lo opuesto a `git pull`? ¡`git push`!", + "", + "`git push` es el responsable de subir _tus_ cambios a un remoto específico y de actualizar ese remoto para incluir tus nuevos commits. Cuando `git push` termina, todos tus amigos pueden descargar tu trabajo del remoto.", + "", + "Puedes imaginarte `git push` como un comando para \"publicar\" tu trabajo. Tiene un par de sutilezas con las que vamos a meternos pronto, pero empecemos poco a poco." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Aquí tenemos algunos cambios que nuestro remoto no tiene. ¡Subámoslos!" + ], + "afterMarkdowns": [ + "Ahí está: el remoto recibió el commit `C2`, la rama `master` de ese remoto se actualizó para apuntar a `C2`, y nuestro *propio* reflejo del remoto (`o/master`) también fue actualizado. ¡Todo está en sincronía!" + ], + "command": "git push", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, simplemente comparte dos nuevos commits con el remoto. Igualmente, no te confíes, ¡las lecciones van a empezar a complicarse!" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/pushArgs.js b/src/levels/remote/pushArgs.js index f1810aec..8570a624 100644 --- a/src/levels/remote/pushArgs.js +++ b/src/levels/remote/pushArgs.js @@ -10,6 +10,7 @@ exports.level = { "zh_CN": "Git push 的参数", "zh_TW": "git push 的參數", "es_AR": "Parámetros de git push", + "es_ES": "Parámetros de git push", "pt_BR": "Parâmetros do git push", "gl" : "Parámetros de git push", "de_DE": "Optionen für Git Push", @@ -24,6 +25,7 @@ exports.level = { "zh_CN": "你可以利用“objective”来阅读对话窗口的最后一页", "zh_TW": "你可以利用 \"objective\" 來閱讀對話視窗的最後一頁", "es_AR": "Siempre podés ver el último mensaje tipeando \"objective\"", + "es_ES": "Siempre puedes ver el último mensaje escribiendo \"objective\"", "pt_BR": "Você sempre pode rever o último slide com o comando \"objective\"", "gl" : "Ti sempre podes desfacer último mensaxe escribindo \"objective\"", "de_DE": "Du kannst dir die Zielsetzung des Levels immer wieder mit \"objective\" anzeigen lassen", @@ -253,6 +255,78 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Parámetros de push", + "", + "¡Genial! Ahora que has aprendido sobre las ramas que trackean remotos podemos empezar a desvelar algo del misterio detrás de git push, fetch y pull. Vamos a atacar un comando cada vez, pero los conceptos entre ellos son muy similares.", + "", + "Veamos primero `git push`. Ya aprendiste en la lección sobre ramas remotas que git determinó el remoto *y* la rama a la que pushear mirando las propiedades de la rama actual (el remoto al que \"trackea\"). Este es el comportamiento por defecto para cuando no se especifican parámetros, pero git push toma, opcionalmente, parámetros de la forma:", + "", + "`git push `", + "", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¿Qué será este parámetro ``, te preguntarás? Vamos a entrar en detalle, pero primero un ejemplo. Ejecutar el comando:", + "", + "`git push origin master`", + "", + "se traduce así al español:", + "", + "*Vete a la rama llamada \"master\" en mi repositorio, coge todos los commits, y después vete a la rama \"master\" del remoto llamado \"origin\". Copia ahí todos los commits que falten, y avísame cuando termines.*", + "", + "Especificando `master` como el parámetro \"lugar\", le dijimos a git de dónde traer los commits, y a dónde mandarlos. Es, básicamente, el \"lugar\" o \"ubicación\" que sincronizar entre ambos repositorios.", + "", + "Ten en cuenta que, como le dijimos a git todo lo que necesitaba saber (especificando ambos parámetros), ¡ignora totalmente dónde estamos parados en este momento¡" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos un ejemplo especificando los parámetros. Date cuenta dónde estamos parados en este ejemplo." + ], + "afterMarkdowns": [ + "¡Ahí está! Se actualizó `master` en el remoto, porque especificamos esos parámetros." + ], + "command": "git checkout C0; git push origin master", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Y si no especificabamos los parámetros? ¿Qué hubiera pasado?" + ], + "afterMarkdowns": [ + "El comando falla (como puedes ver), porque `HEAD` no está sobre ninguna rama que apunte a algún remoto." + ], + "command": "git checkout C0; git push", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Perfecto. Para este nivel, actualicemos tanto `foo` como `master` en el remoto. El tema está en que ¡tenemos deshabilitado `git checkout` en este nivel!" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/pushArgs2.js b/src/levels/remote/pushArgs2.js index 80a104bb..bfe68313 100644 --- a/src/levels/remote/pushArgs2.js +++ b/src/levels/remote/pushArgs2.js @@ -7,6 +7,7 @@ exports.level = { "zh_CN": "Git push 参数 2", "zh_TW": "git push 的參數,延伸討論!", "es_AR": "¡Más! Parámetros de git push", + "es_ES": "¡Más! Parámetros de git push", "pt_BR": "Parâmetros do git push -- expandido", "gl" : "Parámetros de git push -- ampliado", "de_DE": "Optionen für Git Push -- noch mehr!", @@ -21,6 +22,7 @@ exports.level = { "zh_CN": "如果你认输的话,可以通过“show solution”查看解决方案 :P", "zh_TW": "如果你失敗了,可以利用 \"show solution\" 來找到解答:P", "es_AR": "Recordá que podés admitir tu derrota y tipear \"show solution\" para ver la solución :P", + "es_ES": "Recuerda que puedes admitir tu derrota y escribir \"show solution\" para ver la solución :P", "pt_BR": "Lembre-se que você pode admitir que foi derrotado e digitar \"show solution\" :P", "gl" : "Lembrate que podes admitir que fuches derrotado e escribir \"show solution\" para amosala solución :P", "de_DE": "Vergiss nicht dass du aufgeben kannst, indem du \"show solution\" eingibst :P", @@ -241,6 +243,76 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Detalles sobre el parámetro ``", + "", + "Recuerda de la lección anterior que cuando especificamos `master` como el parámetro lugar de git push, especificamos tanto el *origen* del que sacar los commits como el *destino* al que enviarlos.", + "", + "Podrías estar preguntándote ¿Y si quisiéramos que el origen y el destino fuesen distintos? ¿Si quisieras hacer push de los commits de la rama local `foo` a la rama `bar` del remote?", + "", + "Bueno, lamentablemente eso no se puede hacer en git... ¡zasca! Claro que se puede :)... git es extremadamente flexible (casi casi que demasiado).", + "", + "Veamos cómo hacerlo a continuación..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para especificar tanto el origen como el destino de ``, simplemente únelos usando el signo `dos puntos`:", + "", + "`git push origin :`", + "", + "A esto se le suele llamar refspec con dos puntos. Refspec es simplemente un nombre genial para una ubicación que git puede entender (como la rama `foo`, o incluso `HEAD~1`)", + "", + "Una vez que especificas tanto el origen como el destino independientemente, puedes ponerte bastante cómodo y preciso con los comandos remotos. ¡Veamos una demo!" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Recuerda: `origen` es cualquier ubicación que git pueda entender:" + ], + "afterMarkdowns": [ + "¡Vaya! Ese commando es bastante rompedor, pero tiene sentido: git resolvió `foo^` a una ubicación, subió cualquier commit de ahí que aún no estuviera en el remoto, y luego actualizó el destino." + ], + "command": "git push origin foo^:master", + "beforeCommand": "git clone; go -b foo; git commit; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Y qué ocurre si el destino al que quieres hacer push no existe? ¡Sin problema! Simplemente dale un nombre a la rama y git se va a encargar de creártelo en el remoto." + ], + "afterMarkdowns": [ + "Genial, simplemente fluye :D" + ], + "command": "git push origin master:newBranch", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para este nivel, trata de llegar al objetivo final, y recuerda el formato:", + "", + "`:`" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/pushManyFeatures.js b/src/levels/remote/pushManyFeatures.js index 3069169a..ed696d46 100644 --- a/src/levels/remote/pushManyFeatures.js +++ b/src/levels/remote/pushManyFeatures.js @@ -7,6 +7,7 @@ exports.level = { "zh_CN": "你随时都可以使用 undo 或 reset 命令。", "zh_TW": "你隨時都可以使用 undo 或 reset 指令。", "es_AR": "Acordate que siempre podés usar los comandos reset y undo", + "es_ES": "Recuerda que siempre puedes usar los comandos reset y undo", "pt_BR": "Lembre-se que você sempre pode usar undo ou reset", "gl" : "Lembra que sempre podes usar undo ou reset", "de_DE": "Denk dran, du kannst immer undo oder reset benutzen, um deine Befehle zurück zu nehmen.", @@ -21,6 +22,7 @@ exports.level = { "zh_CN": "推送主分支", "zh_TW": "push master!", "es_AR": "¡Push Master!", + "es_ES": "¡Push Master!", "pt_BR": "Push Master!", "gl" : "Empurra ó Master!", "de_DE": "Push Master!", @@ -191,6 +193,59 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Haciendo merge con ramas de trabajo", + "", + "Ahora que estás cómodo fetcheando, pulleando y pusheando, pongamos a prueba estas habilidades con un nuevo flujo de trabajo.", + "", + "Es bastante común que los desarrolladores en los grandes proyectos trabajen sobre ramas específicas para cada tarea (feature branches o ramas de trabajo) basadas en `master`, y que las integren sólo cuando estén listas. Esto es similar a la lección anterior, en la que hicimos push de las ramas periféricas al remoto, pero aquí tenemos un paso más.", + "", + "Algunos desarrolladores sólo pushean y pullean cuando están en `master`: de ese modo, `master` siempre se mantiene actualizado con el remoto (`o/master`).", + "", + "Entonces, en este flujo de trabajo combinamos dos cosas:", + "", + "* integramos el trabajo de las ramas específicas a `master`, y", + "* pusheamos y pulleamos del remoto" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Refresquemos un poco cómo actualizar `master` y pushear nuestro trabajo." + ], + "afterMarkdowns": [ + "Ahora ejecutamos dos comandos que:", + "", + "* rebasearon nuestro trabajo sobre los nuevos commits del remoto, y", + "* publicamos nuestro trabajo en ese remoto" + ], + "command": "git pull --rebase; git push", + "beforeCommand": "git clone; git commit; git fakeTeamwork" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Este nivel es bastante pesado. Aquí tienes algunas ideas para resolverlo:", + "", + "* Tenemos tres ramas específicas -- `side1` `side2` and `side3`", + "* Queremos hacer push de cada una de esas ramas, en orden, al remoto", + "* El remoto fue actualizado, así que vamos a tener que integrar esos cambios también", + "", + ":O ¡Genial! ¡Éxito! Completar este nivel representa un gran avance." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/remoteBranches.js b/src/levels/remote/remoteBranches.js index 82f630cf..813dd4dd 100644 --- a/src/levels/remote/remoteBranches.js +++ b/src/levels/remote/remoteBranches.js @@ -7,6 +7,7 @@ exports.level = { "zh_CN": "远程分支", "zh_TW": "remote branch (遠端分支)", "es_AR": "Ramas remotas", + "es_ES": "Ramas remotas", "pt_BR": "Ramos remotos", "gl" : "Ramas remotas", "de_DE": "Branches auf entfernten Servern", @@ -21,6 +22,7 @@ exports.level = { "zh_CN": "注意顺序 —— 先在 master 分支上提交!", "zh_TW": "注意順序的問題喔!先在 master branch 上面送 commit", "es_AR": "Prestá atención al orden: ¡commiteá sobre master primero!", + "es_ES": "Presta atención al orden: ¡haz commit sobre master primero!", "pt_BR": "Preste atenção na ordem: commite no master primeiro!", "gl" : "Preta atención á orde: fai commit no master primeiro", "de_DE": "Beachte die Sortierung -- committe zuerst auf dem master!", @@ -214,6 +216,67 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Ramas remotas de git", + "", + "Ahora que viste `git clone` en acción, ahondemos en lo que realmente cambió.", + "", + "Lo primero que habrás notado es que apareció una nueva rama en tu repositorio local llamada `o/master`. A este tipo de ramas se las llama ramas _remotas_. Las ramas remotas tienen propiedades especiales porque sirven un propósito específico.", + "", + "Las ramas remotas reflejan el _estado_ de los repositorios remotos (cómo estaban la última vez que hablaste con ellos). Te ayudan a entender las diferencias entre tu trabajo local y el trabajo que ya está publicado - un paso crítico antes de compartir tu trabajo con los demás.", + "", + "Las ramas remotas tienen la propiedad especial de que cuando haces checkout sobre ellas, pasas al modo detached `HEAD`. Git lo hace a propósito porque no puedes trabajar en esas ramas directamente: tienes que trabajar en algún otro lado y después compartir tu trabajo con el remoto (tras lo que tus ramas remotas se actualizarán)." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### ¿Qué es `o/`?", + "", + "Podrías estar preguntándote qué significa ese `o/` al principio de las ramas remotas. Bueno, las ramas remotas también tienen una convención de nombres obligatoria -- se muestran con el formato:", + "", + "* `/`", + "", + "Entonces, si observas una rama llamada `o/master`, el nombre de la rama es `master`, y el nombre del remoto es `o`.", + "", + "La mayoría de los desarrolladores llaman `origin` a su remoto en lugar de `o`. Esto es tan común que git efectivamente crea tu remoto llamándolo `origin` cuando haces `git clone` de un repositorio.", + "", + "Desafortunadamente el nombre `origin` completo no entra en nuestra UI (interfaz de usuario), así que usamos `o` para abreviar :(Simplemente recuerda que cuando uses el git real, tu remoto ¡probablemente se llame `origin`!", + "", + "Queda mucho por aprender, así que veámoslo en acción." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Hagamos checkout sobre una rama remota a ver qué pasa" + ], + "afterMarkdowns": [ + "Como ves, git nos puso en el modo detached `HEAD` y no actualizó `o/master` cuando creamos un nuevo commit. Esto ocurre porque `o/master` sólo va a actualizarse cuando el remoto se actualice." + ], + "command": "git checkout o/master; git commit", + "beforeCommand": "git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, haz commit una vez sobre `master` y otra vez después de checkoutear `o/master`. Esto te va a ayudar a aprender cómo las ramas remotas funcionan distinto, y que sólo se actualizan para reflejar el estado del remoto." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/sourceNothing.js b/src/levels/remote/sourceNothing.js index 7b7e58c0..13688b3d 100644 --- a/src/levels/remote/sourceNothing.js +++ b/src/levels/remote/sourceNothing.js @@ -11,6 +11,7 @@ exports.level = { "zh_CN": "没有 source 的 source", "zh_TW": "沒有 source", "es_AR": "Origen de nada", + "es_ES": "Origen de nada", "pt_BR": "Origem vazia", "gl" : "Orixen de nada", "de_DE": "Die Quelle des Nichts", @@ -25,6 +26,7 @@ exports.level = { "zh_CN": "本关的 branch 命令被禁用了,你只能用 fetch!", "zh_TW": "在本關卡中,不允許使用 branch 指令,因此你只能使用 fetch!", "es_AR": "El comando branch está deshabilitado para este nivel, así que ¡vas a tener que usar fetch!", + "es_ES": "El comando branch está deshabilitado para este nivel, así que ¡vas a tener que usar fetch!", "pt_BR": "O comando branch está desabilitado para este nível, então você terá de usar o fetch!", "gl" : "O comando branch está deshabilitado para este nivel, entón terás que empregar o comando fetch!", "de_DE": "Der branch Befehl ist für diesen Level inaktiv, du musst also fetch benutzen", @@ -194,6 +196,59 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Rarezas de ``", + "", + "Git abusa del parámetro `` de dos extrañas maneras. Estos dos abusos vienen del hecho de que técnicamente puedes especificar \"la nada\" como un `origen` válido tanto para git push como para git fetch. El modo de especificar la nada es a través de un parámetro vacío:", + "", + "* `git push origin :side`", + "* `git fetch origin :bugFix`", + "", + "Veamos qué hacen estos..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Qué hace el hacer push de \"nada\" a una rama remota? ¡La elimina!" + ], + "afterMarkdowns": [ + "Ahí está, eliminamos la rama `foo` exitosamente del remoto haciendo push con \"nada\". Tiene algo de sentido..." + ], + "command": "git push origin :foo", + "beforeCommand": "git clone; git push origin master:foo" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Finalmente, hacer fetch de \"nada\" a un lugar local en realidad crea una nueva rama" + ], + "afterMarkdowns": [ + "Bastante extraño, pero bueno, da igual. Así es git." + ], + "command": "git fetch origin :bar", + "beforeCommand": "git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Este es un nivel breve: simplemente elimina una rama remota y crea una nueva usando `git fetch` para completarlo." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/tracking.js b/src/levels/remote/tracking.js index 27393e13..6fc6f59f 100644 --- a/src/levels/remote/tracking.js +++ b/src/levels/remote/tracking.js @@ -7,6 +7,7 @@ exports.level = { "zh_CN": "远程追踪", "zh_TW": "remote tracking", "es_AR": "Trackeando remotos", + "es_ES": "Trackeando remotos", "pt_BR": "Seguindo remotos", "gl" : "Traceando os remotos", "de_DE": "Remote Tracking", @@ -21,6 +22,7 @@ exports.level = { "zh_CN": "记住,有两种设置 remote tracking 的方法!", "zh_TW": "記住喔,有兩個方式可以去設定 remote tracking", "es_AR": "¡Acordate de que hay dos formas de trackear un remoto!", + "es_ES": "¡Recuerda que hay dos formas de trackear un remoto!", "pt_BR": "Lembre-se que há duas formas de seguir um ramo remoto!", "gl" : "¡Lembrate de que hai dúas formas de seguir unha rama remota!", "de_DE": "Nicht vergessen, es gibt zwei Arten Remote Tracking einzurichten!", @@ -387,6 +389,126 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Ramas que trackean remotos", + "", + "Una de las cosas que te pueden haber parecido \"mágicas\" de las últimas lecciones es que git sabía que la rama `master` estaba relacionada con `o/master`. Obviamente, estas ramas tienen nombres parecidos, y podría parecer lógico conectar la rama `master` del remoto con la rama `master` local, pero esta conexión es bien evidente en dos escenarios:", + "", + "* Durante una operación de pull, los commits se descargan a `o/master` y después se *mergean* a la rama `master`. El objetivo implícito del merge se determina con esta conexión.", + "* Durante un push, el trabajo de la rama `master` se sube a la rama `master` del remoto (que estaba representada localmente por `o/master`). El *destino* del push se determina con esta conexión entre `master` y `o/master`.", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Trackeando remotos", + "", + "Resumiendo, esta conexión entre `master` y `o/master` se explica simplemente por la propiedad de \"trackear (seguir) remotos\" de las ramas. La rama `master` está configurada para trackear `o/master` -- osea, que hay un objetivo implícito para el merge y un destino implícito para de la rama `master`.", + "", + "Podrías estar pensando cómo esa propiedad apareció en tu rama `master` si no ejecutaste ningún comando para especificarlo. Bueno, cuando clonas un repositorio con git, esta propiedad es asignada por ti automáticamente.", + "", + "Durante un clone, git crea una rama remota por cada rama en el remoto (por ejemplo, ramas como `o/master`). Pero después crea una rama local que trackea la rama activa del remote, que suele ser `master`.", + "", + "Una vez completado el git clone, sólo tienes una única rama local (para que no te asustes) pero puedes ver todas las ramas del remoto (si fueses curioso). ¡Es lo mejor de ambos mundos!", + "", + "Esto también explica por qué podrías ver un mensaje como este durante la clonación:", + "", + " local branch \"master\" set to track remote branch \"o/master\"", + "", + " rama local \"master\" establecida para trackear la rama remota \"o/master\"" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### ¿Puedo especificarlo yo?", + "", + "¡Claro que sí! Puedes hacer que cualquier rama que quieras trackee `o/master`, y si lo hicieras, esa rama va a tener el mismo destino implícito de push y objetivo implícito de merge que `master`. Eso significa que puedes ejecutar `git push` en una rama llamada `absolutamenteNoEsMaster` y ¡que tu trabajo se pushee a la rama `master` del remoto!", + "", + "Hay dos formas de establecer esta propiedad. La primera es hacer checkout sobre una nueva rama usando una rama remota como la referencia especificada. Ejecutar", + "", + "`git checkout -b absolutamenteNoEsMaster o/master`", + "", + "Crea una nueva rama llamada `absolutamenteNoEsMaster` y la hace trackear a `o/master`." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Basta de charla, ¡veamos un ejemplo! Vamos a hacer checkout de una nueva rama llamada `foo` y hacer que trackee a `master` en el remoto." + ], + "afterMarkdowns": [ + "Como puedes ver, usamos el objetivo implícito de merge `o/master` para actualizar la rama `foo`. ¡Observa cómo `master` no fue actualizada!" + ], + "command": "git checkout -b foo o/master; git pull", + "beforeCommand": "git clone; git fakeTeamwork" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Lo mismo aplica para git push" + ], + "afterMarkdowns": [ + "Zas. Hacemos push de nuestro trabajo a la rama `master` del remoto incluso cuando nuestra rama se llamaba totalmente distinto" + ], + "command": "git checkout -b foo o/master; git commit; git push", + "beforeCommand": "git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Forma número 2", + "", + "Otra forma de especificar la rama a trackear es usar la opción `git branch -u`. Ejecutando", + "", + "`git branch -u o/master foo`", + "", + "establecemos que la rama `foo` trackee a `o/master`. Si encima estás parado en `foo`, incluso puedes obviarlo:", + "", + "`git branch -u o/master`", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos rápidamente esta otra forma de especificar la rama a trackear..." + ], + "afterMarkdowns": [ + "Lo mismo que antes, sólo que con un comando bastante más explícito. ¡Muy útil!" + ], + "command": "git branch -u o/master foo; git commit; git push", + "beforeCommand": "git clone; git checkout -b foo" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¡Perfecto! Para este nivel, haz push de tu trabajo a la rama `master` del remoto *sin* estar parado sobre `master` localmente. Te dejo que te des cuenta del resto solo, que para algo este es el curso avanzado :P" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { From 8aab2437019e80b79e39b373ee20375923ee5bc8 Mon Sep 17 00:00:00 2001 From: flyingbot91 Date: Wed, 18 Dec 2019 23:01:38 +0100 Subject: [PATCH 146/359] Added es_ES translation to levelBuilder.js --- src/js/dialogs/levelBuilder.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/js/dialogs/levelBuilder.js b/src/js/dialogs/levelBuilder.js index 411a88ae..84bfc59c 100644 --- a/src/js/dialogs/levelBuilder.js +++ b/src/js/dialogs/levelBuilder.js @@ -94,6 +94,25 @@ exports.dialog = { ] } }], + 'es_ES': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## ¡Bienvenido al constructor de niveles!', + '', + 'Estos son los pasos principales:', + '', + ' * Prepara el entorno inicial usando comandos de Git', + ' * Define el árbol inicial con ```define start```', + ' * Introduce la serie de comandos de git que representan la solución óptima', + ' * Crea el árbol objetivo con ```define goal```. El objetivo también determina la solución', + ' * Opcionalmente, crea pistas con ```define hint```', + ' * Dale un nombre con ```define name```', + ' * Opcionalmente, crea un mensaje inicial con ```edit dialog```', + ' * ¡Introduce el comando ```finish``` para obtener tu nivel en formato JSON!' + ] + } + }], 'pt_BR': [{ type: 'ModalAlert', options: { From a14da63e36b60111a042d1765b6528d0aec94bd4 Mon Sep 17 00:00:00 2001 From: flyingbot91 Date: Wed, 18 Dec 2019 23:03:08 +0100 Subject: [PATCH 147/359] es_ES translation typos --- src/js/intl/strings.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js index 2b27a9ca..e7b982d8 100755 --- a/src/js/intl/strings.js +++ b/src/js/intl/strings.js @@ -25,7 +25,7 @@ exports.strings = { 'zh_CN': '要不要试试下一关 *“{nextLevel}”*?', 'zh_TW': '下一關是*「{nextLevel}」*,您要繼續闖關嗎?', 'es_AR': '¿Querés seguir con *"{nextLevel}"*, el próximo nivel?', - 'es_ES': '¿Quieres seguir al nivel *"{nextLevel}"*, el próximo nivel?', + 'es_ES': '¿Quieres pasar al nivel *"{nextLevel}"*, el próximo nivel?', 'pt_BR': 'Você gostaria de ir para o próximo nível: *"{nextLevel}"*?', 'gl' : '¿Gustaríache ir o seguinte nivel: *"{nextLevel}"*?', 'fr_FR': 'Voulez-vous passer à *"{nextLevel}"*, le prochain niveau ?', @@ -74,7 +74,7 @@ exports.strings = { 'zh_CN': '注意! Mercurial 会进行主动垃圾回收,需要将你的提交树縮小。', 'zh_TW': '注意! Mercurial 會積極地做垃圾收集,而且會因此把你的 tree 給縮小。', 'es_AR': '¡Cuidado! Mercurial hace garbage collection agresivamente y necesita eliminar tu árbol', - 'es_ES': '¡Cuidado! Mercurial hace la colección de basura agresivamente (para administrar memoria) y necesita podar tu árbol.', + 'es_ES': '¡Cuidado! Mercurial hace la recolección de basura agresivamente (para administrar memoria) y necesita podar tu árbol.', 'pt_BR': 'Cuidado! O Mercurial faz coleção de lixo agressiva e precisa prunar sua árvore', 'gl' : '¡Coidado! Mercurial fai que recolección de lixo agresivamente (para limpar memoria) e precisa podar a túa árbore.', 'fr_FR': 'Attention, Mercurial supprime de façon agressive et nécessite un prune du repository', @@ -106,7 +106,7 @@ exports.strings = { 'zh_CN': '本 App 没有 status 命令哦,因为根本没有 stage 缓存文件。可以用 hg summary 代替哦', 'zh_TW': '本 App 没有 status 命令哦,因为根本没有 stage 缓存文件。可以用 hg summary 代替哦', 'es_AR': 'No hay un comando status para esta aplicación, dado que no hay archivos que indexar. Probá hg summary, en cambio', - 'es_ES': 'No hay un comando status para esta aplicación, porque que no hay archivos que indexar. Prueba el comando hg summary, en cambio', + 'es_ES': 'No hay un comando status para esta aplicación, porque no hay archivos que indexar. Prueba el comando hg summary', 'pt_BR': 'Não existe um comando status para este aplicativo, já que não há staging de arquivos. Tente hg summary', 'gl' : 'Non hai un comando status para esta aplicación, xa que non hai ficheiros que indexar. Proba hg summary', 'fr_FR': 'Il n\'y a pas de commande status pour cette application, car il n\'y a pas de fichier stagé. Essayez hg summary à la place.', @@ -234,7 +234,7 @@ exports.strings = { 'zh_TW': '你的 origin 分支已經失去了與 remote 遠端分支的同步,所以無法執行 fetch 命令', 'de_DE': 'Dein origin Branch ist nicht auf dem Stand des Remote Branch und fetch kann nicht ausgeführt werden', 'es_AR': 'Tu rama origin está desincronizada con la rama remota, por lo que no se puede hacer el fetch', - 'es_ES': 'Tu rama origin no está sicronizada con la rama remota, así que un fetch no se puede realizar.', + 'es_ES': 'Tu rama origin no está sicronizada con la rama remota, así que el fetch no se puede realizar.', 'pt_BR': 'O fetch não pode ser realizado pois o ramo de origem está fora de sincronia com o ramo remoto', 'gl' : 'O fetch non pode ser realizado xa que a rama de orixe non está sincronizada ca rama remota', 'fr_FR': 'Votre branche origin n\'est plus synchronisée avec la branche distante et fetch ne peut pas être appliqué. Essayez avec l\'option --force', @@ -249,7 +249,7 @@ exports.strings = { 'zh_TW': '遠端倉庫與你的本地倉庫產生了分歧,故此上傳操作無法通過簡單地快進實現(因此你的 push 被拒絕了)。請 pull 下來遠端裡最新的更改,與本地合併之後再試一次。你可以通過 git pull 或 git pull --rebase 實現。', 'de_DE': 'Das entfernte Repository weicht von deinem lokalen Repository ab, daher können deine Änderungen nicht mit einem einfachen fast forward hochgeladen werden (und daher ist dein push abgelehnt worden). Bitte pull erst die neuen Änderungen in das lokale Repository, integriere sie in den Branch und versuch es nochmal. Das kannst du mit git pull oder git pull --rebase machen', 'es_AR': 'El repositorio remoto divergió de tu repositorio local, por lo que subir tus cambios no es un simple fast forward (y por eso se rechazó tu push). Por favor, hacé pull de los nuevos cambios en el repositorio remoto, incorporalos a esta rama y probá de nuevo. Podés hacerlo con git pull o git pull --rebase', - 'es_ES': 'El depósito remoto se ha desviado del depósito local. Subir cambios no es un avance rápido sencillo (por eso fue rechazado tu push). Por favor haz pull para descaragar los cambios en el depósito remoto para que los incorpores en la rama actual. Los cambios se pueden hacer pull con el comando "git pull" o "git pull --rebase"', + 'es_ES': 'El repositorio remoto se ha desviado del repositorio local. Subir cambios no es un avance en cámara rápida (por eso fue rechazado tu push). Por favor haz pull para descargar los cambios en el repositorio remoto para que los incorpores en la rama actual. Los cambios se pueden hacer pull con el comando "git pull" o "git pull --rebase"', 'pt_BR': 'O repositório remoto divergiu do repositório local, então enviar suas mudanças não é um simples fast forward (e por isso seu push foi rejeitado). Por favor, faça pull das novas mudanças do repositório remoto, incorpore-os a este ramo, e tente novamente. Você pode fazê-lo com git pull ou git pull --rebase', 'gl' : 'O repositorio remoto diverxe do teu repositorio local. Subir os cambios non é un fast-forward (avance rápido) e por iso foi rechazado o teu push. Por favor, fai un pull dos novos cambios do repositorio remoto e inclúeos na túa rama actual. Os cambios pódense facer co comando "git pull" ou "git pull --rebase"', 'fr_FR': 'Le dépôt distant a divergé de votre référentiel local, donc l\'envoi de vos modifications n\'est pas en simple avance rapide (et donc votre envoi a été rejeté). Veuillez récupérer les nouveaux changements depuis le dépôt distant, les intégrer dans cette branche, et essayez à nouveau. Vous pouvez le faire avec git pull ou git pull --rebase', @@ -696,7 +696,7 @@ exports.strings = { 'zh_CN': '抱歉,为了显示的需要,我们需要一个短些的分支名称。您使用的名称将被截断到9个字符,即 "{branch}"', 'zh_TW': '抱歉,為了顯示的需要,我們需要一個短一點的 branch 名稱。您使用的將會被截斷到剩下9個字元,即"{branch}"', 'es_AR': 'Perdón, necesitamos mantener los nombres de los branches cortos para visualizarlos. El nombre de tu rama se truncó a 9 caracteres, resultando en "{branch}"', - 'es_ES': 'Perdón, necesitamos mantener los nombres de los branches cortos para visualizarlos. El nombre de tu rama se truncó a 9 caracteres, resultando en "{branch}"', + 'es_ES': 'Perdón, necesitamos mantener los nombres de las ramas cortos para visualizarlos. El nombre de tu rama se truncó a 9 caracteres, resultando en "{branch}"', 'pt_BR': 'Desculpe, precisamos manter os nomes dos ramos curtos para visualizá-los. O nome do seu ramo foi truncado para 9 caracteres, resultando em "{branch}"', 'gl' : 'Desculpe, precisamos manter os nomes das ramas curtas para poder velas. O nome da súa rama foi truncada a 9 letras, resultado en "{branch}"', 'fr_FR': 'Désolé, nous devons garder les noms de branches courts pour la visualisation. Votre nom de branche a été tronqué à 9 caractères, devenant "{branch}"', From 892830add462c333d435de52264b6845e31d970e Mon Sep 17 00:00:00 2001 From: flyingbot91 Date: Wed, 18 Dec 2019 23:09:43 +0100 Subject: [PATCH 148/359] Translated src/js/dialogs to Spanish 'es_ES' --- src/js/dialogs/confirmShowSolution.js | 10 +++++ src/js/dialogs/nextLevel.js | 11 ++++++ src/js/dialogs/sandbox.js | 56 +++++++++++++++++++++++++++ 3 files changed, 77 insertions(+) diff --git a/src/js/dialogs/confirmShowSolution.js b/src/js/dialogs/confirmShowSolution.js index 966b993e..08a0df83 100644 --- a/src/js/dialogs/confirmShowSolution.js +++ b/src/js/dialogs/confirmShowSolution.js @@ -49,6 +49,16 @@ exports.dialog = { ] } }], + 'es_ES': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## ¿Estás seguro de que quieres ver la solución?', + '', + '¡Creo en ti! ¡Ánimo!' + ] + } + }], 'pt_BR': [{ type: 'ModalAlert', options: { diff --git a/src/js/dialogs/nextLevel.js b/src/js/dialogs/nextLevel.js index 69d0c9ad..8cbbdd04 100644 --- a/src/js/dialogs/nextLevel.js +++ b/src/js/dialogs/nextLevel.js @@ -67,6 +67,17 @@ exports.dialog = { ] } }], + 'es_ES': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## ¡Buen trabajo!', + '', + 'Resolviste el nivel en *{numCommands}* comandos; ', + 'nuestra mejor solución usa {best}.' + ] + } + }], 'pt_BR': [{ type: 'ModalAlert', options: { diff --git a/src/js/dialogs/sandbox.js b/src/js/dialogs/sandbox.js index 84c69806..f6ddea3b 100644 --- a/src/js/dialogs/sandbox.js +++ b/src/js/dialogs/sandbox.js @@ -78,6 +78,62 @@ exports.dialog = { ] } }], + 'es_ES': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## ¡Bienvenid@ a Learn Git Branching!', + '', + 'Esta aplicación está diseñada para ayudar a los principantes ', + 'a manejar los poderosos conceptos que hay detrás del trabajo ', + 'con ramas (branches) en Git. Esperamos que disfrutes la aplicación ', + 'y tal vez incluso ¡que aprendas algo! ', + '', + '# ¡Demo!', + '', + 'Si no viste la demo, mírala en esta dirección:', + '', + '[https://pcottle.github.io/learnGitBranching/?demo](https://pcottle.github.io/learnGitBranching/?demo)', + '', + '¿Harto de este mensaje? Agrégale `?NODEMO` a la URL para dejar de verlo, como en este link:', + '', + '[https://pcottle.github.io/learnGitBranching/?NODEMO](?NODEMO)' + ] + } + }, { + type: 'ModalAlert', + options: { + markdowns: [ + '## Comandos de Git', + '', + 'Tienes una gran variedad de comandos de git en este sandbox. Estos incluyen: ', + '', + ' * commit', + ' * branch', + ' * checkout', + ' * cherry-pick', + ' * reset', + ' * revert', + ' * rebase', + ' * merge' + ] + } + }, { + type: 'ModalAlert', + options: { + markdowns: [ + '## ¡Compartí!', + '', + 'Comparte tus árboles con tus amigos usando `export tree` e `import tree`', + '', + '¿Tienes una buena lección que compartir? Prueba construyendo un nivel con `build level` o prueba el nivel de un amigo con `import level`', + '', + 'Para ver todos los comandos disponibles, escribe `show commands`. Hay algunas joyitas como `undo` y `reset`', + '', + 'Por ahora, arranquemos con los `levels`...' + ] + } + }], 'pt_BR': [{ type: 'ModalAlert', options: { From b2fbf6b0092357f0050d04d160bf8d03196364fa Mon Sep 17 00:00:00 2001 From: flyingbot91 Date: Wed, 18 Dec 2019 23:26:14 +0100 Subject: [PATCH 149/359] 'es_ES' translation typos --- src/js/dialogs/sandbox.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/dialogs/sandbox.js b/src/js/dialogs/sandbox.js index f6ddea3b..4f048ca0 100644 --- a/src/js/dialogs/sandbox.js +++ b/src/js/dialogs/sandbox.js @@ -122,7 +122,7 @@ exports.dialog = { type: 'ModalAlert', options: { markdowns: [ - '## ¡Compartí!', + '## ¡Comparte!', '', 'Comparte tus árboles con tus amigos usando `export tree` e `import tree`', '', @@ -130,7 +130,7 @@ exports.dialog = { '', 'Para ver todos los comandos disponibles, escribe `show commands`. Hay algunas joyitas como `undo` y `reset`', '', - 'Por ahora, arranquemos con los `levels`...' + 'Por ahora, empecemos con los `levels`...' ] } }], From d5fd75239ff9041bdc927796a9c9808913fc9da8 Mon Sep 17 00:00:00 2001 From: flyingbot91 Date: Wed, 18 Dec 2019 23:52:06 +0100 Subject: [PATCH 150/359] Various 'es_AR' translation typos --- src/levels/intro/merging.js | 2 +- src/levels/intro/rebasing.js | 2 +- src/levels/rampup/interactiveRebase.js | 2 +- src/levels/remote/clone.js | 4 ++-- src/levels/remote/fakeTeamwork.js | 2 +- src/levels/remote/fetch.js | 2 +- src/levels/remote/fetchArgs.js | 2 +- src/levels/remote/pushArgs.js | 2 +- src/levels/remote/pushArgs2.js | 8 ++++---- src/levels/remote/remoteBranches.js | 2 +- src/levels/remote/sourceNothing.js | 2 +- src/levels/remote/tracking.js | 2 +- 12 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/levels/intro/merging.js b/src/levels/intro/merging.js index 894501ff..c84c6c67 100644 --- a/src/levels/intro/merging.js +++ b/src/levels/intro/merging.js @@ -250,7 +250,7 @@ exports.level = { "", "¡Genial! Ya sabemos cómo commitear y cómo crear ramas. Ahora tenemos que aprender algún modo de unificar el trabajo de dos ramas diferentes. Esto nos va a permitir abrir una nueva rama de desarrollo, implementar alguna nueva funcionalidad, y después unirla de nuevo con el trabajo principal.", "", - "El primer método para combinarlas que vamos a explorar es `git merge`. Mergear en Git crea un commit especial que tiene dos padres diferentes. Un commit con dos padres escencialmente significa \"Quiero incluir todo el trabajo de este padre de acá y este otro padre de acá, *y* del conjunto de todos sus ancestros\"", + "El primer método para combinarlas que vamos a explorar es `git merge`. Mergear en Git crea un commit especial que tiene dos padres diferentes. Un commit con dos padres esencialmente significa \"Quiero incluir todo el trabajo de este padre de acá y este otro padre de acá, *y* del conjunto de todos sus ancestros\"", "", "Es más simple visualizarlo, veámoslo a continuación" ] diff --git a/src/levels/intro/rebasing.js b/src/levels/intro/rebasing.js index 29a46107..609043fe 100644 --- a/src/levels/intro/rebasing.js +++ b/src/levels/intro/rebasing.js @@ -242,7 +242,7 @@ exports.level = { "markdowns": [ "## Git Rebase", "", - "El segundo modo de combinar el trabajo de distintas ramas es el *rebase*. Rebasear escencialmente agarra un conjunto de commits, los \"copia\", y los aplica sobre algún otro lado.", + "El segundo modo de combinar el trabajo de distintas ramas es el *rebase*. Rebasear esencialmente agarra un conjunto de commits, los \"copia\", y los aplica sobre algún otro lado.", "", "Aunque esto pueda sonar confuso, la ventaja de rebasear es que puede usarse para conseguir una secuencia de commits lineal, más bonita. El historial / log de commits del repositorio va a estar mucho más claro si sólo usás rebase.", "", diff --git a/src/levels/rampup/interactiveRebase.js b/src/levels/rampup/interactiveRebase.js index 39ceeeb8..ff66a280 100644 --- a/src/levels/rampup/interactiveRebase.js +++ b/src/levels/rampup/interactiveRebase.js @@ -319,7 +319,7 @@ exports.level = { "", "Si incluís esta opción, git abrirá una UI para mostrarte qué commits están a punto de ser copiados sobre el objetivo del rebase. También muestra sus hashes y mensajes, que ayuda mucho para saber qué es cada commit.", "", - "Para el git \"de verdad\", la UI signfica abrir un archivo en un editor de textos como `vim`. Para nuestro propósito, hice una pequeña interfaz que se comporta de ese mismo modo." + "Para el git \"de verdad\", la UI significa abrir un archivo en un editor de textos como `vim`. Para nuestro propósito, hice una pequeña interfaz que se comporta de ese mismo modo." ] } }, diff --git a/src/levels/remote/clone.js b/src/levels/remote/clone.js index 5ef9ff65..90ed2382 100644 --- a/src/levels/remote/clone.js +++ b/src/levels/remote/clone.js @@ -160,7 +160,7 @@ exports.level = { "", "- Más importante, ¡los remotos sociabilizan la programación! Ahora que hay una copia de tu proyecto hosteada en otro lugar, tus amigos pueden contribuir a tu proyecto (o bajarse los últimos cambios) de un modo muy sencillo.", "", - "Se volvió bastante popular el uso de sitios web que muestran la actividad de los repositorios (como [Github](https://github.com/) or [Phabricator](http://phabricator.org/)), pero esos repositorios remotos _siempre_ sirven como el la base subyacente de esas herramientas. Así que ¡es importante entenderlos!" + "Se volvió bastante popular el uso de sitios web que muestran la actividad de los repositorios (como [Github](https://github.com/) or [Phabricator](http://phabricator.org/)), pero esos repositorios remotos _siempre_ sirven como la base subyacente de esas herramientas. Así que ¡es importante entenderlos!" ] } }, @@ -170,7 +170,7 @@ exports.level = { "markdowns": [ "## Nuestro comando para crear remotos", "", - "Hasta este punto, Learn Git Branching se centró en eseñar las bases del trabajo _local_ con repositorios (branchear, mergear, rebasear, etc). Sin embargo, ahora que queremos aprender sobre el trabajo con repositorios remotos, necesitamos un comando para inicializar nuestro entorno para esas lecciones. Ese comando será `git clone`", + "Hasta este punto, Learn Git Branching se centró en enseñar las bases del trabajo _local_ con repositorios (branchear, mergear, rebasear, etc). Sin embargo, ahora que queremos aprender sobre el trabajo con repositorios remotos, necesitamos un comando para inicializar nuestro entorno para esas lecciones. Ese comando será `git clone`", "", "Técnicamente, `git clone` en el mundo real es el comando que usarías para crear copias _locales_ de un repositorio remoto (uno de GitHub, por ejemplo). Acá usamos este comando de un modo un tanto distinto, en cambio -- `git clone` va a crear un repositorio remoto a partir del tuyo local. Estamos de acuerdo en que es el significado técnicamente opuesto al del comando real, pero ayuda bastante a entender la conexión entre el clonado y el trabajo en un repositorio remoto, así que vamos a vivir con ello por ahora.", "" diff --git a/src/levels/remote/fakeTeamwork.js b/src/levels/remote/fakeTeamwork.js index ca08387f..ce278497 100644 --- a/src/levels/remote/fakeTeamwork.js +++ b/src/levels/remote/fakeTeamwork.js @@ -149,7 +149,7 @@ exports.level = { "", "Entonces, hay algo medio tramposo acá -- para algunas de las lecciones siguientes, necesitamos explicarte cómo bajar cambios introducidos en el repositorio remoto.", "", - "Eso significa que escencialmente tenemos que \"hacer de cuenta\" que el repositorio remoto fue actualizado por alguún colega, amigo o colaborador tuyo, incluso a veces en alguna rama específica o una cantidad determinada de commits.", + "Eso significa que esencialmente tenemos que \"hacer de cuenta\" que el repositorio remoto fue actualizado por algún colega, amigo o colaborador tuyo, incluso a veces en alguna rama específica o una cantidad determinada de commits.", "", "Para lograr esto, introdujimos el bien llamado comando ¡`git fakeTeamwork`! Es bastante auto-explicativo: simula trabajo de nuestros colegas. Veamos una demo..." ] diff --git a/src/levels/remote/fetch.js b/src/levels/remote/fetch.js index 29c94e80..c50a3c2a 100644 --- a/src/levels/remote/fetch.js +++ b/src/levels/remote/fetch.js @@ -217,7 +217,7 @@ exports.level = { "* baja los commits que el remoto tiene pero no están en nuestro repositorio local, y...", "* actualiza a dónde apuntan nuestras ramas remotas (por ejemplo, `o/master`)", "", - "`git fetch` escencialmente sincroniza nuestra representación _local_ del repositorio remoto con el _verdadero_ estado del repositorio remoto (en este momento).", + "`git fetch` esencialmente sincroniza nuestra representación _local_ del repositorio remoto con el _verdadero_ estado del repositorio remoto (en este momento).", "", "Si recordás la lección anterior, dijimos que las ramas remotas reflejan el estado de los repositorios remotos _desde_ la última vez que hablaste con ellos. ¡`git fetch` es la manera en que hablás con esos remotos! Espero que ahora esté clara la conexión entre las ramas remotas y `git fetch`.", "", diff --git a/src/levels/remote/fetchArgs.js b/src/levels/remote/fetchArgs.js index ee0bccd9..64538117 100644 --- a/src/levels/remote/fetchArgs.js +++ b/src/levels/remote/fetchArgs.js @@ -343,7 +343,7 @@ exports.level = { "", "Este es el único problemita, igual: `` es ahora un lugar en el *remoto*, y `` es un lugar *local* en donde poner esos commits. Es exactamente lo opuesto a git push, y eso tiene sentido dado que ¡estamos transfiriendo los datos en la dirección opuesta!", "", - "Habiendo dicho esto, dificilmente alguien use esto en la práctica. Lo estoy presentando principalmente como un modo de conceptualizar que `fetch` y `push` son bastante similares, sólo que en direcciones opuestas." + "Habiendo dicho esto, difícilmente alguien use esto en la práctica. Lo estoy presentando principalmente como un modo de conceptualizar que `fetch` y `push` son bastante similares, sólo que en direcciones opuestas." ] } }, diff --git a/src/levels/remote/pushArgs.js b/src/levels/remote/pushArgs.js index f1810aec..681b991a 100644 --- a/src/levels/remote/pushArgs.js +++ b/src/levels/remote/pushArgs.js @@ -189,7 +189,7 @@ exports.level = { "markdowns": [ "## Parámetros de push", "", - "¡Genial! Ahora que sabés acerca de las ramas que trackean remotos podemos empezar a develar algo del misterio detrás de git push, fetch y pull. Vamos a atacar de a un comando a la vez, pero los conceptos entre ellos son muy similares.", + "¡Genial! Ahora que sabés acerca de las ramas que trackean remotos podemos empezar a desvelar algo del misterio detrás de git push, fetch y pull. Vamos a atacar de a un comando a la vez, pero los conceptos entre ellos son muy similares.", "", "Veamos primero `git push`. Ya aprendiste en la lección sobre ramas remotas que git determinó el remoto *y* la rama a la que pushear mirando las propiedades de la rama actual (el remoto al que \"trackea\"). Este es el comportamiento default para cuando no se especifican parámetros, pero git push toma, opcionalmente, parámetros de la forma:", "", diff --git a/src/levels/remote/pushArgs2.js b/src/levels/remote/pushArgs2.js index 80a104bb..1aa603e0 100644 --- a/src/levels/remote/pushArgs2.js +++ b/src/levels/remote/pushArgs2.js @@ -181,9 +181,9 @@ exports.level = { "", "Acordate de la lección anterior que cuando especificamos `master` como el parámetro lugar de git push, especificamos tanto el *origen* del que sacar los commits como el *destino* al que enviarlos.", "", - "Podrías estár preguntándote ¿Y si quisieramos que el origen y el destino sean distintos? ¿Si quisieras pushear los commits de la rama local `foo` a la rama `bar` del remote?", + "Podrías estar preguntándote ¿Y si quisiéramos que el origen y el destino sean distintos? ¿Si quisieras pushear los commits de la rama local `foo` a la rama `bar` del remote?", "", - "Bueno, lamentablemente eso no se puede hacer en git... ¡Bazinga! Claro que se puede :)... git es extremadísimamente flexible (casi casi que demsiado).", + "Bueno, lamentablemente eso no se puede hacer en git... ¡Bazinga! Claro que se puede :)... git es extremadísimamente flexible (casi casi que demasiado).", "", "Veamos cómo hacerlo a continuación..." ] @@ -199,7 +199,7 @@ exports.level = { "", "Esto se lo suele llamar refspec con dos puntos. Refspec es simplemente un nombre cool para una ubicación que git puede entender (como la rama `foo`, o incluso `HEAD~1`)", "", - "Una vez que especificás tanto el origen como el destino independientemente, podés ponerte bastante cómodo y preciso con los comandos remotos. ¡Veámos una demo!" + "Una vez que especificás tanto el origen como el destino independientemente, podés ponerte bastante cómodo y preciso con los comandos remotos. ¡Veamos una demo!" ] } }, @@ -220,7 +220,7 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "¿Y qué hay si el destino que al querés pushear no existe? ¡No hay drama! Simplemente dale un nombre al branch y git se va a encargar de creártelo en el remoto." + "¿Y qué hay si el destino al que querés pushear no existe? ¡No hay drama! Simplemente dale un nombre al branch y git se va a encargar de creártelo en el remoto." ], "afterMarkdowns": [ "Genial, simplemente fluye :D" diff --git a/src/levels/remote/remoteBranches.js b/src/levels/remote/remoteBranches.js index 82f630cf..f65d313a 100644 --- a/src/levels/remote/remoteBranches.js +++ b/src/levels/remote/remoteBranches.js @@ -165,7 +165,7 @@ exports.level = { "", "Lo primero que habrás notado es que apareció una nueva rama en tu repositorio local llamada `o/master`. A este tipo de ramas se las llama ramas _remotas_. Las ramas remotas tienen propiedades especiales porque sirven un propósito específico.", "", - "Las ramas remotas reflejan el _estado_ de los repositorios remotos (como estaban la última vez que hablaste con ellos). Te ayudan a entender las diferencias entre tu trabajo local y el trabajo que ya está publicado - un paso crítico antes de compartir tu trabajo con los demás.", + "Las ramas remotas reflejan el _estado_ de los repositorios remotos (cómo estaban la última vez que hablaste con ellos). Te ayudan a entender las diferencias entre tu trabajo local y el trabajo que ya está publicado - un paso crítico antes de compartir tu trabajo con los demás.", "", "Las ramas remotas tienen la propiedad especial de que cuando las checkouteás, pasás al modo detached `HEAD`. Git lo hace a propósito porque no podés trabajar en esas ramas directamente: tenés que trabajar en algún otro lado y después compartir tu trabajo con el remoto (tras lo que tus ramas remotas se actualizarán)." ] diff --git a/src/levels/remote/sourceNothing.js b/src/levels/remote/sourceNothing.js index 7b7e58c0..d28a5330 100644 --- a/src/levels/remote/sourceNothing.js +++ b/src/levels/remote/sourceNothing.js @@ -149,7 +149,7 @@ exports.level = { "markdowns": [ "### Rarezas de ``", "", - "Git abusa del parámetro `` de dos extrañas maneras. Estos dos abusos vienen del hecho de que tecnicamente podés especificar \"la nada\" como un `origen` válido tanto para git push como para git fetch. El modo de especificar la nada es a través de un parámetro vacío:", + "Git abusa del parámetro `` de dos extrañas maneras. Estos dos abusos vienen del hecho de que técnicamente podés especificar \"la nada\" como un `origen` válido tanto para git push como para git fetch. El modo de especificar la nada es a través de un parámetro vacío:", "", "* `git push origin :side`", "* `git fetch origin :bugFix`", diff --git a/src/levels/remote/tracking.js b/src/levels/remote/tracking.js index 27393e13..fc0d1966 100644 --- a/src/levels/remote/tracking.js +++ b/src/levels/remote/tracking.js @@ -311,7 +311,7 @@ exports.level = { "markdowns": [ "### ¿Puedo especificarlo yo?", "", - "¡Claro que sí! Podés hacer que cualquier rama que quieras trackee `o/master`, y si lo hicieras, esa rama va a tener el mismo destino implícito de push y objetivo implícito de merge que `master`. Eso signfica que podés correr `git push` en una rama llamada `absolutamenteNoEsMaster` y ¡que tu trabajo se pushee a la rama `master` del remoto!", + "¡Claro que sí! Podés hacer que cualquier rama que quieras trackee `o/master`, y si lo hicieras, esa rama va a tener el mismo destino implícito de push y objetivo implícito de merge que `master`. Eso significa que podés correr `git push` en una rama llamada `absolutamenteNoEsMaster` y ¡que tu trabajo se pushee a la rama `master` del remoto!", "", "Hay dos formas de establecer esta propiedad. La primera es checkoutear una nueva rama usando una rama remota como la referencia especificada. Ejecutar", "", From 645862e64eb8be7a9a8034ba0a8ce039b2c41d7e Mon Sep 17 00:00:00 2001 From: flyingbot91 Date: Fri, 20 Dec 2019 00:07:47 +0100 Subject: [PATCH 151/359] Update src/levels/remote/clone.js Co-Authored-By: Matias Garcia Isaia --- src/levels/remote/clone.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/remote/clone.js b/src/levels/remote/clone.js index 90ed2382..391b8cf1 100644 --- a/src/levels/remote/clone.js +++ b/src/levels/remote/clone.js @@ -160,7 +160,7 @@ exports.level = { "", "- Más importante, ¡los remotos sociabilizan la programación! Ahora que hay una copia de tu proyecto hosteada en otro lugar, tus amigos pueden contribuir a tu proyecto (o bajarse los últimos cambios) de un modo muy sencillo.", "", - "Se volvió bastante popular el uso de sitios web que muestran la actividad de los repositorios (como [Github](https://github.com/) or [Phabricator](http://phabricator.org/)), pero esos repositorios remotos _siempre_ sirven como la base subyacente de esas herramientas. Así que ¡es importante entenderlos!" + "Se volvió bastante popular el uso de sitios web que muestran la actividad de los repositorios (como [Github](https://github.com/) o [Phabricator](http://phabricator.org/)), pero esos repositorios remotos _siempre_ sirven como la base subyacente de esas herramientas. Así que ¡es importante entenderlos!" ] } }, From f6d0ab7e7590db96ee084901812c1b260203148d Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Thu, 2 Jan 2020 15:01:53 -0800 Subject: [PATCH 152/359] Other version of PR #624 -- map header directly from browser --- src/js/stores/LocaleStore.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/stores/LocaleStore.js b/src/js/stores/LocaleStore.js index 2be9c38b..32110784 100644 --- a/src/js/stores/LocaleStore.js +++ b/src/js/stores/LocaleStore.js @@ -25,7 +25,8 @@ var langLocaleMap = { var headerLocaleMap = { 'zh-CN': 'zh_CN', 'zh-TW': 'zh_TW', - 'pt-BR': 'pt_BR' + 'pt-BR': 'pt_BR', + 'es-ES': 'es_ES' }; var supportedLocalesList = Object.values(langLocaleMap) From 5e703a0489766df346702896998ad51e2f94c273 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AF=BA=E5=A2=A8?= Date: Tue, 14 Jan 2020 15:32:59 +0800 Subject: [PATCH 153/359] fix(typo): fix a typo in Chinese --- src/levels/mixed/jugglingCommits2.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/mixed/jugglingCommits2.js b/src/levels/mixed/jugglingCommits2.js index bfac0c16..ca42978b 100644 --- a/src/levels/mixed/jugglingCommits2.js +++ b/src/levels/mixed/jugglingCommits2.js @@ -397,7 +397,7 @@ exports.level = { "markdowns": [ "## 提交的技巧 #2", "", - "*如果你还没有完成“提交的技巧 #1”(前一关)的话,请选通过以后再来!*", + "*如果你还没有完成“提交的技巧 #1”(前一关)的话,请先通过以后再来!*", "", "正如你在上一关所见到的,我们可以使用 `rebase -i` 对提交记录进行重新排序。只要把我们想要的提交记录挪到最前端,我们就可以很轻松的用 `--amend` 修改它,然后把它们重新排成我们想要的顺序。", "", From 977150ad7f2ea1ce05ad37417f7cf18905a20fa0 Mon Sep 17 00:00:00 2001 From: Damotorie Date: Fri, 17 Jan 2020 15:01:23 +0900 Subject: [PATCH 154/359] Update pullArgs.js Fix Korean typo --- src/levels/remote/pullArgs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/remote/pullArgs.js b/src/levels/remote/pullArgs.js index e9e1cbb4..07270049 100644 --- a/src/levels/remote/pullArgs.js +++ b/src/levels/remote/pullArgs.js @@ -805,7 +805,7 @@ exports.level = { "", "`git fetch origin bar~1:bugFix; git merge bugFix`", "", - "보이죠? git pull은 그저 fetch + merge의 축양형일 뿐이에요, 그리고 git pull은 커밋들이 도착하는곳을 신경씁니다(fetch를 하며 지정된 `destination`인자의 위치로 merge가 수행됩니다).", + "보이죠? git pull은 그저 fetch + merge의 축약형일 뿐이에요, 그리고 git pull은 커밋들이 도착하는곳을 신경씁니다(fetch를 하며 지정된 `destination`인자의 위치로 merge가 수행됩니다).", "", "직접 확인해봅시다:" ] From 2622c3eb7a2ae3f8aaa3427127ac31dafe46b29b Mon Sep 17 00:00:00 2001 From: duongtiendat1990 <48908567+duongtiendat1990@users.noreply.github.com> Date: Sat, 25 Jan 2020 17:51:46 +0700 Subject: [PATCH 155/359] complete translate to Vietnamese --- src/js/dialogs/confirmShowSolution.js | 10 + src/js/dialogs/levelBuilder.js | 19 + src/js/dialogs/nextLevel.js | 11 + src/js/dialogs/sandbox.js | 22 + src/js/intl/strings.js | 275 +++-- src/js/stores/LocaleStore.js | 3 +- src/levels/advanced/multipleParents.js | 93 +- src/levels/index.js | 16 +- src/levels/intro/branching.js | 90 +- src/levels/intro/merging.js | 75 +- src/levels/intro/rebasing.js | 73 +- src/levels/mixed/describe.js | 1189 ++++++++++---------- src/levels/mixed/grabbingOneCommit.js | 45 +- src/levels/mixed/jugglingCommits.js | 40 +- src/levels/mixed/jugglingCommits2.js | 49 +- src/levels/mixed/tags.js | 58 +- src/levels/rampup/cherryPick.js | 63 +- src/levels/rampup/detachedHead.js | 1428 +++++++++++++----------- src/levels/rampup/interactiveRebase.js | 73 +- src/levels/rampup/relativeRefs.js | 81 +- src/levels/rampup/relativeRefs2.js | 76 +- src/levels/rampup/reversingChanges.js | 70 +- src/levels/rebase/manyRebases.js | 24 +- src/levels/rebase/selectiveRebase.js | 26 +- src/levels/remote/clone.js | 63 +- src/levels/remote/fakeTeamwork.js | 60 +- src/levels/remote/fetch.js | 79 +- src/levels/remote/fetchArgs.js | 129 ++- src/levels/remote/fetchRebase.js | 149 ++- src/levels/remote/mergeManyFeatures.js | 51 +- src/levels/remote/pull.js | 65 +- src/levels/remote/pullArgs.js | 80 +- src/levels/remote/push.js | 49 +- src/levels/remote/pushArgs.js | 81 +- src/levels/remote/pushArgs2.js | 76 +- src/levels/remote/pushManyFeatures.js | 59 +- src/levels/remote/remoteBranches.js | 67 +- src/levels/remote/sourceNothing.js | 57 +- src/levels/remote/tracking.js | 124 +- 39 files changed, 3701 insertions(+), 1397 deletions(-) diff --git a/src/js/dialogs/confirmShowSolution.js b/src/js/dialogs/confirmShowSolution.js index 966b993e..4b50e1f2 100644 --- a/src/js/dialogs/confirmShowSolution.js +++ b/src/js/dialogs/confirmShowSolution.js @@ -114,6 +114,16 @@ exports.dialog = { 'Я вірю в тебе! Ти впораєшся!' ] } + }], + 'vi': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## Bạn chắc là muốn xem đáp án chứ?', + '', + 'Tôi tin ở bạn! Bạn có thể làm được!' + ] + } }] }; diff --git a/src/js/dialogs/levelBuilder.js b/src/js/dialogs/levelBuilder.js index 411a88ae..4442c09b 100644 --- a/src/js/dialogs/levelBuilder.js +++ b/src/js/dialogs/levelBuilder.js @@ -229,4 +229,23 @@ exports.dialog = { ] } }], + 'vi': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## Chào mừng đến trình tạo cấp độ!', + '', + 'Có những bước chính sau:', + '', + ' * Khởi tạo môi trường với các lệnh git', + ' * Định nghĩa cây để bắt đầu với ```define start```', + ' * Nhập chuỗi lệnh git để tạo đáp án (tốt nhất) của bạn', + ' * Định nghĩa cây mục tiêu với ```define goal```. Định nghĩa mục tiêu đồng thời cũng xác định đáp án', + ' * Có thể định nghĩa gợi ý với ```define hint```', + ' * Chỉnh sửa tên với ```define name```', + ' * Có thể định nghĩa hội thoại bắt đầu với ```edit dialog```', + ' * Nhập lệnh ```finish``` xuất cấp độ của bạn dưới dạng JSON!' + ] + } + }] }; diff --git a/src/js/dialogs/nextLevel.js b/src/js/dialogs/nextLevel.js index 69d0c9ad..ce4de5c5 100644 --- a/src/js/dialogs/nextLevel.js +++ b/src/js/dialogs/nextLevel.js @@ -133,4 +133,15 @@ exports.dialog = { ] } }], + 'vi': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## Làm tốt lắm!!', + '', + 'Bạn hoàn thành cấp độ này với *{numCommands}* câu lệnh.; ', + 'Đáp án của chúng tôi sử dụng {best}.' + ] + } + }] }; diff --git a/src/js/dialogs/sandbox.js b/src/js/dialogs/sandbox.js index 84c69806..96512c66 100644 --- a/src/js/dialogs/sandbox.js +++ b/src/js/dialogs/sandbox.js @@ -557,5 +557,27 @@ exports.dialog = { '[це спеціальне посилання.](https://pcottle.github.io/learnGitBranching/?NODEMO)' ] } + }], + 'vi': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## Chào mừng đến với Học Nhánh Git', + '', + 'Bạn có hứng thú học Git? Bạn đến đúng nơi rồi đấy! ', + '"Học Nhánh Git" là cách trực quan và hiệu quả nhất để học Git trên web; ', + 'thông qua một loạt các thử thách cấp độ thú vị, bạn sẽ từng bước tìm hiểu sức mạnh của git', + '', + 'Sau khi hội thoại này đóng lại, bạn sẽ thấy nhiều cấp độ mà chúng tôi cung cấp. ', + 'Nếu bạn là người mới thì hãy bắt đầu từ bài đầu tiên. Nếu bạn đã có hiểu biết cơ bản về git, ', + 'hãy thử những bài mang tính thách thức hơn phía sau.', + '', + 'Bạn có thể dùng lệnh `show commands` để xem tất cả các lệnh hiện hữu.', + '', + 'Ghi chú: Nếu muốn trực tiếp vào hộp cát ở lần sau?', + 'Hãy dùng', + '[đường link đặc biệt này của chúng tôi](https://pcottle.github.io/learnGitBranching/?NODEMO)' + ] + } }] }; diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js index 2b27a9ca..7d66ede6 100755 --- a/src/js/intl/strings.js +++ b/src/js/intl/strings.js @@ -14,7 +14,8 @@ exports.strings = { 'fr_FR': 'Félicitations, vous avez réussi le dernier niveau !', 'ru_RU': 'Вау! Вы прошли последний уровень, отлично!', 'uk': 'Вау! Ти пройшов останній рівень, круто!', - 'ko': '와우! 마지막 레벨까지 마쳤습니다. 멋지네요!' + 'ko': '와우! 마지막 레벨까지 마쳤습니다. 멋지네요!', + 'vi': 'Wao! Bạn đã phá đảo, quá tuyệt!' }, /////////////////////////////////////////////////////////////////////////// 'finish-dialog-next': { @@ -31,7 +32,8 @@ exports.strings = { 'fr_FR': 'Voulez-vous passer à *"{nextLevel}"*, le prochain niveau ?', 'ru_RU': 'Хотите перейти на следующий уровень: *"{nextLevel}"*?', 'uk': 'Хочеш перейти на наступний рівень -- *"{nextLevel}"*?', - 'ko': '다음 레벨로 넘어갈까요? 레벨 *"{nextLevel}"*' + 'ko': '다음 레벨로 넘어갈까요? 레벨 *"{nextLevel}"*', + 'vi': 'Bạn có muốn chuyển sang cấp độ tiếp: *"{nextLevel}"* không?' }, /////////////////////////////////////////////////////////////////////////// 'finish-dialog-win': { @@ -48,7 +50,8 @@ exports.strings = { 'fr_FR': 'Fabuleux ! Votre solution a égalé ou surpassé notre solution.', 'ru_RU': 'Отлично! Ваше решение соответствует или превосходит наше.', 'uk': 'Чудово! Твій розв’язок на рівні або кращий від нашого.', - 'ko': '멋져요! 우리의 해답과 일치하거나 우리보다 좀 더 나은 해답입니다.' + 'ko': '멋져요! 우리의 해답과 일치하거나 우리보다 좀 더 나은 해답입니다.', + 'vi': 'Tuyệt vời! Đáp án của bạn đạt chuẩn thâm chí có thể tốt hơn.' }, /////////////////////////////////////////////////////////////////////////// 'finish-dialog-lose': { @@ -65,7 +68,8 @@ exports.strings = { 'fr_FR': 'Voyons si vous pouvez descendre à {best} :D', 'ru_RU': 'Попробуйте, может вы сможете уложиться в {best} : D', 'uk': 'Спробуй, можливо ти зможеш вкластися в {best} кроків :D', - 'ko': '{best}회로 줄일 수 있다면 해보세요. :D' + 'ko': '{best}회로 줄일 수 있다면 해보세요. :D', + 'vi': 'Thử xem bạn có thể giảm xuống {best} không? :D' }, /////////////////////////////////////////////////////////////////////////// 'hg-prune-tree': { @@ -81,7 +85,8 @@ exports.strings = { 'de_DE': 'Achtung! Mercurial macht aggressive Garbage Collection und muss daher deinen Baum reduzieren', 'ru_RU': 'Внимание! Mercurial использует агрессивный сборщик мусора и обрезает ваше дерево', 'uk': 'Увага! Mercurial агресивно збирає сміття й може обрізати твоє дерево ', - 'ko': '주의! Mercurial은 공격적으로 가비지 컬렉션을 수행하므로 트리를 정리할 필요가 있습니다.' + 'ko': '주의! Mercurial은 공격적으로 가비지 컬렉션을 수행하므로 트리를 정리할 필요가 있습니다.', + 'vi': 'Cảnh báo! Mercurial cần thực hiện thu gom rác và thu nhỏ cây lịch sử của bạn.' }, /////////////////////////////////////////////////////////////////////////// 'hg-a-option': { @@ -97,7 +102,8 @@ exports.strings = { 'fr_FR': 'L\'option -A n\'est pas nécessaire pour cette application, simplement commiter', 'ru_RU': 'Опция -A не требуется для этого приложения, просто сделайте коммит.', 'uk': 'Опція -A не потрібна для цього застосунку, можна просто комітити!', - 'ko': '이 앱에선 -A 옵션은 필요 없습니다. 그냥 커밋하세요!' + 'ko': '이 앱에선 -A 옵션은 필요 없습니다. 그냥 커밋하세요!', + 'vi': 'Không cần thiết phải dùng tùy chọn -A trên ứng dụng này, cứ commit là được!' }, /////////////////////////////////////////////////////////////////////////// 'hg-error-no-status': { @@ -113,7 +119,8 @@ exports.strings = { 'de_DE': 'Es gibt keinen Befehl status in dieser Anwendung, da es kein Staging von Dateien gibt. Probier stattdessen hg summary', 'ru_RU': 'Команда status не поддерживается в этом приложении, так как здесь нет файлов. Попробуйте выполнить hg summary', 'uk': 'Команда status не підтримується в цьому застосунку, так як немає стейджингу(staging) файлів. Натомість спробуй hg summary ', - 'ko': '이 앱을 위한 상태 명령어는 없습니다. 왜냐하면 파일들의 스테이징이 없기 때문입니다. 대신 hg summary를 시도해보세요.' + 'ko': '이 앱을 위한 상태 명령어는 없습니다. 왜냐하면 파일들의 스테이징이 없기 때문입니다. 대신 hg summary를 시도해보세요.', + 'vi': 'Ứng dụng này không hỗ trợ lệnh `status` vì không có tệp nhớ đệm, thay vì đó hãy dùng lệnh `hg summary`' }, /////////////////////////////////////////////////////////////////////////// 'hg-error-need-option': { @@ -129,7 +136,8 @@ exports.strings = { 'de_DE': 'Ich benötige die Option {option} für diesen Befehl!', 'ru_RU': 'Для этой команды требуется опция {option}', 'uk': 'Для цієї команди потрібна опція {option}', - 'ko': '나는 그 명령어를 위한 {option} 옵션이 필요합니다.' + 'ko': '나는 그 명령어를 위한 {option} 옵션이 필요합니다.', + 'vi': 'Câu lệnh đó cần tùy chọn {option}!' }, /////////////////////////////////////////////////////////////////////////// 'hg-error-log-no-follow': { @@ -145,7 +153,8 @@ exports.strings = { 'de_DE': 'hg log ohne -f wird aktuell nicht unterstützt, benutze bitte -f', 'ru_RU': 'hg log без опции -f в настоящий момент не поддерживается, используйте -f', 'uk': 'hg log без опції -f в данний момент не підтримується, використовуй -f', - 'ko': '-f가 없는 hg log는 현재 지원되지 않습니다. -f를 사용하세요.' + 'ko': '-f가 없는 hg log는 현재 지원되지 않습니다. -f를 사용하세요.', + 'vi': 'Hiện tại thì `hg log` mà không có tùy chọn -f chưa được hỗ trợ, hãy viết thêm -f.' }, /////////////////////////////////////////////////////////////////////////// 'git-status-detached': { @@ -161,7 +170,8 @@ exports.strings = { 'fr_FR': 'head détaché !', 'ru_RU': 'Отделенный HEAD', 'uk': 'Відокремлений HEAD', - 'ko': '분리된 HEAD!' + 'ko': '분리된 HEAD!', + 'vi': 'HEAD bị tách biệt!' }, /////////////////////////////////////////////////////////////////////////// 'git-status-onbranch': { @@ -177,7 +187,8 @@ exports.strings = { 'fr_FR': 'Sur la branche {branch}', 'ru_RU': 'В ветке {branch}', 'uk': 'В гілці {branch}', - 'ko': '분기 지점 {branch}에서' + 'ko': '분기 지점 {branch}에서', + 'vi': 'Đang trên nhánh {branch}' }, /////////////////////////////////////////////////////////////////////////// 'git-status-readytocommit': { @@ -193,7 +204,8 @@ exports.strings = { 'fr_FR': 'Prêt à commit ! (comme toujours dans cette démo)', 'ru_RU': 'Готово к коммиту! (как и всегда в этом демо)', 'uk': 'Готово до коміту! (як завжди в цьому демо)', - 'ko': '커밋을 준비하세요! (이 데모에서는 항상)' + 'ko': '커밋을 준비하세요! (이 데모에서는 항상)', + 'vi': 'Sẵn sàng để commit! (khi demo thì luôn có thể commit)' }, /////////////////////////////////////////////////////////////////////////// 'git-dummy-msg': { @@ -210,7 +222,8 @@ exports.strings = { 'fr_FR': 'Commit rapide. NoMaN Sux!', 'ru_RU': 'Быстрый коммит. А надо!', 'uk': 'Швидкий коміт. Динамо!', - 'ko': '빨리 커밋하세요!' + 'ko': '빨리 커밋하세요!', + 'vi': 'Commit luôn đi cho nóng!' }, 'git-error-origin-fetch-uptodate': { '__desc__': 'One of the error messages for git', @@ -225,7 +238,8 @@ exports.strings = { 'zh_CN': '已经是最新的了', 'ru_RU': 'Уже обновлено!', 'uk': 'Вже оновлено!', - 'ko': '이미 최신 상태입니다!' + 'ko': '이미 최신 상태입니다!', + 'vi': 'Cập nhật mới nhất rồi!' }, 'git-error-origin-fetch-no-ff': { '__desc__': 'One of the error messages for git', @@ -240,7 +254,8 @@ exports.strings = { 'fr_FR': 'Votre branche origin n\'est plus synchronisée avec la branche distante et fetch ne peut pas être appliqué. Essayez avec l\'option --force', 'ru_RU': 'Ваша origin ветка не синхронизирована с удаленной веткой, невозможно выполнить fetch', 'uk': 'Твоя гілка origin не синхронізована з віддаленою гілкою, неможливо виконати fetch', - 'ko': '당신의 오리진 브랜치가 원격 브랜치와 동기화되지 않았고, 패치를 실행할 수 없습니다.' + 'ko': '당신의 오리진 브랜치가 원격 브랜치와 동기화되지 않았고, 패치를 실행할 수 없습니다.', + 'vi': 'Nhánh của bạn không đồng bộ với nhánh remote nên lệnh fetch không thực thi được.' }, 'git-error-origin-push-no-ff': { '__desc__': 'One of the error messages for git', @@ -255,7 +270,8 @@ exports.strings = { 'fr_FR': 'Le dépôt distant a divergé de votre référentiel local, donc l\'envoi de vos modifications n\'est pas en simple avance rapide (et donc votre envoi a été rejeté). Veuillez récupérer les nouveaux changements depuis le dépôt distant, les intégrer dans cette branche, et essayez à nouveau. Vous pouvez le faire avec git pull ou git pull --rebase', 'ru_RU': 'Удаленный репозиторий разошелся с вашим локальным репозиторием, поэтому выгрузка ваших изменений не может быть в режиме fast forward (и следовательно ваш push будет отклонён). Пожалуйста, удалите изменения в удаленном репозитории которые, объедините их в эту ветку и попробуйте еще раз. Вы можете сделать это с помощью git pull или git pull --rebase', 'uk': 'Віддалений репозиторій розбігся з твоїм локальним репозиторієм, тому відвантаження твоїх змін не є простим fast forward (і тому твій push був відхилений). Будь-ласка, витягни зміни з віддаленого репозиторію, включи їх в цю гілку, й спробуй ще. Ти можеш зробити це за допомогою git pull чи git pull --rebase', - 'ko': '원격 레포지토리가 당신의 로컬 레포지토리에서 분기하므로, 변경 사항을 업데이트 하는것은 간단한 fast forward가 아닙니다(따라서 push가 거절될 것입니다.). 원격 레포지토리에서의 변경 사항을 내려 받아 이 브랜치에 합쳐라. 그리고 이걸 반복하라. 당신은 git pull 또는 git pull --rebase를 사용해 이를 수행할 수 있다.' + 'ko': '원격 레포지토리가 당신의 로컬 레포지토리에서 분기하므로, 변경 사항을 업데이트 하는것은 간단한 fast forward가 아닙니다(따라서 push가 거절될 것입니다.). 원격 레포지토리에서의 변경 사항을 내려 받아 이 브랜치에 합쳐라. 그리고 이걸 반복하라. 당신은 git pull 또는 git pull --rebase를 사용해 이를 수행할 수 있다.', + 'vi': 'Kho chứa từ xa có sự khác biệt với kho chứa cục bộ của bạn, nên không thể tự động (fast forward) cập nhật thay đổi của bạn (và vì thế hoạt động push của bạn bị từ chối). Vui lòng kéo về thay đổi từ kho chứa từ xa, kết nạp vào nhánh hiện tại, và thử lại lần nữa. Bạn có thể dùng lệnh `git pull` hoặc `git pull --rebase`' }, 'git-error-remote-branch': { '__desc__': 'One of the error messages for git', @@ -270,7 +286,8 @@ exports.strings = { 'fr_FR': 'Vous ne pouvez exécuter cette commande sur une branche distante', 'ru_RU': 'Вы не можете выполнить эту команду на удаленной ветке', 'uk': 'Ти не можеш виконати цю команду на віддаленій гілці', - 'ko': '당신은 원격 브랜치에서 그 명령어를 실행시킬 수 없다.' + 'ko': '당신은 원격 브랜치에서 그 명령어를 실행시킬 수 없다.', + 'vi': 'Bạn không thể thực thi lệnh đó lên nhánh từ xa.' }, 'git-error-origin-required': { '__desc__': 'One of the error messages for git', @@ -285,7 +302,8 @@ exports.strings = { 'fr_FR': 'Une origine est requise pour cette commande', 'ru_RU': 'Origin требуется для этой команды', 'uk': 'Для цієї команди потрібний origin', - 'ko': '그 명령어를 위한 오리진이 필요하다.' + 'ko': '그 명령어를 위한 오리진이 필요하다.', + 'vi': 'Lệnh đó yêu cầu có origin.' }, 'git-error-origin-exists': { '__desc__': 'One of the error messages for git', @@ -300,7 +318,8 @@ exports.strings = { 'fr_FR': 'Une origine existe déjà ! Vous ne pouvez pas en créer une nouvelle', 'ru_RU': 'Origin уже существует! Невозможно создать еще один', 'uk': 'Origin вже існує! Неможливо створити ще один', - 'ko': '오리진이 이미 존재합니다! 당신은 새로 만들 수 없습니다.' + 'ko': '오리진이 이미 존재합니다! 당신은 새로 만들 수 없습니다.', + 'vi': 'Nguyên bản (origin) đã tồn tại. Bạn không thể tạo thêm 1 cái mới' }, /////////////////////////////////////////////////////////////////////////// 'git-error-branch': { @@ -317,7 +336,8 @@ exports.strings = { 'fr_FR': 'Vous ne pouvez supprimer la branche master, la branche sur laquelle vous êtes, ou ce qui n\'est pas une branche', 'ru_RU' : 'Невозможно удалить ветку master, ветку на которой вы сейчас и то что не является веткой', 'uk': 'Неможливо видалити гілку master, гілку на якій ти зараз знаходишся чи штуки які не є гілкою', - 'ko': '당신은 마스터 브랜치, 당신이 현재 사용중인 브랜치, 또는 브랜치가 아닌 것들을 삭제할 수 없습니다.' + 'ko': '당신은 마스터 브랜치, 당신이 현재 사용중인 브랜치, 또는 브랜치가 아닌 것들을 삭제할 수 없습니다.', + 'vi': 'Bạn không thể xóa nhánh master, nhánh mà bạn đang tham chiếu tới, hoặc những gì không phải nhánh.' }, /////////////////////////////////////////////////////////////////////////// 'git-merge-msg': { @@ -333,7 +353,8 @@ exports.strings = { 'fr_FR': 'Merge de {target} dans {current}', 'ru_RU': 'Слияние {target} в {current}', 'uk': 'Злиття {target} в {current}', - 'ko': '{target}을 {current}에 병합하세요.' + 'ko': '{target}을 {current}에 병합하세요.', + 'vi': 'Gộp {target} vào {current}.' }, /////////////////////////////////////////////////////////////////////////// 'git-error-rebase-none': { @@ -349,7 +370,8 @@ exports.strings = { 'fr_FR': 'Aucun commit à rebaser ! C\'est soit un commit de merge, soit des modifications déjà appliquées', 'ru_RU': 'Нет коммитов для rebase! Все в коммите слияния или изменения уже применены', 'uk': 'Нема комітів для rebase! Все в коміті злиття (merge commit) чи зміни вже застосовані', - 'ko': 'rebase를 하기 위한 커밋이 없습니다! 모든 커밋과 변경 사항들의 병합은 이미 적용되었습니다.' + 'ko': 'rebase를 하기 위한 커밋이 없습니다! 모든 커밋과 변경 사항들의 병합은 이미 적용되었습니다.', + 'vi': 'Không có commit nào để rebase. Mọi thứ là merge commit hoặc thay đổi đã được áp dụng.' }, /////////////////////////////////////////////////////////////////////////// 'git-result-nothing': { @@ -365,7 +387,8 @@ exports.strings = { 'fr_FR': 'Rien à effectuer…', 'ru_RU': 'Нечего выполнять...', 'uk': 'Нічого виконувати...', - 'ko': '할게 없습니다 ...' + 'ko': '할게 없습니다 ...', + 'vi': 'Không có gì để làm ...' }, /////////////////////////////////////////////////////////////////////////// 'git-result-fastforward': { @@ -381,7 +404,8 @@ exports.strings = { 'fr_FR': 'En avance rapide…', 'ru_RU': 'Выполняю Fast forward...', 'uk': 'Виконую Fast forward', - 'ko': 'Fast forward 중입니다...' + 'ko': 'Fast forward 중입니다...', + 'vi': 'Đang fast forward...' }, /////////////////////////////////////////////////////////////////////////// 'git-result-uptodate': { @@ -397,7 +421,8 @@ exports.strings = { 'fr_FR': 'Branche déjà à jour', 'ru_RU': 'Ветка уже обновлена', 'uk': 'Гілку вже оновлено', - 'ko': '브랜치가 이미 최신 상태입니다.' + 'ko': '브랜치가 이미 최신 상태입니다.', + 'vi': 'Nhánh đã được cập nhật mới nhất.' }, /////////////////////////////////////////////////////////////////////////// 'git-error-exist': { @@ -413,7 +438,8 @@ exports.strings = { 'fr_FR': 'La référence {ref} n\'existe pas ou est inconnue', 'ru_RU': 'Ссылка {ref} не существует или неизвестна', 'uk': 'Посилання {ref} не існує чи невідоме', - 'ko': '{ref} 참조가 존재하지 않거나 알 수 없습니다.' + 'ko': '{ref} 참조가 존재하지 않거나 알 수 없습니다.', + 'vi': 'Tham chiếu {ref} không tồn tại hoặc không thể tìm thấy.' }, /////////////////////////////////////////////////////////////////////////// 'git-error-relative-ref': { @@ -429,7 +455,8 @@ exports.strings = { 'fr_FR': 'Le commit {commit} n\'a pas de correspondance {match}', 'ru_RU': 'Коммит {commit} не содержит {match}', 'uk': 'Коміт {commit} не містить {match}', - 'ko': '커밋 {commit}은 {match}를 가지고 있지 않습니다.' + 'ko': '커밋 {commit}은 {match}를 가지고 있지 않습니다.', + 'vi': 'Commit {commit} mà không có {match}.' }, /////////////////////////////////////////////////////////////////////////// 'git-warning-detached': { @@ -445,7 +472,8 @@ exports.strings = { 'fr_FR': 'Attention ! HEAD est détaché', 'ru_RU': 'Внимание! Репозиторий в состоянии detached HEAD, то есть не находится ни на какой ветке!', 'uk': 'Увага! Репозиторій в стані detached HEAD, тобто не знаходиться в жодній гілці!', - 'ko': '주의! 분리된 HEAD 상태' + 'ko': '주의! 분리된 HEAD 상태', + 'vi': 'Cảnh báo! HEAD bị tách rời' }, /////////////////////////////////////////////////////////////////////////// 'git-warning-add': { @@ -461,7 +489,8 @@ exports.strings = { 'fr_FR': 'Aucun besoin d\'ajouter des fichiers dans cette démo', 'ru_RU': 'Это демо не оперирует файлами', 'uk': 'Не потрібно додавати файли для цього демо', - 'ko': '이 데모에서는 파일을 추가할 필요가 없습니다.' + 'ko': '이 데모에서는 파일을 추가할 필요가 없습니다.', + 'vi': 'Không cần thêm tập tin trong bản giới thiệu này.' }, /////////////////////////////////////////////////////////////////////////// 'git-error-options': { @@ -477,7 +506,8 @@ exports.strings = { 'fr_FR': 'Les options que vous avez spécifiées sont incompatibles ou incorrectes', 'ru_RU': 'Неправильные опции', 'uk': 'Опції, які ти ввів, або некорректні або не підтримуються', - 'ko': '당신이 지정한 그 옵션들은 호환되지 않거나 올바르지 않습니다.' + 'ko': '당신이 지정한 그 옵션들은 호환되지 않거나 올바르지 않습니다.', + 'vi': 'Các tham số bạn chỉ định không tương thích hoặc không chính xác.' }, /////////////////////////////////////////////////////////////////////////// 'git-error-already-exists': { @@ -493,7 +523,8 @@ exports.strings = { 'fr_FR': 'Le commit {commit} existe déjà dans votre ensemble de modifications, opération avortée !', 'ru_RU': 'Коммит {commit} существует, отменяю!', 'uk': 'Коміт {commit} вже існує в твоєму change set, відміна!', - 'ko': '커밋 {commit}은 이미 당신의 변경 내역에 존재합니다. 중단!' + 'ko': '커밋 {commit}은 이미 당신의 변경 내역에 존재합니다. 중단!', + 'vi': 'Commit {commit} đã tồn tại trong những thay đổi của bạn. Đang hủy!' }, /////////////////////////////////////////////////////////////////////////// 'git-error-reset-detached': { @@ -509,7 +540,8 @@ exports.strings = { 'fr_FR': 'On ne peut pas effectuer un reset quand HEAD est détaché. Utilisez checkout pour déplacer', 'ru_RU': 'Это невозможно в режиме detached HEAD! Используйте checkout!', 'uk': 'Неможливо зробити reset в стані detached head! Використовуй checkout якщо хочеш змінити розташування', - 'ko': '분리된 HEAD에서 reset할 수 없습니다. 만약 이동시키기를 원한다면 checkout을 사용하세요.' + 'ko': '분리된 HEAD에서 reset할 수 없습니다. 만약 이동시키기를 원한다면 checkout을 사용하세요.', + 'vi': 'Trong trạng thái tách rời `HEAD` thì không thể `reset`. Dùng `checkout` nếu bạn muốn di chuyển.' }, /////////////////////////////////////////////////////////////////////////// 'git-warning-hard': { @@ -530,7 +562,10 @@ exports.strings = { 'uk': 'На LearnGitBranching reset по замовчуванню використовує --hard, тому цю опцію ' + 'можна пропустити, якщо ти втомився її набирати щоразу. Тільки запам’ятай, що по замовчуванню ' + 'звичайний git reset використовує --mixed', - 'ko': 'LearnGitBranching에서 reset의 기본 설정은 옵션은 --hard입니다. 우리 레슨에서는 이 옵션을 생략해도 됩니다. 다만 실제 Git의 기본 설정 옵션은 --mixed라는것만 기억하세요.' + 'ko': 'LearnGitBranching에서 reset의 기본 설정은 옵션은 --hard입니다. 우리 레슨에서는 이 옵션을 생략해도 됩니다. 다만 실제 Git의 기본 설정 옵션은 --mixed라는것만 기억하세요.', + 'vi': 'Trạng thái mặc định cho lệnh `reset` của \"Học nhánh Git\" là `--hard`.' + + ' Nên khi làm bài nếu bạn thấy gõ tham số này hơi tốn công thì cứ bỏ qua.' + + ' Nhưng mà hãy nhớ rằng thực tế thì `--mixed` mới là trạng thái mặc định của `reset`.' }, /////////////////////////////////////////////////////////////////////////// 'git-error-staging': { @@ -547,7 +582,8 @@ exports.strings = { 'fr_FR': 'Il n\'y a pas le concept d\'ajouter / mettre en staging, donc cette option ou commande est invalide', 'ru_RU': 'Это демо не работает с файлами, так что git add не нужен!', 'uk': 'В цьому демо немає можливості додати файл до робочої копії чи до стейджингу, тому ця опція чи команда некоректна чи не підтримується', - 'ko': '여기엔 파일을 추가하거나 스테이징한다는 개념이 없습니다. 따라서 그 옵션 또는 명령어는 유효하지 않습니다.' + 'ko': '여기엔 파일을 추가하거나 스테이징한다는 개념이 없습니다. 따라서 그 옵션 또는 명령어는 유효하지 않습니다.', + 'vi': 'Không có khái nệm thêm tập tin đệm(staging file), nên tùy chọn đó là bất hợp lệ.' }, /////////////////////////////////////////////////////////////////////////// 'git-revert-msg': { @@ -563,7 +599,8 @@ exports.strings = { 'fr_FR': 'Revert {oldCommit}: {oldMsg}', 'ru_RU': 'Откатываю {oldCommit}: {oldMsg}', 'uk': 'Повертаю {oldCommit}: {oldMsg}', - 'ko': '{oldCommit}:{oldMsg}를 복구중입니다.' + 'ko': '{oldCommit}:{oldMsg}를 복구중입니다.', + 'vi': 'Hoàn tác {oldCommit}:{oldMsg}.' }, /////////////////////////////////////////////////////////////////////////// 'git-error-args-many': { @@ -579,7 +616,8 @@ exports.strings = { 'fr_FR': 'J\'attends au plus {upper} argument(s) pour {what}', 'ru_RU': 'Ожидается максимум {upper} аргумент(ов) для {what}', 'uk': 'Я очікую максимум {upper} аргумент(ів) для {what}', - 'ko': '{what}을 위해 최대 {upper}개의 인자를 받습니다.' + 'ko': '{what}을 위해 최대 {upper}개의 인자를 받습니다.', + 'vi': 'Có thể có nhiều nhất {upper} tham số cho {what}.' }, /////////////////////////////////////////////////////////////////////////// 'git-error-args-few': { @@ -595,7 +633,8 @@ exports.strings = { 'fr_FR': 'J\'attends au moins {lower} argument(s) pour {what}', 'ru_RU': 'Ожидается как минимум {lower} аргументов для {what}', 'uk': 'Я очікую як мінімум {lower} аргумент(ів) для {what}', - 'ko': '{what}을 위해 최소 {lower}개의 인자를 받습니다.' + 'ko': '{what}을 위해 최소 {lower}개의 인자를 받습니다.', + 'vi': 'Cần ít nhất {lower} tham số cho {what}.' }, /////////////////////////////////////////////////////////////////////////// 'git-error-no-general-args': { @@ -611,7 +650,8 @@ exports.strings = { 'fr_FR': 'Cette commande n\'accepte aucun argument général', 'ru_RU': 'Это команда без аргументов', 'uk': 'Ця команда не приймає загальних аргументів', - 'ko': '그 명령어는 일반적으로 인자를 받지 않습니다.' + 'ko': '그 명령어는 일반적으로 인자를 받지 않습니다.', + 'vi': 'Lệnh đó không chấp nhận các tham số chung.' }, /////////////////////////////////////////////////////////////////////////// 'copy-tree-string': { @@ -627,7 +667,8 @@ exports.strings = { 'fr_FR': 'Copiez la chaîne d\'arbre ci-dessous', 'ru_RU': 'Скопируй текст ниже', 'uk': 'Скопіюй рядок дерева нижче', - 'ko': '다음 트리 문자열을 복사하세요.' + 'ko': '다음 트리 문자열을 복사하세요.', + 'vi': 'Sao chép chuỗi cây bên dưới.' }, /////////////////////////////////////////////////////////////////////////// 'learn-git-branching': { @@ -644,7 +685,8 @@ exports.strings = { 'fr_FR': 'Apprenez Git Branching', 'ru_RU': 'Изучаем ветвление в git', 'uk': 'Learn Git Branching', - 'ko': '깃 브랜칭을 배워봅시다.' + 'ko': '깃 브랜칭을 배워봅시다.', + 'vi': 'Học nhánh Git.' }, /////////////////////////////////////////////////////////////////////////// 'select-a-level': { @@ -660,7 +702,8 @@ exports.strings = { 'fr_FR': 'Choisissez un niveau', 'ru_RU': 'Выбери уровень', 'uk': 'Обери рівень', - 'ko': '레벨을 선택하세요.' + 'ko': '레벨을 선택하세요.', + 'vi': 'Chọn một cấp độ.' }, /////////////////////////////////////////////////////////////////////////// 'main-levels-tab': { @@ -673,7 +716,8 @@ exports.strings = { 'gl' : 'Principal', 'ru_RU': 'Основы', 'uk' : 'Основи', - 'ko': '메인' + 'ko': '메인', + 'vi': 'Bài học chính' }, /////////////////////////////////////////////////////////////////////////// 'remote-levels-tab': { @@ -686,7 +730,8 @@ exports.strings = { 'gl' : 'Remota', 'ru_RU': 'Удаленные репозитории', 'uk' : 'Віддалені репозиторії', - 'ko' : '원격' + 'ko' : '원격', + 'vi' : 'Bài học về thao tác từ xa' }, /////////////////////////////////////////////////////////////////////////// 'branch-name-short': { @@ -702,7 +747,8 @@ exports.strings = { 'fr_FR': 'Désolé, nous devons garder les noms de branches courts pour la visualisation. Votre nom de branche a été tronqué à 9 caractères, devenant "{branch}"', 'ru_RU': 'Для наглядности нам нужно сохранять имена веток короткими. Твоё название сокращено до 9 символов и теперь это "{branch}"', 'uk': 'Вибач, нам потрібно щоб ім’я гілок було як можна коротше для наглядності. Твоє ім’я гілки було скорочене до 9 літер й тепер це "{branch}"', - 'ko': '미안하지만, 우리는 시각적으로 더 좋게 보기위해 짧은 브랜치명이 필요합니다. 당신의 브랜치명은 9자리로 잘라 "{branch}"로 만들었습니다.' + 'ko': '미안하지만, 우리는 시각적으로 더 좋게 보기위해 짧은 브랜치명이 필요합니다. 당신의 브랜치명은 9자리로 잘라 "{branch}"로 만들었습니다.', + 'vi': 'Xin lỗi, chúng tôi cần giữ tên nhánh ngắn để tiện minh họa. Tên nhánh của bạn đã bị cắt xuống 9 ký tự là "{branch}".' }, /////////////////////////////////////////////////////////////////////////// 'bad-branch-name': { @@ -718,7 +764,8 @@ exports.strings = { 'fr_FR': 'Ce nom de branche "{branch}" n\'est pas autorisé', 'ru_RU': 'Название для ветки "{branch}" недопустимо!', 'uk': 'Назва гілки "{branch}" є недопустимою', - 'ko': '"{branch}"라는 브랜치명은 사용할 수 없습니다.' + 'ko': '"{branch}"라는 브랜치명은 사용할 수 없습니다.', + 'vi': 'Tên nhánh "{branch}" không được chấp nhận.' }, /////////////////////////////////////////////////////////////////////////// 'bad-tag-name': { @@ -734,7 +781,8 @@ exports.strings = { 'fr_FR': 'Le nom de tag "{tag}" n\'est pas autorisé', 'ru_RU': 'Название для тега "{tag}" недопустимо!', 'uk': 'Назва тегу "{tag}" є недопустимою', - 'ko': '"{tag}"라는 태그명은 사용할 수 없습니다.' + 'ko': '"{tag}"라는 태그명은 사용할 수 없습니다.', + 'vi': 'Tên thẻ "{tag}" không được chấp nhận.' }, /////////////////////////////////////////////////////////////////////////// 'option-not-supported': { @@ -750,7 +798,8 @@ exports.strings = { 'fr_FR': 'L\'option "{option}" n\'est pas supportée', 'ru_RU': 'Опция "{option}" недопустима!', 'uk': 'Опція "{option}" не підтримується!', - 'ko': '"{option}"(이)라는 옵션은 지원하지 않습니다.' + 'ko': '"{option}"(이)라는 옵션은 지원하지 않습니다.', + 'vi': 'Tùy chọn "{option}" không được hỗ trợ.' }, /////////////////////////////////////////////////////////////////////////// 'git-usage-command': { @@ -766,7 +815,8 @@ exports.strings = { 'fr_FR': 'git []', 'ru_RU': 'git <команда> [<аргументы>]', 'uk': 'git <команда> [<аргументи>]', - 'ko': 'git <명령어> [<인자들>]' + 'ko': 'git <명령어> [<인자들>]', + 'vi': 'git []' }, /////////////////////////////////////////////////////////////////////////// 'git-supported-commands': { @@ -782,7 +832,8 @@ exports.strings = { 'fr_FR': 'Commandes supportées', 'ru_RU': 'Поддерживаемые команды', 'uk': 'Допустимі команди', - 'ko': '지원되는 명령어들:' + 'ko': '지원되는 명령어들:', + 'vi': 'Các lệnh được hỗ trợ:' }, /////////////////////////////////////////////////////////////////////////// 'git-usage': { @@ -798,7 +849,8 @@ exports.strings = { 'fr_FR': 'Utilisation :', 'ru_RU': 'Использование:', 'uk': 'Використання:', - 'ko': '사용법' + 'ko': '사용법', + 'vi': 'Cách dùng:' }, /////////////////////////////////////////////////////////////////////////// 'git-version': { @@ -814,7 +866,8 @@ exports.strings = { 'fr_FR': 'Git version PCOTTLE.1.0', 'ru_RU': 'Версия git PCOTTLE.1.0', 'uk': 'Версія git PCOTTLE.1.0', - 'ko': 'Git Version PCOTILE.1.0' + 'ko': 'Git Version PCOTILE.1.0', + 'vi': 'Phiên bản Git TTC-Solutions.1.0' }, /////////////////////////////////////////////////////////////////////////// 'flip-tree-command': { @@ -829,7 +882,8 @@ exports.strings = { 'fr_FR': 'Inversion de l\'arbre...', 'ru_RU': 'Переворачиваю дерево...', 'uk': 'Перевертаю дерево...', - 'ko': '트리 뒤집는중...' + 'ko': '트리 뒤집는중...', + 'vi': 'Cây lật...' }, /////////////////////////////////////////////////////////////////////////// 'refresh-tree-command': { @@ -845,7 +899,8 @@ exports.strings = { 'fr_FR': 'Actualisation de l\'arbre…', 'ru_RU': 'Обновляю дерево...', 'uk': 'Оновлюю дерево...', - 'ko': '트리 다시 불러오는중...' + 'ko': '트리 다시 불러오는중...', + 'vi': 'Làm mới cây...' }, /////////////////////////////////////////////////////////////////////////// 'locale-command': { @@ -861,7 +916,8 @@ exports.strings = { 'fr_FR': 'Langue changée à {locale}', 'ru_RU': 'Локаль теперь равна {locale}', 'uk': 'Локаль тепер дорівнює {locale}', - 'ko': '로케일이 {locale}로 설정되었습니다.' + 'ko': '로케일이 {locale}로 설정되었습니다.', + 'vi': 'Ngôn ngữ được thay đổi thành {locale}.' }, /////////////////////////////////////////////////////////////////////////// 'locale-reset-command': { @@ -877,7 +933,8 @@ exports.strings = { 'fr_FR': 'Langue remise par défaut, qui est {locale}', 'ru_RU': 'Локаль сброшена. Теперь она равна {locale}', 'uk': 'Локаль скинута. Тепер вона дорівнює {locale}', - 'ko': '로케일이 {locale}로 초기화 되었습니다.' + 'ko': '로케일이 {locale}로 초기화 되었습니다.', + 'vi': 'Ngôn ngữ được đổi thành mặc định: {locale}.' }, /////////////////////////////////////////////////////////////////////////// 'show-command': { @@ -893,7 +950,8 @@ exports.strings = { 'fr_FR': 'Merci d\'utiliser une des commandes suivantes pour obtenir plus d\'informations', 'ru_RU': 'Для получения большей информации используй следующие команды:', 'uk': 'Щоб отримати більше інформації використовуй наступні команди:', - 'ko': '더 많은 정보를 위해 다음 명령어들중 하나를 사용하세요.' + 'ko': '더 많은 정보를 위해 다음 명령어들중 하나를 사용하세요.', + 'vi': 'Vui lòng dùng một trong các lệnh sau để có thêm thông tin:.' }, /////////////////////////////////////////////////////////////////////////// 'show-all-commands': { @@ -909,7 +967,8 @@ exports.strings = { 'fr_FR': 'Ci-dessous est la liste de toutes les commandes disponibles :', 'ru_RU': 'Вот все поддерживаемуе команды:', 'uk': 'Ось список всіх можливих команд:', - 'ko': '여기에 사용 가능한 모든 명령어들의 리스트가 있습니다.' + 'ko': '여기에 사용 가능한 모든 명령어들의 리스트가 있습니다.', + 'vi': 'Dưới đây là danh sách tất cả các lệnh hiện hành:.' }, /////////////////////////////////////////////////////////////////////////// 'cd-command': { @@ -925,7 +984,8 @@ exports.strings = { 'fr_FR': 'Répertoire changé à "/directories/dont/matter/in/this/demo" (les répertoires ne servent à rien dans cette démo)', 'ru_RU': 'Директория изменена на "/директории/не/важны/в/этом/демо"', 'uk': 'Директорія змінена на "/директорії/не/мають/значення/в/цьому/демо"', - 'ko': '디렉토리가 "/directories/dont/matter/in/this/demo"로 변경되었습니다.' + 'ko': '디렉토리가 "/directories/dont/matter/in/this/demo"로 변경되었습니다.', + 'vi': 'Thay đổi thư mục thành "/directories/dont/matter/in/this/demo".' }, /////////////////////////////////////////////////////////////////////////// 'ls-command': { @@ -941,7 +1001,8 @@ exports.strings = { 'fr_FR': 'DontWorryAboutFilesInThisDemo.txt (ne vous préoccupez pas des noms de fichier dans cette démo)', 'ru_RU': 'НеНадоЗаботитьсяОФайлахВЭтомДемо.txt', 'uk': 'ЗабийНаФайлиВЦьомуДемо.txt', - 'ko': 'DontWorryAboutFilesInThisDemo.txt (이_데모에서_파일에_대한_걱정은_하지마세요.txt)' + 'ko': 'DontWorryAboutFilesInThisDemo.txt (이_데모에서_파일에_대한_걱정은_하지마세요.txt)', + 'vi': 'DontWorryAboutFilesInThisDemo.txt (ĐừngLoLắngVềTậpTinTrongBảnGiớiThiệuNày.txt)' }, 'mobile-alert': { '__desc__': 'When someone comes to the site on a mobile device, they can not input commands so this is a nasty alert to tell them', @@ -956,7 +1017,8 @@ exports.strings = { 'fr_FR': 'Impossible de faire apparaître le clavier sur mobile / tablette :( Essayez de passer sur un ordinateur de bureau :D', 'ru_RU': 'Мобильные не поддерживаются, зайди с компьютера!', 'uk': 'LGB не підтримує ввід тексту з мобільного, зайди з компьютера! Це цього варте!', - 'ko': 'LGB는 모바일에서 입력을 받을 수 없습니다. 데스크톱으로 접속하세요! 이것은 가치가 있습니다. :D' + 'ko': 'LGB는 모바일에서 입력을 받을 수 없습니다. 데스크톱으로 접속하세요! 이것은 가치가 있습니다. :D', + 'vi': 'Đáng tiếc là ứng dụng không thể nhận thông tin từ điện thoại hay máy tính bảng, hãy sử dụng máy tính cá nhân, đáng để bỏ công mà :D' }, /////////////////////////////////////////////////////////////////////////// 'share-tree': { @@ -972,7 +1034,8 @@ exports.strings = { 'fr_FR': 'Partagez cet arbre avec vos amis ! Ils peuvent le charger avec "import tree"', 'ru_RU': 'Поделись деревом с друзьями! Они могут загрузить его при помощи "import tree"', 'uk': 'Поділись цим деревом з друзями! Вони зможуть його завантажити за допомогою "import tree"', - 'ko': '친구들과 이 트리를 공유하세요! 그들은 "import tree"를 사용해 이를 로드할 수 있습니다.' + 'ko': '친구들과 이 트리를 공유하세요! 그들은 "import tree"를 사용해 이를 로드할 수 있습니다.', + 'vi': 'Hãy chia sẻ cây này với bạn của mình! Họ có thể dùng "import tree" để tải.' }, /////////////////////////////////////////////////////////////////////////// 'paste-json': { @@ -988,7 +1051,8 @@ exports.strings = { 'fr_FR': 'Collez un blob JSON ci-dessous !', 'ru_RU': 'Вставь JSON ниже!', 'uk': 'Встав JSON нижче!', - 'ko': '아래에 JSON blob을 붙여넣으세요.' + 'ko': '아래에 JSON blob을 붙여넣으세요.', + 'vi': 'Dán một chuỗi JSON xuống bên dưới.' }, /////////////////////////////////////////////////////////////////////////// 'solved-map-reset': { @@ -1004,7 +1068,8 @@ exports.strings = { 'fr_FR': 'La carte des niveaux résolus a été effacée, vous repartez de zéro !', 'ru_RU': 'Всё сброшено! Можно начать с чистого листа!', 'uk': 'Все скинуте! Можна починати з чистого аркушу!', - 'ko': '해결된 지도가 초기화 되었습니다. 당신은 깨끗한 상태에서 시작합니다.' + 'ko': '해결된 지도가 초기화 되었습니다. 당신은 깨끗한 상태에서 시작합니다.', + 'vi': 'Tất cả đáp án đã được xóa, bạn có thể bắt đầu lại từ đầu.' }, /////////////////////////////////////////////////////////////////////////// 'level-cant-exit': { @@ -1020,7 +1085,8 @@ exports.strings = { 'fr_FR': 'Vous n\'êtes pas dans un niveau ! Vous êtes dans le mode bac à sable, commencez un niveau avec "levels"', 'ru_RU': 'Ты не проходишь уровень! Ты в песочнице! Чтобы начать уровень, используй команду "levels"!', 'uk': 'Ти не в рівні! Ти в пісочниці! Почни рівень з "levels"', - 'ko': '당신은 샌드박스에 있습니다. "levels"를 사용하여 레벨을 시작하세요.' + 'ko': '당신은 샌드박스에 있습니다. "levels"를 사용하여 레벨을 시작하세요.', + 'vi': 'Bạn hiện không ở cấp độ nào cả! Hãy bắt đầu một cấp độ với "levels".' }, /////////////////////////////////////////////////////////////////////////// 'level-no-id': { @@ -1036,7 +1102,8 @@ exports.strings = { 'fr_FR': 'Le niveau dont l\'identifiant est {id} n\'a pas été trouvé ! Ouverture de la vue de sélection des niveaux', 'ru_RU': 'Уровень с id "{id}" не найден! Открываю выбор уровней', 'uk': 'Рівень з id "{id}" не знайдений! Відкриваю вибір рівней', - 'ko': 'id "{id}"에 대한 레벨이 존재하지 않습니다. 레벨 선택 화면을 열어보세요.' + 'ko': 'id "{id}"에 대한 레벨이 존재하지 않습니다. 레벨 선택 화면을 열어보세요.', + 'vi': 'Không tìm thấy cấp độ cho định danh "{id}". Mở cửa sổ chọn cấp độ.' }, /////////////////////////////////////////////////////////////////////////// 'undo-stack-empty': { @@ -1052,7 +1119,8 @@ exports.strings = { 'fr_FR': 'La pile d\'annulation est vide !', 'ru_RU': 'Некуда откатывать!', 'uk': 'Нема куди відкатуватися', - 'ko': '되돌리기 스택이 비었습니다!' + 'ko': '되돌리기 스택이 비었습니다!', + 'vi': 'Không có gì để hoàn tác!' }, /////////////////////////////////////////////////////////////////////////// 'already-solved': { @@ -1068,7 +1136,8 @@ exports.strings = { 'fr_FR': 'Vous avez déjà résolu ce niveau, essayez d\'autres niveaux avec "levels" ou revenez au bac à sable avec "sandbox"', 'ru_RU': 'Ты уже прошел этот уровень, попробуй пройти другие при помощи команды "levels" или иди в песочницу "sandbox"', 'uk': 'Ти вже пройшов цей рівень, спробуй інші рівні з "levels" чи повернись в пісочницю з "sandbox"', - 'ko': '당신은 이미 이 레벨을 해결했습니다. "levels"를 사용하여 다른 레벨에 도전하거나 "sandbox"를 사용하여 샌드박스로 돌아가세요.' + 'ko': '당신은 이미 이 레벨을 해결했습니다. "levels"를 사용하여 다른 레벨에 도전하거나 "sandbox"를 사용하여 샌드박스로 돌아가세요.', + 'vi': 'Bạn đã vượt qua cấp độ này. Thử cấp độ khác với "levels" hoặc dùng "sandbox" để trở lại hộp cát.' }, /////////////////////////////////////////////////////////////////////////// 'solved-level': { @@ -1081,7 +1150,8 @@ exports.strings = { 'gl' : '¡Resolto!', 'ru_RU': 'Решено!!\n:D', 'uk' : 'Вирішено!!\n:D', - 'ko' : '해결 완료!!\n:D' + 'ko' : '해결 완료!!\n:D', + 'vi' : 'ĐÃ XONG!!\n:D' }, /////////////////////////////////////////////////////////////////////////// 'command-disabled': { @@ -1097,7 +1167,8 @@ exports.strings = { 'fr_FR': 'Cette commande git est désactivée pour ce niveau !', 'ru_RU': 'На этом уровне нельзя использовать эту команду!', 'uk': 'На цьому рівні не можна використовувати цю команду!', - 'ko': '그 Git 명령어는 이 레벨에서 사용할 수 없습니다.' + 'ko': '그 Git 명령어는 이 레벨에서 사용할 수 없습니다.', + 'vi': 'Ở cấp độ này thì lệnh git đó bị vô hiệu hóa.' }, /////////////////////////////////////////////////////////////////////////// 'share-json': { @@ -1113,7 +1184,8 @@ exports.strings = { 'fr_FR': 'Voici le JSON pour ce niveau ! Partagez-le avec quelqu\'un ou envoyez-le moi sur Github', 'ru_RU': 'Вот JSON для этого уровня! Поделись им с кем-нибудь или отправь его нам на GitHub', 'uk': 'Ось JSON для цього рівня! Поділись з кимось чи відправ мені його на Github', - 'ko': '이 레벨을 위한 JSON 데이터가 있습니다! 이를 다른 사람들과 공유하거나 Github에서 제게 보내보세요.' + 'ko': '이 레벨을 위한 JSON 데이터가 있습니다! 이를 다른 사람들과 공유하거나 Github에서 제게 보내보세요.', + 'vi': 'Đây là chuỗi JSON cho cấp độ này! Hãy chia sẻ với người khắc hoặc với tôi qua Github.' }, /////////////////////////////////////////////////////////////////////////// 'want-start-dialog': { @@ -1129,7 +1201,8 @@ exports.strings = { 'fr_FR': 'Vous n\'avez pas spécifié de dialogue de départ, voulez-vous en ajouter un ?', 'ru_RU': 'Не указано стартово сообщение! Точно продолжаем?', 'uk': 'Не вказано стартовий діалог, хочеш додати стартовий діалог?', - 'ko': '당신은 시작 대화창을 지정하지 않았습니다. 추가 하시겠습니까?' + 'ko': '당신은 시작 대화창을 지정하지 않았습니다. 추가 하시겠습니까?', + 'vi': 'Không có cửa sổ hội thoại được chỉ định, thêm một cái chứ?' }, /////////////////////////////////////////////////////////////////////////// 'want-hint': { @@ -1145,7 +1218,8 @@ exports.strings = { 'fr_FR': 'Vous n\'avez pas spécifié d\'indice, voulez-vous en ajouter un ?', 'ru_RU': 'Не указана подсказка для уровня! Пренебречь? Вальсируем?', 'uk': 'Не вказана підказка, хочеш додати підказку?', - 'ko': '당신은 힌트를 지정하지 않았습니다. 추가 하시겠습니까?' + 'ko': '당신은 힌트를 지정하지 않았습니다. 추가 하시겠습니까?', + 'vi': 'Bạn chưa chỉ định một gợi ý, thêm một cái chứ?' }, /////////////////////////////////////////////////////////////////////////// 'prompt-hint': { @@ -1161,7 +1235,8 @@ exports.strings = { 'fr_FR': 'Entrez l\'indice pour ce niveau, ou laissez-le vide pour ne pas l\'inclure', 'ru_RU': 'Введи подсказку для уровня, если хочешь.', 'uk': 'Додай підказку для рівня, якщо хочеш', - 'ko': '이 레벨을 위한 힌트를 입력하거나 만약 이를 포함시키고 싶지 않을 경우엔 비워두세요.' + 'ko': '이 레벨을 위한 힌트를 입력하거나 만약 이를 포함시키고 싶지 않을 경우엔 비워두세요.', + 'vi': 'Thêm một gợi ý cho cấp độ này, hoặc cứ để trống nếu bạn không muốn thêm.' }, /////////////////////////////////////////////////////////////////////////// 'prompt-name': { @@ -1177,7 +1252,8 @@ exports.strings = { 'fr_FR': 'Entrez le nom pour ce niveau', 'ru_RU': 'Введи название уровня', 'uk': 'Введи назву рівня', - 'ko': '레벨 이름을 입력하세요.' + 'ko': '레벨 이름을 입력하세요.', + 'vi': 'Nhập tên cho cấp độ này.' }, /////////////////////////////////////////////////////////////////////////// 'solution-empty': { @@ -1193,7 +1269,8 @@ exports.strings = { 'fr_FR': 'Votre solution est vide !! Quelque chose ne tourne pas rond', 'ru_RU': 'Решение не указано! Так не годится!', 'uk': 'Розв’язок порожній!! Щось не так', - 'ko': '해답이 비어있습니다. 무언가 잘못되었습니다.' + 'ko': '해답이 비어있습니다. 무언가 잘못되었습니다.', + 'vi': 'Đáp án bị bỏ trống!! Có gì thiếu rồi.' }, /////////////////////////////////////////////////////////////////////////// 'define-start-warning': { @@ -1209,7 +1286,8 @@ exports.strings = { 'fr_FR': 'Redéfinition du point de départ… la solution et la cible seront écrasés s\'ils ont déjà été définis', 'ru_RU': 'Устанавливаю стартовую точку... Решение и итоговое состояние будут стёрты, если они указаны ранее', 'uk': 'Встановлюю стартову точку... розв’язок та ціль будуть переписані якщо вони були задані раніше', - 'ko': '시작 지점을 정의하세요... 만약 그것이 먼저 정의된다면 해답과 목표가 덮어씌워질 것입니다.' + 'ko': '시작 지점을 정의하세요... 만약 그것이 먼저 정의된다면 해답과 목표가 덮어씌워질 것입니다.', + 'vi': 'Xác định điểm bắt đầu ... Các giải pháp và mục tiêu sẽ được thay thế nếu đã được chỉ định từ trước.' }, /////////////////////////////////////////////////////////////////////////// 'help-vague-level': { @@ -1225,7 +1303,8 @@ exports.strings = { 'fr_FR': 'Vous êtes dans un niveau, donc plusieurs formes d\'aide sont disponibles. Merci de sélectionner soit "help level" pour en apprendre plus sur cette leçon, "help general" pour l\'utilisation de Learn GitBranching, ou "objective" pour apprendre comment résoudre le niveau', 'ru_RU': 'При прохождении уровня доступны несколько видов помощи. Определить что нужно: "help level" чтобы получить информацию об этом уровне, "help general" для того, чтобы узнать о игре в целом или "objective" чтобы узнать что надо сделать в этом уровне.', 'uk': 'При проходженні рівня доступні декілька різновидів допомоги. Виберіть або "help level" щоб взнати більше про цей рівень, чи "help general" щоб взнати більше про Learn Git Branching, чи "objective" щоб дізнатись більше про проходження цього рівня', - 'ko': '당신은 한 레벨에 들어가 있고, 여러가지 도움 양식들을 사용할 수 있습니다. 레슨에 대해 더 알고싶을 땐 "help level", LearnGitBranching을 사용하고 싶을 땐 "help general", 또는 레벨을 어떻게 해결해야할지 알고싶을 땐 "objective"를 선택하세요.' + 'ko': '당신은 한 레벨에 들어가 있고, 여러가지 도움 양식들을 사용할 수 있습니다. 레슨에 대해 더 알고싶을 땐 "help level", LearnGitBranching을 사용하고 싶을 땐 "help general", 또는 레벨을 어떻게 해결해야할지 알고싶을 땐 "objective"를 선택하세요.', + 'vi': 'Bạn đang ở trong một cấp độ, nên sẽ có nhiều hỗ trợ. Vui lòng dùng "help level" để biết thêm về bài học này, "help general" để sử dụng HọcNhánhGit, hoặc "objective" để biết cách giải quyết bài tập.' }, /////////////////////////////////////////////////////////////////////////// 'help-vague-builder': { @@ -1241,7 +1320,8 @@ exports.strings = { 'fr_FR': 'Vous êtes dans l\'éditeur de niveaux, donc plusieurs formes d\'aide sont disponibles. Merci de sélectionner soit "help general" soit "help builder"', 'ru_RU': 'При создании уровней доступны несколько видов помощи. Выбери между "help general" и "help builder"', 'uk': 'При створенні рівня доступні декілька різновидів допомоги. Виберіть або "help general", чи "help builder"', - 'ko': '당신은 한 레벨 생성기에 들어가 있고, 여러가지 도움 양식들을 사용할 수 있습니다. "help general" 또는 "help builder"를 선택해주세요.' + 'ko': '당신은 한 레벨 생성기에 들어가 있고, 여러가지 도움 양식들을 사용할 수 있습니다. "help general" 또는 "help builder"를 선택해주세요.', + 'vi': 'Bạn đang tạo một cấp độ, nên sẽ có nhiều trợ giúp có sẵn. Vui lòng chọn "help general" hoặc "help builder".' }, /////////////////////////////////////////////////////////////////////////// 'show-goal-button': { @@ -1258,7 +1338,8 @@ exports.strings = { 'ja' : 'ゴールを表示', 'ru_RU': 'Цель уровня', 'uk': 'Ціль рівня', - 'ko': '목표 보기' + 'ko': '목표 보기', + 'vi': 'Hiển thị mục tiêu' }, /////////////////////////////////////////////////////////////////////////// 'hide-goal-button': { @@ -1275,7 +1356,8 @@ exports.strings = { 'ja' : 'ゴールを隠す', 'ru_RU': 'Спрятать цель', 'uk': 'Сховати ціль', - 'ko': '목표 숨기기' + 'ko': '목표 숨기기', + 'vi': 'Ẩn mục tiêu' }, /////////////////////////////////////////////////////////////////////////// 'objective-button': { @@ -1288,7 +1370,8 @@ exports.strings = { 'gl' : 'Obxectivo', 'ru_RU': 'Задача', 'uk': 'Задача', - 'ko': '목적' + 'ko': '목적', + 'vi': 'Chỉ dẫn' }, /////////////////////////////////////////////////////////////////////////// 'git-demonstration-title': { @@ -1301,7 +1384,8 @@ exports.strings = { 'gl' : 'Demostración de Git', 'ru_RU': 'Git демо', 'uk' : 'Git демо', - 'ko' : 'Git 데모' + 'ko' : 'Git 데모', + 'vi' : 'Trình diễn Git' }, /////////////////////////////////////////////////////////////////////////// 'goal-to-reach': { @@ -1318,7 +1402,8 @@ exports.strings = { 'ja' : '到達目標', 'ru_RU': 'Цель уровня', 'uk': 'Ціль рівня', - 'ko': '목표' + 'ko': '목표', + 'vi': 'Mục tiêu cần đạt' }, /////////////////////////////////////////////////////////////////////////// 'goal-only-master': { @@ -1335,7 +1420,8 @@ exports.strings = { 'ja': 'Note: masterブランチだけをこのlevelではチェックします。その他のブランチ(以下では、破線で示されています)に関しては、参照のためにあります。また、いつでもこのウィンドウは"hide goal"と打つかクリックで閉じれます', 'ru_RU': 'Важно: В этом уровне проверяется только ветка master. Остальные ветки просто для наглядности. Как обычно, можно скрыть это сообщение при помощи "hide goal"', 'uk': 'Важливо: В цьому рівні буде перевірятися тільки гілка master. Решта гілок тільки для наглядності (показані пунктиром нижче). Як завжди, можна сховати цей діалог за допомогою "hide goal"', - 'ko': 'Note: 이 레벨에선 오직 마스터 브랜치만이 검사될 것입니다.. 다른 브랜치들은 단순히 참고용입니다. (아래에 대시 라벨로 보여집니다.). "hide goal"을 사용하여 언제든지 창을 숨킬 수 있습니다.' + 'ko': 'Note: 이 레벨에선 오직 마스터 브랜치만이 검사될 것입니다.. 다른 브랜치들은 단순히 참고용입니다. (아래에 대시 라벨로 보여집니다.). "hide goal"을 사용하여 언제든지 창을 숨킬 수 있습니다.', + 'vi': 'Chú ý: Ở cấp độ này chỉ nhánh master bị kiểm tra. Các nhánh khác chỉ dùng để tham chiếu(có dấu - ở nhãn). Như thường lệ, bạn có thể ẩn mục tiêu bằng "hide goal".' }, /////////////////////////////////////////////////////////////////////////// 'hide-goal': { @@ -1352,7 +1438,8 @@ exports.strings = { 'ja' : 'このウィンドウは"hide goal"と打つかクリックで閉じれます', 'ru_RU': 'Можно скрыть это окно при помощи "hide goal"', 'uk': 'Можна сховати це вікно за допомогою "hide goal"', - 'ko': '"hide goal"을 사용하여 이 창을 숨길 수 있습니다.' + 'ko': '"hide goal"을 사용하여 이 창을 숨길 수 있습니다.', + 'vi': 'Bạn có thể ẩn cửa sổ này với "hide goal".' }, /////////////////////////////////////////////////////////////////////////// 'hide-start': { @@ -1369,7 +1456,8 @@ exports.strings = { 'ja' : 'このウィンドウは"hide start"かクリックで閉じれます', 'ru_RU': 'Можно скрыть это окно при помощи "hide start"', 'uk': 'Можна сховати це вікно за допомогою "hide start"', - 'ko': '"hide start"를 사용하여 이 창을 숨길 수 있습니다.' + 'ko': '"hide start"를 사용하여 이 창을 숨길 수 있습니다.', + 'vi': 'Bạn có thể ẩn cửa sổ này với "hide start".' }, /////////////////////////////////////////////////////////////////////////// 'level-builder': { @@ -1386,7 +1474,8 @@ exports.strings = { 'ja' : 'Levelエディタ', 'ru_RU': 'Редактор уровней', 'uk': 'Редактор рівнів', - 'ko': '레벨 생성기' + 'ko': '레벨 생성기', + 'vi': 'Trình tạo câp độ' }, /////////////////////////////////////////////////////////////////////////// 'no-start-dialog': { @@ -1403,7 +1492,8 @@ exports.strings = { 'ja' : 'このLevelにはスタートダイアログが存在しません', 'ru_RU': 'Нет стартового сообщение для уровня!', 'uk': 'Немає початкового діалогу для цього рівня!', - 'ko': '이 레벨을 위한 시작 대화창이 없습니다.' + 'ko': '이 레벨을 위한 시작 대화창이 없습니다.', + 'vi': 'Cấp độ này không được giới thiệu.' }, /////////////////////////////////////////////////////////////////////////// 'no-hint': { @@ -1420,7 +1510,8 @@ exports.strings = { 'ja' : 'あらら、このLevelでは、残念ながらヒントが存在しません :-/', 'ru_RU': "Милый мой, хороший, догадайся сам :-/ Подсказка не создана...", 'uk': 'Хм, схоже для цього рівня немає підказки :-/', - 'ko': '흠, 이 레벨을 위한 힌트가 없어보이는군요.' + 'ko': '흠, 이 레벨을 위한 힌트가 없어보이는군요.', + 'vi': 'Hmmm, có vẻ cấp độ này không có gợi ý rồi. :-/' }, /////////////////////////////////////////////////////////////////////////// 'error-untranslated-key': { @@ -1437,7 +1528,8 @@ exports.strings = { 'ja' : '{key}の翻訳がまだ存在しません :( GitHubでの、翻訳の協力をお願いします m(_)m', 'ru_RU': 'Перевода для {key} не создано :( Пожалуйста, предложи перевод на GitHub', 'uk': 'Немає перекладу для {key} :( Будь-ласка, запропонуй переклад на Github', - 'ko': '{key}를 위한 번역은 아직 존재하지 않습니다 :( 번역에 참여해주세요!' + 'ko': '{key}를 위한 번역은 아직 존재하지 않습니다 :( 번역에 참여해주세요!', + 'vi': 'Bản dịch cho {key} không có rồi :( Nếu có thể thì hãy lên dự án của chúng tôi ở Github để cung cấp bản dịch!' }, /////////////////////////////////////////////////////////////////////////// 'error-untranslated': { @@ -1454,6 +1546,7 @@ exports.strings = { 'ja' : 'このダイアログ、またはテキストの翻訳がまだ存在しません :( GitHubでの、翻訳の協力をお願いします m(_)m', 'ru_RU': 'Для этого сообщения нет перевода :( Пожалуйста, предложи перевод на GitHub', 'uk': 'Для цього повідомлення ще немає перекладу :( Будь-ласка, запропонуй переклад на Github', - 'ko': '이 대화창이나 텍스트는 아직 번역되지 않았습니다. :( 번역에 참여해주세요!' + 'ko': '이 대화창이나 텍스트는 아직 번역되지 않았습니다. :( 번역에 참여해주세요!', + 'vi': 'Hội thoại hoặc văn bản này chưa được dịch ra ngôn ngữ của bạn rồi. :( Hãy lên Github để cung cấp bản dịch!' } }; diff --git a/src/js/stores/LocaleStore.js b/src/js/stores/LocaleStore.js index 2be9c38b..7daec1a1 100644 --- a/src/js/stores/LocaleStore.js +++ b/src/js/stores/LocaleStore.js @@ -19,7 +19,8 @@ var langLocaleMap = { de: 'de_DE', pt: 'pt_BR', ru: 'ru_RU', - uk: 'uk' + uk: 'uk', + vi: 'vi' }; var headerLocaleMap = { diff --git a/src/levels/advanced/multipleParents.js b/src/levels/advanced/multipleParents.js index 7b40b4dc..be68aaf9 100644 --- a/src/levels/advanced/multipleParents.js +++ b/src/levels/advanced/multipleParents.js @@ -14,7 +14,8 @@ exports.level = { "zh_TW": "多個 parent commit", "ru_RU": "Здоровая семья, или несколько родителей", "ko" : "다수의 부모", - 'uk': 'Декілька батьків' + 'uk': 'Декілька батьків', + 'vi': 'Nhiều cha lắm mẹ' }, "hint": { "en_US": "Use `git branch bugWork` with a target commit to create the missing reference.", @@ -28,7 +29,8 @@ exports.level = { "zh_TW": "在一個指定的 commit 上面使用 `git branch bugWork`。", "ru_RU": "`git branch bugWork` на нужном коммите поможет создать нужную ссылку.", "ko" : "`git branch bugWork`를 대상 커밋과 함께 사용해서 부족한 참조를 만드세요", - 'uk': 'Використай "git branch bugWork" на потрібному коміті щоб створити потрібне посилання' + 'uk': 'Використай "git branch bugWork" на потрібному коміті щоб створити потрібне посилання', + 'vi': 'Dùng lệnh `git branch bugWork` để tạo nhánh tại vị trí chỉ định' }, "startDialog": { "en_US": { @@ -1075,6 +1077,93 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Tìm về cội nguồn", + "", + "Cũng giống ký hiệu `~`, ta cũng có thể thêm số theo sau ký hiệu `^`.", + "", + "Nhưng mà không giống như (`~`) con số theo sau là số lượng thế hệ commit, con số theo sau `^` chỉ định commit cha từ commit merge. Hãy nhớ rằng commit merge có nhiều cha, cho nên chọn cha nào cũng khá là mơ hồ.", + "", + "Thông thường thì sẽ chọn cha \"đầu tiên\" từ commit merge, nhưng nếu sau dấu `^` có một con số thì cách hành xử sẽ khác đi.", + "", + "Không nói dông dài nữa, làm thử một ví dụ nào", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Ở đây ta có 1 commit merge. Nếu ta dùng lệnh `master^` mà không bổ nghĩa cho nó, ta sẽ đi ngược lên commit cha đầu tiên của merge commit. ", + "", + "(*Trong hình minh họa bên trái thì commit cha đầu tiên được xếp hẳng hàng ngay phía trên của commit merge.*)" + ], + "afterMarkdowns": [ + "Dễ dàng -- đó là cách mà ta thường làm." + ], + "command": "git checkout master^", + "beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Nào bây giờ hãy chỉ định commit cha thứ hai thử..." + ], + "afterMarkdowns": [ + "Thấy chứ? Ta đã leo lên commit cha khác lúc trước." + ], + "command": "git checkout master^2", + "beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Dùng bổ ngữ `^` và `~` cho ta khả năng di chuyển trên cây lịch sử:" + ], + "afterMarkdowns": [ + "Nhanh như chớp!" + ], + "command": "git checkout HEAD~; git checkout HEAD^2; git checkout HEAD~2", + "beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Thâm chí còn ghê gớm hơn khi ta kết hợp chúng với nhau! Hãy xem thử:" + ], + "afterMarkdowns": [ + "Cùng con đường như lúc trước, nhưng chỉ cần 1 dòng lệnh." + ], + "command": "git checkout HEAD~^2~2", + "beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Áp dụng thực hành nào", + "", + "Để hoàn thành cấp độ này, hãy tạo ra một nhánh mới ở vị trí chỉ định.", + "", + "Dùng cách chỉ định trực tiếp commit (như là dùng `C6` chẳng hạn) thì dễ quá, nhưng thử thách ở đây là dùng các bổ ngữ đã học ở trên!" + ] + } + } + ] } } }; diff --git a/src/levels/index.js b/src/levels/index.js index 6a42de27..69c23590 100644 --- a/src/levels/index.js +++ b/src/levels/index.js @@ -81,7 +81,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ko' : 'git의 주요 명령어를 깔끔하게 알려드립니다', 'ru_RU': 'Хорошо подобранное введение в основные команды git', 'uk' : 'Гарно підібране введення в основні команди git', - 'vi' : 'Bước làm quen độc đáo tới phần lớn lệnh điều khiển git' + 'vi' : 'Từng bước làm quen với phần lớn lệnh điều khiển git' } }, rampup: { @@ -98,7 +98,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ru_RU': 'Едем дальше', 'uk' : 'Їдемо далі', 'ko' : '다음 단계로', - 'vi' : 'Vượt chướng ngại vật' + 'vi' : 'Tăng tốc' }, about: { 'en_US': 'The next serving of 100% git awesomes-ness. Hope you\'re hungry', @@ -113,7 +113,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ru_RU': 'Следующая порция абсолютной git-крутотенюшки. Проголодались?', 'uk' : 'Наступна порція абсолютної git-дивини. Сподіваюсь, ви зголодніли', 'ko' : 'git은 아주 멋져요. 왜 멋진지 알려드립니다', - 'vi' : 'Những món tuyệt đỉnh tiếp theo. Hi vọng bạn còn đói.' + 'vi' : 'Tận hưởng khẩu phần tuyệt hảo của git. Hi vọng bạn còn đói.' } }, remote: { @@ -131,7 +131,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ru_RU': 'Push & Pull - удалённые репозитории в Git!', 'uk' : 'Push & Pull -- віддалені репозиторії в Git!', 'ko' : 'Push & Pull -- Git 원격 저장소!', - 'vi' : 'Push & Pull -- Các git remote!' + 'vi' : 'Push & Pull -- Tác động git từ xa!' }, about: { 'en_US': 'Time to share your 1\'s and 0\'s kids; coding just got social', @@ -146,7 +146,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ru_RU': 'Настало время поделиться своими единичками и нулями. Время коллективного программирования', 'uk' : 'Настав час поділитися своїми нулями та одиничками; соціальне програмування', 'ko' : '내 코드를 공개할 때가 되었습니다. 코드를 공개해봅시다!', - 'vi' : 'Chia sẻ đứa con tinh thần 0 và 1 của bạn; mã tới với cộng đồng' + 'vi' : 'Chia sẻ đứa con tinh thần \'0\' và \'1\' của bạn; mã đã đến với cộng đồng' } }, remoteAdvanced: { @@ -164,7 +164,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ru_RU': 'Через origin – к звёздам. Продвинутое использование Git Remotes', 'uk' : 'Через origin – до зірок. Прогресивне використання Git Remotes', 'ko' : '"origin"그 너머로 -- 고급 Git 원격 저장소', - 'vi' : 'Gửi quê hương và các xứ xa -- nâng cao về các git remote' + 'vi' : 'Về với cội nguồn và vươn xa hơn -- nâng cao về các git remote' }, about: { 'en_US': 'And you thought being a benevolent dictator would be fun...', @@ -179,7 +179,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ru_RU': 'Весело было быть всесильным мудрым правителем...', 'uk' : 'А ти думав, що бути всесильним диктатором весело...', 'ko' : '자비로운 독재자가 되는게 재밌을 줄 알았겠지만...', - 'vi' : 'Làm một tay độc tài toàn năng bác ái cũng vui lắm...' + 'vi' : 'Và bạn nghĩ làm một kẻ độc tài nhân từ thì sẽ vui ...' } }, move: { @@ -196,7 +196,7 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_TW': '調整提交順序', 'ru_RU': 'Перемещаем труды туда-сюда', 'uk' : 'Переміщуємо роботу туди-сюди', - 'vi' : 'Bốc bốc xếp xếp' + 'vi' : 'Điều chỉnh vị trí' }, about: { 'en_US': '"Git" comfortable with modifying the source tree :P', diff --git a/src/levels/intro/branching.js b/src/levels/intro/branching.js index 7ecdc005..1b22ce64 100644 --- a/src/levels/intro/branching.js +++ b/src/levels/intro/branching.js @@ -13,7 +13,8 @@ exports.level = { "zh_CN": "Git Branch", "zh_TW": "建立 git branch", "ru_RU": "Ветвление в Git", - "uk": "Розгалуження в Git" + "uk": "Розгалуження в Git", + "vi": "Rẽ nhánh với Git" }, "hint": { "en_US": "Make a new branch with \"git branch \" and check it out with \"git checkout \"", @@ -27,7 +28,8 @@ exports.level = { "zh_TW": "用 'git branch [ branch 名稱]' 來建立 branch,用 'git checkout [ branch 名稱]' 切換到該 branch", "ko": "\"git branch [브랜치명]\"으로 새 브랜치를 만들고, \"git checkout [브랜치명]\"로 그 브랜치로 이동하세요", "ru_RU": "Создай новую ветку при помощи \"git branch [name]\" и перейди на неё при помощи \"git checkout [name]\"", - "uk": "Створи нову гілку за допомогою \"git branch [ім’я]\" й перейди на неї за допомогою \"git checkout [ім’я]\"" + "uk": "Створи нову гілку за допомогою \"git branch [ім’я]\" й перейди на неї за допомогою \"git checkout [ім’я]\"", + "vi": "Tạo một nhánh mới với lệnh \"git branch \" và chuyển sang đó với lệnh \"git checkout \"", }, "disabledMap": { "git revert": true @@ -973,6 +975,88 @@ exports.level = { } } ] - } + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Nhánh Git", + "", + "Nhánh trong Git cũng nhẹ đến không ngờ. Chúng chỉ đơn giản là các con trỏ đến commit -- không hơn. Đó là lý do các con chiên Git hay niệm chú:", + "", + "```", + "rẽ nhánh sớm, rẽ nhánh thường xuyên", + "```", + "", + "Bởi vì chẳng tốn bao nhiêu bộ nhớ cho việc rẽ nhánh cả, và nó dễ dàng phân chia công việc hơn là có một cái nhánh to tổ chảng.", + "", + "Khi bạn trộn lẫn commit và nhánh, bạn sẽ thấy chúng kết hợp với nhau thế nào. Còn bây giờ, đơn giản hãy nhớ nhánh cơ bản muốn nói \"Tôi muốn thành quả trong commit này và tất cả cha ông của nó\"" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Nào hãy xem nhánh trong Git hoạt động thế nào.", + "", + "Giờ chúng ta tạo một nhánh mới tên là `newImage`" + ], + "afterMarkdowns": [ + "Đó, rẽ nhánh là thế đó! Nhánh `newImage` giờ đã tham chiếu đến commit `C1`" + ], + "command": "git branch newImage", + "beforeCommand": "" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Nào cùng thử thêm nội dung vào nhánh mới này nào. Hãy bấm nút bên dưới" + ], + "afterMarkdowns": [ + "Ồ không! Nhánh `master` đã di chuyển nhưng nhánh `newImage` thì không! Đó là do ta không \"nằm trên\" nhánh mới, đó là tại sao dấu hoa thị (*) nằm trên nhánh `master`" + ], + "command": "git commit", + "beforeCommand": "git branch newImage" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Nào cùng bảo Git chuyển ta sang nhánh khác với lệnh", + "", + "```", + "git checkout ", + "```", + "", + "Lệnh này sẽ chuyển ta sang nhánh mới trước khi commit" + ], + "afterMarkdowns": [ + "Đó! Thay đổi của ta đã được lưu sang nhánh mới" + ], + "command": "git checkout newImage; git commit", + "beforeCommand": "git branch newImage" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Được rồi! Bạn đã sẵn sàng để tập rẽ nhánh rồi. Khi cửa sổ này đóng lại,", + "tạo một nhánh mới tên là `bugFix` và chuyển sang nhánh đó.", + "", + "Tiện thể, có đường tắt đấy: nếu bạn muốn tạo nhánh mới ", + "VÀ đồng thời chuyển sang luôn, bạn chỉ cần ", + "gõ `git checkout -b [yourbranchname]`." + ] + } + } + ] + }, } }; diff --git a/src/levels/intro/merging.js b/src/levels/intro/merging.js index 894501ff..b8cc1855 100644 --- a/src/levels/intro/merging.js +++ b/src/levels/intro/merging.js @@ -13,7 +13,8 @@ exports.level = { "zh_CN": "Git Merge", "zh_TW": "git 中的 merge", "ru_RU": "Слияния веток в Git", - "uk": "Злиття гілок в Git" + "uk": "Злиття гілок в Git", + "vi": "Gộp nhánh trong Git" }, "hint": { "en_US": "Remember to commit in the order specified (bugFix before master)", @@ -27,7 +28,8 @@ exports.level = { "zh_TW": "記住按指定的順序 commit(bugFix 比 master 優先)", "ko": "말씀드린 순서대로 커밋해주세요 (bugFix에 먼저 커밋하고 master에 커밋)", "ru_RU": "Не забудь делать коммиты в правильном порядке (сначала bugFix, потом master)", - "uk": "Не забудь робити коміти в правильному порядку (спочатку bugFix, а вже потім master)" + "uk": "Не забудь робити коміти в правильному порядку (спочатку bugFix, а вже потім master)", + "vi": "Nhớ là commit theo đúng thứ tự(bugFix trước master)" }, "disabledMap": { "git revert": true @@ -860,6 +862,75 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Nhánh và gộp nhánh", + "", + "Tuyệt! Ta đã biết làm sao để commit và tạo nhánh. Giờ ta cần học cách để tập hợp thành quả của 2 nhánh khác biệt lại với nhau. Đây sẽ là cách để ta phân tách để phát triển chức năng, rồi sau đó hợp nhất nó trở lại.", + "", + "Cách đầu tiên để hợp nhất thành quả cần xem xét đến là lệnh `git merge`. Merge trong Git là tạo ra một commit đặc biệt mà có 2 người cha độc nhất. Một commit mà có 2 cha căn bản nghĩa là \"Tôi muốn có thành quả của ông này và ông kia nữa, *và* tất cả ông cha của họ.\"", + "", + "Trực quan thì dễ hiểu hơn, sang trang tiếp theo nào" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Ở đây ta có 2 nhánh; mỗi nhánh có 1 commit độc nhất. Có nghĩa là chẳng nhánh nào có đủ \"thành quả\" trong kho chứa của ta cả. Sửa nó bằng merge nào.", + "", + "Ta sẽ `merge` nhánh `bugFix` vào `master`" + ], + "afterMarkdowns": [ + "Wao! Thấy chứ? Trước tiên, `master` giờ đã trỏ đến commit có 2 cha. Nếu bạn lần theo mũi tên lên trên từ `master`, bạn sẽ gặp tất cả các commit lên đến commit gốc. Có nghĩa là `master` giờ đã chứa tất cả thành quả trong kho.", + "", + "Đồng thời, bạn thấy màu commit thay đổi chứ? Để bạn dễ học hơn, tôi đã phối hợp một số bảng màu. Mỗi nhánh có một màu duy nhất. Mỗi commit mang màu pha trộn của tất cả nhánh chứa nó.", + "", + "Vì vậy, ở đây chúng ta thấy rằng màu nhánh `master` được pha trộn vào tất cả các commit, nhưng màu` bugFix` thì không. Hãy sửa nó nào ..." + ], + "command": "git merge bugFix", + "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Hãy gộp nhánh `master` vào `bugFix` nào:" + ], + "afterMarkdowns": [ + "Vì `bugFix` là bậc cha ông của `master`, git chẳng phải làm gì cả; nó đơn giản chỉ chuyển `bugFix` vào commit mà `master` đang trỏ tới.", + "", + "Giờ thì tất cả commit đã có cùng màu, nghĩa là mỗi nhánh đã chứa tất cả thành quả trong kho! Ồ hố!" + ], + "command": "git checkout bugFix; git merge master", + "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Để hoàn thành cấp độ này, hãy làm theo các bước bên dưới:", + "", + "* Tạo một nhánh mới tên là `bugFix`", + "* Chuyển sang nhánh `bugFix` với `git checkout bugFix`", + "* Commit một lần", + "* Trở về `master` với `git checkout`", + "* Commit một lần nữa", + "* Gộp nhánh `bugFix` vào `master` với `git merge`", + "", + "*Nhớ rằng, bạn luôn luôn có thể bật lại hội thoại này với lệnh \"objective\"!*" + ] + } + } + ] } } }; diff --git a/src/levels/intro/rebasing.js b/src/levels/intro/rebasing.js index 29a46107..b16786a5 100644 --- a/src/levels/intro/rebasing.js +++ b/src/levels/intro/rebasing.js @@ -13,7 +13,8 @@ exports.level = { "zh_CN": "Git Rebase", "zh_TW": "介紹 rebase", "ru_RU": "Введение в rebase", - "uk": "Знайомство з rebase" + "uk": "Знайомство з rebase", + "vi": "Giới thiệu về rebase" }, "hint": { "en_US": "Make sure you commit from bugFix first", @@ -27,7 +28,8 @@ exports.level = { "zh_CN": "先在 bugFix 分支上进行提交", "zh_TW": "你要先在 bugFix branch 進行 commit", "ru_RU": "Убедись, что сделал коммит в ветке bugFix", - "uk": "Впевнись, що зробив коміт в гілці bugFix" + "uk": "Впевнись, що зробив коміт в гілці bugFix", + "vi": "Hãy chắc chắn rằng bạn commit từ bugFix trước" }, "disabledMap": { "git revert": true @@ -834,6 +836,73 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Rebase", + "", + "Cách thứ 2 để kết hợp thành của của 2 nhánh là *rebase.* Rebase về căn bản là chọn một loạt các commit, \"sao chép\" chúng, và ném chúng sang chỗ khác.", + "", + "Nghe có vẻ phức tạp, lợi thế của rebase là có thể tạo ra cây lịch sử thẳng tuột. Ljch sử commit nhìn sẽ gọn gàng hơn nhiều.", + "", + "Xem nó hoạt động thế nào nào..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Giờ ta lại có 2 nhánh; để ý rằng nhánh bugFix đang được chọn (thấy dấu hoa thị chứ?)", + "", + "Ta muốn chuyển bugFix trực tiếp sang master. Theo cách đó thì các chức năng nhìn có vẻ được phát triển tuần tự, trong khi thực tế chúng được phát triển song song.", + "", + "Dùng lệnh `git rebase` để thử nào" + ], + "afterMarkdowns": [ + "Tuyệt vời! Giờ thành quả của nhánh bugFix nằm ngay trên master và ta có các commit nằm thẳng tuột.", + "", + "Để ý rằng commit C3 vẫn nằm đâu đó (đã được làm mờ), và commit C3' là bản \"sao chép\" mà ta dán lên nhánh master.", + "", + "Vấn đề duy nhất bây giờ là nhánh master vẫn chưa được cập nhật, làm luôn cho nóng nào..." + ], + "command": "git rebase master", + "beforeCommand": "git commit; git checkout -b bugFix C1; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Giờ thì ta đã chuyển sang nhánh `master`. Tiếp tục dán nó vào `bugFix` nào..." + ], + "afterMarkdowns": [ + "Đó! Bởi vì `master` là cha ông của `bugFix`, git đơn giản chuyển tham chiếu của nhánh `master` tiến lên." + ], + "command": "git rebase bugFix", + "beforeCommand": "git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Để hoàn thành cấp độ này, làm theo hướng dẫn sau", + "", + "* Chuyển sang nhánh mới tên là `bugFix`", + "* Commit một lần", + "* Quay về master và commit lần nữa", + "* Quay trở lại bugFix và rebase sang master", + "", + "Chúc may mắn!" + ] + } + } + ] } } }; diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js index 0bef2010..d4b24bc7 100644 --- a/src/levels/mixed/describe.js +++ b/src/levels/mixed/describe.js @@ -1,791 +1,856 @@ exports.level = { - "goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\",\"remoteTrackingBranchID\":null},\"side\":{\"target\":\"C4\",\"id\":\"side\",\"remoteTrackingBranchID\":null},\"bugFix\":{\"target\":\"C7\",\"id\":\"bugFix\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"},\"C5\":{\"parents\":[\"C3\"],\"id\":\"C5\"},\"C6\":{\"parents\":[\"C5\"],\"id\":\"C6\"},\"C7\":{\"parents\":[\"C6\"],\"id\":\"C7\"}},\"tags\":{\"v0\":{\"target\":\"C0\",\"id\":\"v0\",\"type\":\"tag\"},\"v1\":{\"target\":\"C3\",\"id\":\"v1\",\"type\":\"tag\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}", - "solutionCommand": "git commit ", - "startTree": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\",\"remoteTrackingBranchID\":null},\"side\":{\"target\":\"C4\",\"id\":\"side\",\"remoteTrackingBranchID\":null},\"bugFix\":{\"target\":\"C6\",\"id\":\"bugFix\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"},\"C5\":{\"parents\":[\"C3\"],\"id\":\"C5\"},\"C6\":{\"parents\":[\"C5\"],\"id\":\"C6\"}},\"tags\":{\"v0\":{\"target\":\"C0\",\"id\":\"v0\",\"type\":\"tag\"},\"v1\":{\"target\":\"C3\",\"id\":\"v1\",\"type\":\"tag\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}", - "name": { - "en_US": "Git Describe", - "fr_FR": "Git describe", - "de_DE": "Git Describe", - "ja" : "Git Describe", - "es_AR": "Git Describe", - "pt_BR": "Git Describe", - "gl" : "Git Describe", - "zh_TW": "git describe", - "zh_CN": "Git Describe", - "ru_RU": "Git describe", - "ko" : "Git describe(묘사)", - "uk" : "Git Describe" + 'goalTreeString': '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"side":{"target":"C4","id":"side","remoteTrackingBranchID":null},"bugFix":{"target":"C7","id":"bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C3"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"tags":{"v0":{"target":"C0","id":"v0","type":"tag"},"v1":{"target":"C3","id":"v1","type":"tag"}},"HEAD":{"target":"bugFix","id":"HEAD"}}', + 'solutionCommand': 'git commit ', + 'startTree': '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"side":{"target":"C4","id":"side","remoteTrackingBranchID":null},"bugFix":{"target":"C6","id":"bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C3"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"tags":{"v0":{"target":"C0","id":"v0","type":"tag"},"v1":{"target":"C3","id":"v1","type":"tag"}},"HEAD":{"target":"bugFix","id":"HEAD"}}', + 'name': { + 'en_US': 'Git Describe', + 'fr_FR': 'Git describe', + 'de_DE': 'Git Describe', + 'ja': 'Git Describe', + 'es_AR': 'Git Describe', + 'pt_BR': 'Git Describe', + 'gl': 'Git Describe', + 'zh_TW': 'git describe', + 'zh_CN': 'Git Describe', + 'ru_RU': 'Git describe', + 'ko': 'Git describe(묘사)', + 'uk': 'Git Describe', + 'vi': 'Git Describe(mô tả)' }, - "hint": { - "en_US": "Just commit once on bugFix when you're ready to move on", - "fr_FR": "Faites un commit sur bugFix quand vous êtes prêt", - "de_DE": "Committe nur einmal auf bugFix, wenn du soweit bist", - "ja" : "次に進む準備が整ったなら、bugFixに対して一回commitしてください", - "es_AR": "Simplemente commiteá una vez en bugFix cuando estés listo para seguir", - "pt_BR": "Simplesmente commite uma vez em bugFix quando quiser parar de experimentar", - "gl" : "Simplemente fai commit en bugFix cando estés listo para continuar.", - "zh_TW": "當你要移動的時候,只要在 bugFix 上面 commit 就好了", - "zh_CN": "当你准备好时,在 bugFix 分支上面提交一次就可以了", - "ru_RU": "Когда закончишь, просто сделай commit", - "ko" : "다음으로 넘어가고 싶으면 bugFix를 한번 커밋하면 됩니다.", - "uk" : "Просто зроби один коміт в bugFix коли ти будеш готовий іти далі" + 'hint': { + 'en_US': 'Just commit once on bugFix when you\'re ready to move on', + 'fr_FR': 'Faites un commit sur bugFix quand vous êtes prêt', + 'de_DE': 'Committe nur einmal auf bugFix, wenn du soweit bist', + 'ja': '次に進む準備が整ったなら、bugFixに対して一回commitしてください', + 'es_AR': 'Simplemente commiteá una vez en bugFix cuando estés listo para seguir', + 'pt_BR': 'Simplesmente commite uma vez em bugFix quando quiser parar de experimentar', + 'gl': 'Simplemente fai commit en bugFix cando estés listo para continuar.', + 'zh_TW': '當你要移動的時候,只要在 bugFix 上面 commit 就好了', + 'zh_CN': '当你准备好时,在 bugFix 分支上面提交一次就可以了', + 'ru_RU': 'Когда закончишь, просто сделай commit', + 'ko': '다음으로 넘어가고 싶으면 bugFix를 한번 커밋하면 됩니다.', + 'uk': 'Просто зроби один коміт в bugFix коли ти будеш готовий іти далі', + 'vi': 'Đơn giản là hãy commit một lẩn ở bugFix là xong rồi' }, - "startDialog": { - "en_US": { - "childViews": [ + 'startDialog': { + 'en_US': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "### Git Describe", - "", - "Because tags serve as such great \"anchors\" in the codebase, git has a command to *describe* where you are relative to the closest \"anchor\" (aka tag). And that command is called `git describe`!", - "", - "Git describe can help you get your bearings after you've moved many commits backwards or forwards in history; this can happen after you've completed a git bisect (a debugging search) or when sitting down at a coworkers computer who just got back from vacation." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '### Git Describe', + '', + 'Because tags serve as such great "anchors" in the codebase, git has a command to *describe* where you are relative to the closest "anchor" (aka tag). And that command is called `git describe`!', + '', + 'Git describe can help you get your bearings after you\'ve moved many commits backwards or forwards in history; this can happen after you\'ve completed a git bisect (a debugging search) or when sitting down at a coworkers computer who just got back from vacation.' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Git describe takes the form of:", - "", - "`git describe `", - "", - "Where `` is anything git can resolve into a commit. If you don't specify a ref, git just uses where you're checked out right now (`HEAD`).", - "", - "The output of the command looks like:", - "", - "`__g`", - "", - "Where `tag` is the closest ancestor tag in history, `numCommits` is how many commits away that tag is, and `` is the hash of the commit being described." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Git describe takes the form of:', + '', + '`git describe `', + '', + 'Where `` is anything git can resolve into a commit. If you don\'t specify a ref, git just uses where you\'re checked out right now (`HEAD`).', + '', + 'The output of the command looks like:', + '', + '`__g`', + '', + 'Where `tag` is the closest ancestor tag in history, `numCommits` is how many commits away that tag is, and `` is the hash of the commit being described.' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "Let's look at a quick example. For this tree below:" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + 'Let\'s look at a quick example. For this tree below:' ], - "afterMarkdowns": [ - "The command `git describe master` would output:", - "", - "`v1_2_gC2`", - "", - "Whereas `git describe side` would output:", - "", - "`v2_1_gC4`" + 'afterMarkdowns': [ + 'The command `git describe master` would output:', + '', + '`v1_2_gC2`', + '', + 'Whereas `git describe side` would output:', + '', + '`v2_1_gC4`' ], - "command": "git tag v2 C3", - "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" + 'command': 'git tag v2 C3', + 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "That's pretty much all there is to git describe! Try describing a few of the locations in this level to get a feel for the command.", - "", - "Once you're ready, just go ahead and commit once to finish the level. We're giving you a freebie :P" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'That\'s pretty much all there is to git describe! Try describing a few of the locations in this level to get a feel for the command.', + '', + 'Once you\'re ready, just go ahead and commit once to finish the level. We\'re giving you a freebie :P' ] } } ] }, - "fr_FR": { - "childViews": [ + 'fr_FR': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "### Git describe", - "", - "Parce ce que les tags sont de très bonnes références dans le code, git à une commande pour *décrire* (describe) la différence entre le commit et le tag le plus récent. Cette commande s'appelle `git describe` !", - "", - "Git describe peut vous aider lorsque vous vous êtes beaucoup déplacé; cela peut arriver après un git bisect (chercher l'apparition d'un bug) ou lorsque vous revenez de vacances après 3 semaines sur l'ordinateur d'un collègue." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '### Git describe', + '', + 'Parce ce que les tags sont de très bonnes références dans le code, git à une commande pour *décrire* (describe) la différence entre le commit et le tag le plus récent. Cette commande s\'appelle `git describe` !', + '', + 'Git describe peut vous aider lorsque vous vous êtes beaucoup déplacé; cela peut arriver après un git bisect (chercher l\'apparition d\'un bug) ou lorsque vous revenez de vacances après 3 semaines sur l\'ordinateur d\'un collègue.' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Git describe s'écrit comme suit :", - "", - "`git describe `", - "", - "où `` est un n'importe quelle chose que git peut résoudre en un commit. Si vous ne spécifiez pas de ref, `HEAD` est pris par défaut.", - "", - "Le résultat de la commande ressemble à :", - "", - "`__g`", - "", - "où `tag` est le tag le plus proche dans l'historique, `numCommits` le nombre de commits avec le tag, et `` le hash/identifiant du commit décrit." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Git describe s\'écrit comme suit :', + '', + '`git describe `', + '', + 'où `` est un n\'importe quelle chose que git peut résoudre en un commit. Si vous ne spécifiez pas de ref, `HEAD` est pris par défaut.', + '', + 'Le résultat de la commande ressemble à :', + '', + '`__g`', + '', + 'où `tag` est le tag le plus proche dans l\'historique, `numCommits` le nombre de commits avec le tag, et `` le hash/identifiant du commit décrit.' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "Regardons un petit exemple. Prenons cet arbre :" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + 'Regardons un petit exemple. Prenons cet arbre :' ], - "afterMarkdowns": [ - "La commande`git describe master` donne le résultat :", - "", - "`v1_2_gC2`", - "", - "alors que `git describe side` donne :", - "", - "`v2_1_gC4`" + 'afterMarkdowns': [ + 'La commande`git describe master` donne le résultat :', + '', + '`v1_2_gC2`', + '', + 'alors que `git describe side` donne :', + '', + '`v2_1_gC4`' ], - "command": "git tag v2 C3", - "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" + 'command': 'git tag v2 C3', + 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Ceci résume bien git describe ! Amusez-vous à utiliser cette commande avec d'autres endroits dans ce niveau pour bien comprendre describe.", - "", - "Lorsque vous serez prêt, faites simplement un commit pour finir le niveau. Un petit niveau bonus :P" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Ceci résume bien git describe ! Amusez-vous à utiliser cette commande avec d\'autres endroits dans ce niveau pour bien comprendre describe.', + '', + 'Lorsque vous serez prêt, faites simplement un commit pour finir le niveau. Un petit niveau bonus :P' ] } } ] }, - "zh_TW": { - "childViews": [ + 'zh_TW': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "### git describe", - "", - "因為 tag 在 commit tree 上表示的是一個錨點,git 有一個指令可以用來*顯示*離你最近的錨點(也就是 tag),而且這個指令叫做 `git describe`!", - "", - "當你已經完成了一個 `git bisect`(一個找尋有 bug 的 commit 的指令),或者是當你使用的是你跑去度假的同事的電腦時, `git describe` 可以幫助你了解你離最近的 tag 差了多少個 commit。" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '### git describe', + '', + '因為 tag 在 commit tree 上表示的是一個錨點,git 有一個指令可以用來*顯示*離你最近的錨點(也就是 tag),而且這個指令叫做 `git describe`!', + '', + '當你已經完成了一個 `git bisect`(一個找尋有 bug 的 commit 的指令),或者是當你使用的是你跑去度假的同事的電腦時, `git describe` 可以幫助你了解你離最近的 tag 差了多少個 commit。' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "`git describe` 的使用方式:", - "", - "`git describe `", - "", - "`` 是任何一個可以被 git 解讀成 commit 的位置,如果你沒有指定的話,git 會以你目前所在的位置為準(`HEAD`)。", - "", - "指令的輸出就像這樣:", - "", - "`__g`", - "", - "`` 表示的是離 `` 最近的 tag, `numCommits` 是表示這個 tag 離 `` 有多少個 commit, `` 表示的是你所給定的 `` 所表示的 commit 的前七個 id。" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '`git describe` 的使用方式:', + '', + '`git describe `', + '', + '`` 是任何一個可以被 git 解讀成 commit 的位置,如果你沒有指定的話,git 會以你目前所在的位置為準(`HEAD`)。', + '', + '指令的輸出就像這樣:', + '', + '`__g`', + '', + '`` 表示的是離 `` 最近的 tag, `numCommits` 是表示這個 tag 離 `` 有多少個 commit, `` 表示的是你所給定的 `` 所表示的 commit 的前七個 id。' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "讓我們來看一個例子,對於下面的 tree:" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '讓我們來看一個例子,對於下面的 tree:' ], - "afterMarkdowns": [ - "`git describe master` 會輸出:", - "", - "`v1_2_gC2`", - "", - "`git describe side` 會輸出:", - "", - "`v2_1_gC4`" + 'afterMarkdowns': [ + '`git describe master` 會輸出:', + '', + '`v1_2_gC2`', + '', + '`git describe side` 會輸出:', + '', + '`v2_1_gC4`' ], - "command": "git tag v2 C3", - "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" + 'command': 'git tag v2 C3', + 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "`git describe` 就是這樣了!試著在這個關卡指定幾個位置來感受一下這個指令吧!", - "", - "當你完成的時候,只要一個 commit 就可以結束這個關卡,我們會給你一個免費贈品:P" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '`git describe` 就是這樣了!試著在這個關卡指定幾個位置來感受一下這個指令吧!', + '', + '當你完成的時候,只要一個 commit 就可以結束這個關卡,我們會給你一個免費贈品:P' ] } } ] }, - "zh_CN": { - "childViews": [ + 'zh_CN': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "### Git Describe", - "", - "由于标签在代码库中起着“锚点”的作用,Git 还为此专门设计了一个命令用来**描述**离你最近的锚点(也就是标签),它就是 `git describe`!", - "", - "Git Describe 能帮你在提交历史中移动了多次以后找到方向;当你用 `git bisect`(一个查找产生 Bug 的提交记录的指令)找到某个提交记录时,或者是当你坐在你那刚刚度假回来的同事的电脑前时, 可能会用到这个命令。" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '### Git Describe', + '', + '由于标签在代码库中起着“锚点”的作用,Git 还为此专门设计了一个命令用来**描述**离你最近的锚点(也就是标签),它就是 `git describe`!', + '', + 'Git Describe 能帮你在提交历史中移动了多次以后找到方向;当你用 `git bisect`(一个查找产生 Bug 的提交记录的指令)找到某个提交记录时,或者是当你坐在你那刚刚度假回来的同事的电脑前时, 可能会用到这个命令。' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "`git describe` 的​​语法是:", - "", - "`git describe `", - "", - "`` 可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(`HEAD`)。", - "", - "它输出的结果是这样的:", - "", - "`__g`", - "", - "`tag` 表示的是离 `ref` 最近的标签, `numCommits` 是表示这个 `ref` 与 `tag` 相差有多少个提交记录, `hash` 表示的是你所给定的 `ref` 所表示的提交记录哈希值的前几位。", - "", - "当 `ref` 提交记录上有某个标签时,则只输出标签名称" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '`git describe` 的​​语法是:', + '', + '`git describe `', + '', + '`` 可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(`HEAD`)。', + '', + '它输出的结果是这样的:', + '', + '`__g`', + '', + '`tag` 表示的是离 `ref` 最近的标签, `numCommits` 是表示这个 `ref` 与 `tag` 相差有多少个提交记录, `hash` 表示的是你所给定的 `ref` 所表示的提交记录哈希值的前几位。', + '', + '当 `ref` 提交记录上有某个标签时,则只输出标签名称' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "让我们来看一个例子,对于下面的提交树:" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '让我们来看一个例子,对于下面的提交树:' ], - "afterMarkdowns": [ - "`git describe master` 会输出:", - "", - "`v1_2_gC2`", - "", - "`git describe side` 会输出:", - "", - "`v2_1_gC4`" + 'afterMarkdowns': [ + '`git describe master` 会输出:', + '', + '`v1_2_gC2`', + '', + '`git describe side` 会输出:', + '', + '`v2_1_gC4`' ], - "command": "git tag v2 C3", - "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" + 'command': 'git tag v2 C3', + 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "`git describe` 就是这样了!试着在这个关卡指定几个位置来感受一下这个命令吧!", - "", - "当你准备进行下一关时,只要提交一次就可以通过这个关卡。算是我们送你的一个小礼物吧 :P" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '`git describe` 就是这样了!试着在这个关卡指定几个位置来感受一下这个命令吧!', + '', + '当你准备进行下一关时,只要提交一次就可以通过这个关卡。算是我们送你的一个小礼物吧 :P' ] } } ] }, - "es_AR": { - "childViews": [ + 'es_AR': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "### Git Describe", - "", - "Como los tags sirven tanto para marcar \"hitos\" en el código, git tiene un comando para *describir* (_describe_) dónde estás relativo al \"hito\" más cercano (digamos, \"tag\"). Y ese comamndo se llama ¡`git describe`!", - "", - "Git describe puede ayudarte a saber dónde estás después de que te hayas movido varios commits hacia adelante o atrás en la historia. Esto puede pasarte después de que termines un git bisect (una búsqueda que te ayuda a debuggear problemas) o cuando te sentás en la computadora de un compañero de trabajo que recién vuelve de unas vacaciones." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '### Git Describe', + '', + 'Como los tags sirven tanto para marcar "hitos" en el código, git tiene un comando para *describir* (_describe_) dónde estás relativo al "hito" más cercano (digamos, "tag"). Y ese comamndo se llama ¡`git describe`!', + '', + 'Git describe puede ayudarte a saber dónde estás después de que te hayas movido varios commits hacia adelante o atrás en la historia. Esto puede pasarte después de que termines un git bisect (una búsqueda que te ayuda a debuggear problemas) o cuando te sentás en la computadora de un compañero de trabajo que recién vuelve de unas vacaciones.' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Git describe tiene la siguiente forma:", - "", - "`git describe `", - "", - "Donde `` es cualquier cosa que git puede resolver a un commit. Si no especificás ninguna referencia, git simplemente usa el commit en que estás parado ahora (`HEAD`).", - "", - "La salida de ese comando se ve así:", - "", - "`__g`", - "", - "Donde `tag` es el tag más cercano en la historia, `numCommits` dice a cuántos commits de ese tag estás, y `` es el hash del commit que estás describiendo." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Git describe tiene la siguiente forma:', + '', + '`git describe `', + '', + 'Donde `` es cualquier cosa que git puede resolver a un commit. Si no especificás ninguna referencia, git simplemente usa el commit en que estás parado ahora (`HEAD`).', + '', + 'La salida de ese comando se ve así:', + '', + '`__g`', + '', + 'Donde `tag` es el tag más cercano en la historia, `numCommits` dice a cuántos commits de ese tag estás, y `` es el hash del commit que estás describiendo.' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "Veamos un ejemplo breve. Para este árbol de commits:" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + 'Veamos un ejemplo breve. Para este árbol de commits:' ], - "afterMarkdowns": [ - "El comando `git describe master` mostraría:", - "", - "`v1_2_gC2`", - "", - "Mientras que `git describe side` debería mostrar:", - "", - "`v2_1_gC4`" + 'afterMarkdowns': [ + 'El comando `git describe master` mostraría:', + '', + '`v1_2_gC2`', + '', + 'Mientras que `git describe side` debería mostrar:', + '', + '`v2_1_gC4`' ], - "command": "git tag v2 C3", - "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" + 'command': 'git tag v2 C3', + 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "¡Eso es prácticamente todo lo que hay sobre git describe! Probá describiendo algunas referencias en este nivel para amigarte con el comando.", - "", - "Cuando estés listo, hacé un commit para terminar el nivel. Te estamos dando una gratis :P" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '¡Eso es prácticamente todo lo que hay sobre git describe! Probá describiendo algunas referencias en este nivel para amigarte con el comando.', + '', + 'Cuando estés listo, hacé un commit para terminar el nivel. Te estamos dando una gratis :P' ] } } ] }, - "pt_BR": { - "childViews": [ + 'pt_BR': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "### Git Describe", - "", - "Devido ao fato de as tags servirem como \"âncoras\" tão boas no código, o Git tem um comando para *descrever* onde você está com relação à \"âncora\" (tag) mais próxima. Esse comando é chamado `git describe`!", - "", - "O git describe pode ajudar a recuperar a sua orientação depois de você ter se movido muitos commits para trás ou para frente no histórico; isso pode acontecer depois de você completar um git bisect (uma busca para debug) ou quando se sentar no computador de um colega que acabou de voltar de férias." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '### Git Describe', + '', + 'Devido ao fato de as tags servirem como "âncoras" tão boas no código, o Git tem um comando para *descrever* onde você está com relação à "âncora" (tag) mais próxima. Esse comando é chamado `git describe`!', + '', + 'O git describe pode ajudar a recuperar a sua orientação depois de você ter se movido muitos commits para trás ou para frente no histórico; isso pode acontecer depois de você completar um git bisect (uma busca para debug) ou quando se sentar no computador de um colega que acabou de voltar de férias.' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "O git describe é chamado da seguinte forma:", - "", - "`git describe `", - "", - "Onde `` é qualquer coisa que o git possa resolver como uma referência a um commit. Se você não especificar o ref, o Git usa simplesmente o commit atual (`HEAD`).", - "", - "A saída do comando é mais ou menos assim:", - "", - "`__g`", - "", - "Onde `tag` é a tag ancestral mais próxima no histórico, `numCommits` é o número de commits de distância da tag, e `` é o hash do commit sendo descrito." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'O git describe é chamado da seguinte forma:', + '', + '`git describe `', + '', + 'Onde `` é qualquer coisa que o git possa resolver como uma referência a um commit. Se você não especificar o ref, o Git usa simplesmente o commit atual (`HEAD`).', + '', + 'A saída do comando é mais ou menos assim:', + '', + '`__g`', + '', + 'Onde `tag` é a tag ancestral mais próxima no histórico, `numCommits` é o número de commits de distância da tag, e `` é o hash do commit sendo descrito.' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "Vejamos um exemplo rápido. Para a árvore abaixo:" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + 'Vejamos um exemplo rápido. Para a árvore abaixo:' ], - "afterMarkdowns": [ - "O comando `git describe master` daria a saída:", - "", - "`v1_2_gC2`", - "", - "Enquanto `git describe side` daria:", - "", - "`v2_1_gC4`" + 'afterMarkdowns': [ + 'O comando `git describe master` daria a saída:', + '', + '`v1_2_gC2`', + '', + 'Enquanto `git describe side` daria:', + '', + '`v2_1_gC4`' ], - "command": "git tag v2 C3", - "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" + 'command': 'git tag v2 C3', + 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "É basicamente disso que se trata o git describe! Tente descrever alguns locais da árvore para sentir como o comando se comporta.", - "", - "Uma vez que você estiver satisfeito, apenas faça um commit que o nível será finalizado. Essa é de graça :P" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'É basicamente disso que se trata o git describe! Tente descrever alguns locais da árvore para sentir como o comando se comporta.', + '', + 'Uma vez que você estiver satisfeito, apenas faça um commit que o nível será finalizado. Essa é de graça :P' ] } } ] }, - "gl" : { - "childViews": [ + 'gl': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "### Git Describe", - "", - "Como as tags fan a función de \"áncora\" no repositorio, Git ten un comando para *describir* ónde podes estar ti en relación á \"áncora\" (tag) máis próxima. Ese comando chámase `git describe`!", - "", - "Git describe pode axudar a recuperar a túa posición despois de mover moitos commits para atrás ou para adiante na historia; esto pode suceder depois de que fagas un git bisect (unha búsqueda para atopar erros) ou cando te sentas no ordenador dun colega que chegou das vacacións." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '### Git Describe', + '', + 'Como as tags fan a función de "áncora" no repositorio, Git ten un comando para *describir* ónde podes estar ti en relación á "áncora" (tag) máis próxima. Ese comando chámase `git describe`!', + '', + 'Git describe pode axudar a recuperar a túa posición despois de mover moitos commits para atrás ou para adiante na historia; esto pode suceder depois de que fagas un git bisect (unha búsqueda para atopar erros) ou cando te sentas no ordenador dun colega que chegou das vacacións.' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Git describe lánzase do seguinte xeito:", - "", - "`git describe `", - "", - "Onde `` é qualquera cousa que git poida resolver como unha referencia a un commit. Se non especificas a ref, git usará o commit actual no que se esté traballando (`HEAD`).", - "", - "A resposta do comando é algo semellante a esto:", - "", - "`__g`", - "", - "Onde `tag` é a tag anterior máis próxima na historia, `numCommits` é o número de commits de distancia ó tag, e `` é o hash do commit no que estamos." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Git describe lánzase do seguinte xeito:', + '', + '`git describe `', + '', + 'Onde `` é qualquera cousa que git poida resolver como unha referencia a un commit. Se non especificas a ref, git usará o commit actual no que se esté traballando (`HEAD`).', + '', + 'A resposta do comando é algo semellante a esto:', + '', + '`__g`', + '', + 'Onde `tag` é a tag anterior máis próxima na historia, `numCommits` é o número de commits de distancia ó tag, e `` é o hash do commit no que estamos.' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "Vexamos un exemplo rápido. Para a árbore de abaixo:" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + 'Vexamos un exemplo rápido. Para a árbore de abaixo:' ], - "afterMarkdowns": [ - "O comando `git describe master` daría a saída:", - "", - "`v1_2_gC2`", - "", - "Mentres que `git describe side` daría:", - "", - "`v2_1_gC4`" + 'afterMarkdowns': [ + 'O comando `git describe master` daría a saída:', + '', + '`v1_2_gC2`', + '', + 'Mentres que `git describe side` daría:', + '', + '`v2_1_gC4`' ], - "command": "git tag v2 C3", - "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" + 'command': 'git tag v2 C3', + 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "¡Básicamente é iso do que trata git describe! Intenta descubrir algúns locais da árbore para sentir como se comporta o comando.", - "", - "Cando estés listo, fai un commit para que o nivel remate. Esa é a gracia." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '¡Básicamente é iso do que trata git describe! Intenta descubrir algúns locais da árbore para sentir como se comporta o comando.', + '', + 'Cando estés listo, fai un commit para que o nivel remate. Esa é a gracia.' ] } } ] }, - "de_DE": { - "childViews": [ + 'de_DE': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "### Git Describe", - "", - "Weil Tags so super als \"Anker\" im Repository dienen können bietet Git einen Befehl um zu *beschreiben* wo du dich relativ zum nächsten \"Anker\" (also Tag) befindest. Und der heißt `git describe`.", - "", - "Er hilft dir dabei, dir einen Überblick zu verschaffen nachdem du viele Commits im Log zurück- oder vorgegangen bist; das kann vorkommen nachdem du ein `git bisect` (eine Fehlersuche) abgeschlossen hast oder wenn du dich an den Rechner eines Kollegen setzt, der gerade aus dem Urlaub gekommen ist." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '### Git Describe', + '', + 'Weil Tags so super als "Anker" im Repository dienen können bietet Git einen Befehl um zu *beschreiben* wo du dich relativ zum nächsten "Anker" (also Tag) befindest. Und der heißt `git describe`.', + '', + 'Er hilft dir dabei, dir einen Überblick zu verschaffen nachdem du viele Commits im Log zurück- oder vorgegangen bist; das kann vorkommen nachdem du ein `git bisect` (eine Fehlersuche) abgeschlossen hast oder wenn du dich an den Rechner eines Kollegen setzt, der gerade aus dem Urlaub gekommen ist.' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Der Befehl ist folgendermaßen aufgebaut:", - "", - "`git describe `", - "", - "Dabei ist `` jeder beliebige Name, der einem Commit zugeordnet ist (Branch, Tag etc). Wenn du keinen angibst benutzt Git `HEAD`, also den aktuellen Checkout.", - "", - "Die Befehlsausgabe sieht so aus:", - "", - "`__g`", - "", - "`` ist dabei der nächstliegende Tag in den Vorgänger-Commits, `` zeigt an, wieviele Commits dieses Tag entfernt ist und `` ist das SHA des Commits, auf den HEAD zeigt.", - "", - "**Achtung**: `` und `` erscheint nur, wenn HEAD nicht auf ein Tag zeigt. `git describe` verarbeitet standardmässig nur annotierte Tags. Um nicht annotierte tags zu sehen, verwende bitte`git describe --tags`." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Der Befehl ist folgendermaßen aufgebaut:', + '', + '`git describe `', + '', + 'Dabei ist `` jeder beliebige Name, der einem Commit zugeordnet ist (Branch, Tag etc). Wenn du keinen angibst benutzt Git `HEAD`, also den aktuellen Checkout.', + '', + 'Die Befehlsausgabe sieht so aus:', + '', + '`__g`', + '', + '`` ist dabei der nächstliegende Tag in den Vorgänger-Commits, `` zeigt an, wieviele Commits dieses Tag entfernt ist und `` ist das SHA des Commits, auf den HEAD zeigt.', + '', + '**Achtung**: `` und `` erscheint nur, wenn HEAD nicht auf ein Tag zeigt. `git describe` verarbeitet standardmässig nur annotierte Tags. Um nicht annotierte tags zu sehen, verwende bitte`git describe --tags`.' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "Schauen wir uns das schnell an einem Beispiel an. Für den folgenden Baum:" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + 'Schauen wir uns das schnell an einem Beispiel an. Für den folgenden Baum:' ], - "afterMarkdowns": [ - "Der Befehl `git describe master` würde folgendes ausgeben:", - "", - "`v1_2_gC2`", - "", - "Wohingegen `git describe side` dies ausgeben würde:", - "", - "`v2_1_gC4`" + 'afterMarkdowns': [ + 'Der Befehl `git describe master` würde folgendes ausgeben:', + '', + '`v1_2_gC2`', + '', + 'Wohingegen `git describe side` dies ausgeben würde:', + '', + '`v2_1_gC4`' ], - "command": "git tag v2 C3", - "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" + 'command': 'git tag v2 C3', + 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Das ist so ziemlich alles, was es über `git describe` zu wissen gibt. Versuch ein paar Orte in diesem Level damit auszugeben, um ein Gefühl dafür zu bekommen.", - "", - "Sobald du fertig bist, mach einfach einen Commit um den Level abzuschließen. Der geht auf's Haus. :P" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Das ist so ziemlich alles, was es über `git describe` zu wissen gibt. Versuch ein paar Orte in diesem Level damit auszugeben, um ein Gefühl dafür zu bekommen.', + '', + 'Sobald du fertig bist, mach einfach einen Commit um den Level abzuschließen. Der geht auf\'s Haus. :P' ] } } ] }, - "ja": { - "childViews": [ + 'ja': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "### Git Describe", - "", - "タグは、ソースリストの優秀な「アンカー(標識)」として作用するので、Gitには最も近く関係のある「アンカー」(タグの別名)を*記述するため*のコマンドがあります。そして、そのコマンドは`git describe`と呼ばれています!", - "", - "Gitの`describe`は、あなたが大量のコミットの中を移動するとき、今どこにいるかを知るのを助けてくれます(このような状況は、例えばあなたがデバッグ検索コマンドの一つ`git bisect`を走らせ終わった後や、同僚が休暇から帰ってきて自分の席に座るときに起こります)。" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '### Git Describe', + '', + 'タグは、ソースリストの優秀な「アンカー(標識)」として作用するので、Gitには最も近く関係のある「アンカー」(タグの別名)を*記述するため*のコマンドがあります。そして、そのコマンドは`git describe`と呼ばれています!', + '', + 'Gitの`describe`は、あなたが大量のコミットの中を移動するとき、今どこにいるかを知るのを助けてくれます(このような状況は、例えばあなたがデバッグ検索コマンドの一つ`git bisect`を走らせ終わった後や、同僚が休暇から帰ってきて自分の席に座るときに起こります)。' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Gitの`describe`は、以下の形式をとります:", - "", - "`git describe <参照>`", - "", - "`<参照>`には、Gitが解釈可能なコミットの参照表現(ブランチやタグの指定、コミットハッシュなど)をいれます。もし、何も入力しなかった場合、Gitは現在の位置のコミット(`HEAD`)を使います。", - "", - "コマンドの結果は以下のようになります:", - "", - "`<タグ>_<コミット数>_g<ハッシュ>`", - "", - "`<タグ>`には履歴の一番最新のタグ名が、`<コミット数>`にはそのタグから幾つのコミットがあったか、`<ハッシュ>`はそのコミットのハッシュがそれぞれ入ります。" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Gitの`describe`は、以下の形式をとります:', + '', + '`git describe <参照>`', + '', + '`<参照>`には、Gitが解釈可能なコミットの参照表現(ブランチやタグの指定、コミットハッシュなど)をいれます。もし、何も入力しなかった場合、Gitは現在の位置のコミット(`HEAD`)を使います。', + '', + 'コマンドの結果は以下のようになります:', + '', + '`<タグ>_<コミット数>_g<ハッシュ>`', + '', + '`<タグ>`には履歴の一番最新のタグ名が、`<コミット数>`にはそのタグから幾つのコミットがあったか、`<ハッシュ>`はそのコミットのハッシュがそれぞれ入ります。' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "軽い例を見てみましょう。この木においての例は以下のようになります:" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '軽い例を見てみましょう。この木においての例は以下のようになります:' ], - "afterMarkdowns": [ - "コマンド`git describe master`の結果は以下のようになります:", - "", - "`v1_2_gC2`", - "", - "さらに`git describe side`の結果は以下のようになります:", - "", - "`v2_1_gC4`" + 'afterMarkdowns': [ + 'コマンド`git describe master`の結果は以下のようになります:', + '', + '`v1_2_gC2`', + '', + 'さらに`git describe side`の結果は以下のようになります:', + '', + '`v2_1_gC4`' ], - "command": "git tag v2 C3", - "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" + 'command': 'git tag v2 C3', + 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "`describe`によってGitの情報が簡潔に全て記述されます!このレベルでは、このコマンドの感触をつかむため幾つかの場所で`describe`をしてみてください。", - "", - "終わったら、最新のコミットに行き一度コミットを行えばこのレベルを終了することができます。この先では、いくつかの挑戦課題を用意しています :P" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '`describe`によってGitの情報が簡潔に全て記述されます!このレベルでは、このコマンドの感触をつかむため幾つかの場所で`describe`をしてみてください。', + '', + '終わったら、最新のコミットに行き一度コミットを行えばこのレベルを終了することができます。この先では、いくつかの挑戦課題を用意しています :P' ] } } ] }, - "ru_RU": { - "childViews": [ + 'ru_RU': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "### Git Describe", - "", - "Теги являются прекрасными ориентирами в истории изменений, поэтому в git есть команда, которая показывает, как далеко текущее состоянии от ближайшего тега. И эта команда называется `git describe`", - "", - "Git describe помогает сориентироваться после отката на много коммитов по истории изменений. Такое может случиться, когда вы сделали `git bisect` или если вы недавно вернулись из отпуска =)" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '### Git Describe', + '', + 'Теги являются прекрасными ориентирами в истории изменений, поэтому в git есть команда, которая показывает, как далеко текущее состоянии от ближайшего тега. И эта команда называется `git describe`', + '', + 'Git describe помогает сориентироваться после отката на много коммитов по истории изменений. Такое может случиться, когда вы сделали `git bisect` или если вы недавно вернулись из отпуска =)' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Git describe выглядит примерно так:", - "", - "`git describe `", - "", - "Где `ref` — это что-либо, что указывает на конкретный коммит. Если не указать `ref`, то git будет считать, что указано текущее положение (`HEAD`).", - "", - "Вывод команды выглядит примерно так:", - "", - "`__g`", - "", - "Где `tag` – это ближайший тег в истории изменений, `numCommits` – это на сколько далеко мы от этого тега, а `hash` – это хеш коммита, который описывается." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Git describe выглядит примерно так:', + '', + '`git describe `', + '', + 'Где `ref` — это что-либо, что указывает на конкретный коммит. Если не указать `ref`, то git будет считать, что указано текущее положение (`HEAD`).', + '', + 'Вывод команды выглядит примерно так:', + '', + '`__g`', + '', + 'Где `tag` – это ближайший тег в истории изменений, `numCommits` – это на сколько далеко мы от этого тега, а `hash` – это хеш коммита, который описывается.' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "Посмотрим на простой пример. Для дерева, показанного ниже:" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + 'Посмотрим на простой пример. Для дерева, показанного ниже:' ], - "afterMarkdowns": [ - "Команда `git describe master` выведет:", - "", - "`v1_2_gC2`", - "", - "Тогда как `git describe side` выведет:", - "", - "`v2_1_gC4`" + 'afterMarkdowns': [ + 'Команда `git describe master` выведет:', + '', + '`v1_2_gC2`', + '', + 'Тогда как `git describe side` выведет:', + '', + '`v2_1_gC4`' ], - "command": "git tag v2 C3", - "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" + 'command': 'git tag v2 C3', + 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Это, в общем-то, всё, что можно сказать про `git describe`. Попробуй выполнить команду на нескольких коммитах.", - "", - "Как только наиграешься, просто сделай один коммит, и уровень будет пройден." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Это, в общем-то, всё, что можно сказать про `git describe`. Попробуй выполнить команду на нескольких коммитах.', + '', + 'Как только наиграешься, просто сделай один коммит, и уровень будет пройден.' ] } } ] }, - "ko": { - "childViews": [ + 'ko': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "### Git Describe", - "", - "커밋 트리에서 태그가 훌륭한 \"닻\"역할을 하기 때문에, git에는 여러분이 가장 가까운 \"닻(태그)\"에 비해 상대적으로 어디에 위치해있는지 *describe(묘사)*해주는 명령어가 있습니다. 이 명령어는 `git describe` 입니다!", - "", - "Git describe는 커밋 히스토리에서 앞 뒤로 여러 커밋을 이동하고 나서 커밋 트리에서 방향감각을 다시 찾는데 도움을 줍니다; 이런 상황은 git bisect(문제가 되는 커밋을 찾는 명령어라고 간단히 생각하자)를 하고 나서라던가 휴가를 다녀온 동료의 컴퓨터에 앉는경우가 있습니다." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '### Git Describe', + '', + '커밋 트리에서 태그가 훌륭한 "닻"역할을 하기 때문에, git에는 여러분이 가장 가까운 "닻(태그)"에 비해 상대적으로 어디에 위치해있는지 *describe(묘사)*해주는 명령어가 있습니다. 이 명령어는 `git describe` 입니다!', + '', + 'Git describe는 커밋 히스토리에서 앞 뒤로 여러 커밋을 이동하고 나서 커밋 트리에서 방향감각을 다시 찾는데 도움을 줍니다; 이런 상황은 git bisect(문제가 되는 커밋을 찾는 명령어라고 간단히 생각하자)를 하고 나서라던가 휴가를 다녀온 동료의 컴퓨터에 앉는경우가 있습니다.' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Git describe 는 다음의 형태를 가지고 있습니다:", - "", - "`git describe `", - "", - "``에는 commit을 의미하는 그 어떤것이던 쓸 수 있습니다. 만약 ref를 특정 지어주지 않으면, git은 그냥 지금 체크아웃된곳을 사용합니다 (`HEAD`).", - "", - "명령어의 출력은 다음과 같은 형태로 나타납니다:", - "", - "`__g`", - "", - "`tag`는 가장 가까운 부모 태그를 나타냅니다. `numCommits`은 그 태그가 몇 커밋 멀리있는지를 나타냅니다. ``는 묘사하고있는 커밋의 해시를 나타냅니다." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Git describe 는 다음의 형태를 가지고 있습니다:', + '', + '`git describe `', + '', + '``에는 commit을 의미하는 그 어떤것이던 쓸 수 있습니다. 만약 ref를 특정 지어주지 않으면, git은 그냥 지금 체크아웃된곳을 사용합니다 (`HEAD`).', + '', + '명령어의 출력은 다음과 같은 형태로 나타납니다:', + '', + '`__g`', + '', + '`tag`는 가장 가까운 부모 태그를 나타냅니다. `numCommits`은 그 태그가 몇 커밋 멀리있는지를 나타냅니다. ``는 묘사하고있는 커밋의 해시를 나타냅니다.' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "간단한 예제를 확인해 봅시다. 아래의 트리에서:" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '간단한 예제를 확인해 봅시다. 아래의 트리에서:' ], - "afterMarkdowns": [ - "`git describe master` 명령은 다음을 출력합니다:", - "", - "`v1_2_gC2`", - "", - "`git describe side`는 다음을 출력합니다:", - "", - "`v2_1_gC4`" + 'afterMarkdowns': [ + '`git describe master` 명령은 다음을 출력합니다:', + '', + '`v1_2_gC2`', + '', + '`git describe side`는 다음을 출력합니다:', + '', + '`v2_1_gC4`' ], - "command": "git tag v2 C3", - "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" + 'command': 'git tag v2 C3', + 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "이정도면 git describe를 충분히 활용할 수 있습니다! 이 레벨의 몇 지점을 describe 명령어를 통해 확인해보면서 느낌을 익혀 봅시다.", - "", - "준비가 되면 커밋을 한번해서 레벨을 종료하세요. 자유롭게 연습해보세요 :P" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '이정도면 git describe를 충분히 활용할 수 있습니다! 이 레벨의 몇 지점을 describe 명령어를 통해 확인해보면서 느낌을 익혀 봅시다.', + '', + '준비가 되면 커밋을 한번해서 레벨을 종료하세요. 자유롭게 연습해보세요 :P' ] } } ] }, - "uk": { - "childViews": [ + 'uk': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "### Git Describe", - "", - "Через те, що таги є такими чудовими \"орієнтирами\" по коду, git також має команду *описати* (describe) де ти є відносно найближчого \"орієнтира\" (тобто тага). І ця команда називається `git describe`!", - "", - "Git describe допоможе тобі знайти себе після того як ти перестрибнеш на кілька комітів по історії вперед чи назад; це може статися після того як ти закінчив git bisect (пошук-дебаггер) чи коли тебе попросили підійти до колеги, котрий щойно прийшов з відпустки." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '### Git Describe', + '', + 'Через те, що таги є такими чудовими "орієнтирами" по коду, git також має команду *описати* (describe) де ти є відносно найближчого "орієнтира" (тобто тага). І ця команда називається `git describe`!', + '', + 'Git describe допоможе тобі знайти себе після того як ти перестрибнеш на кілька комітів по історії вперед чи назад; це може статися після того як ти закінчив git bisect (пошук-дебаггер) чи коли тебе попросили підійти до колеги, котрий щойно прийшов з відпустки.' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Git describe має наступну форму:", - "", - "`git describe <посилання>`", - "", - "Де `<посилання>` -- це будь-що, що вказує на конкретний коміт. Якщо ти не вкажеш посилання, git використає поточну локацію (`HEAD`).", - "", - "Вивід команди виглядає як:", - "", - "`<таг>_<к-ть комітів>_g<хеш>`", - "", - "де `таг` -- це найближчий попередній таг з історії; `к-ть комітів` -- це наскільки далеко цей таг в історії, а `<хеш>` -- це хеш коміту, який описується." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Git describe має наступну форму:', + '', + '`git describe <посилання>`', + '', + 'Де `<посилання>` -- це будь-що, що вказує на конкретний коміт. Якщо ти не вкажеш посилання, git використає поточну локацію (`HEAD`).', + '', + 'Вивід команди виглядає як:', + '', + '`<таг>_<к-ть комітів>_g<хеш>`', + '', + 'де `таг` -- це найближчий попередній таг з історії; `к-ть комітів` -- це наскільки далеко цей таг в історії, а `<хеш>` -- це хеш коміту, який описується.' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "Розгляньмо короткий приклад. Для дерева нижче:" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + 'Розгляньмо короткий приклад. Для дерева нижче:' ], - "afterMarkdowns": [ - "Команда `git describe master` виведе:", - "", - "`v1_2_gC2`", - "", - "коли `git describe side` виведе:", - "", - "`v2_1_gC4`" + 'afterMarkdowns': [ + 'Команда `git describe master` виведе:', + '', + '`v1_2_gC2`', + '', + 'коли `git describe side` виведе:', + '', + '`v2_1_gC4`' ], - "command": "git tag v2 C3", - "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" + 'command': 'git tag v2 C3', + 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Ось і все що ти маєш знати про git describe. Спробуй виконати describe для різних місць в дереві комітів щоб набити руку.", - "", - "Як будеш готовий, просто закоміть щось щоб закінчити цей рівень. Трохи шари :P" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Ось і все що ти маєш знати про git describe. Спробуй виконати describe для різних місць в дереві комітів щоб набити руку.', + '', + 'Як будеш готовий, просто закоміть щось щоб закінчити цей рівень. Трохи шари :P' + ] + } + } + ] + }, + 'vi': { + 'childViews': [ + { + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '### Mô tả của Git', + '', + 'Bởi gì thẻ đóng vai trò như là "mỏ neo" trên cây lịch sử rất tốt rồi, git cũng có lệnh để *mô tả* tương quan của bạn dến vị trí "mỏ neo" (thẻ) gần nhất. Và đó là `git describe`!', + '', + '`git descripe` có thể giúp bạn định hướng sau khi dịch chuyển qua lại nhiều lần trên cây lịch sử; đặc biệt là sau khi sử dụng `git bisect` (công cụ tìm kiếm lỗi của git) hoặc khi sử dụng máy của đồng nghiệp mới đi nghỉ mát về.' + ] + } + }, + { + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Cú pháp sử dụng Git describe như sau:', + '', + '`git describe `', + '', + 'Trong đó `` là bất kỳ thứ gì mà git có thể dùng để xác định commit. Nếu bạn không chỉ định tham chiếu, git sẽ dùng vị trí hiện tại của bạn (`HEAD`).', + '', + 'Đầu ra của câu lệnh sẽ như sau:', + '', + '`__g`', + '', + 'Trong đó `` là thẻ tổ tiên gần nhất, `` là số lượng commit tính từ tham chiếu đến thẻ, và `` là mã băm của commit được mô tả.' + ] + } + }, + { + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + 'Cùng xem nhanh một ví dụ trên cây lịch sử phía dưới:' + ], + 'afterMarkdowns': [ + 'Câu lệnh `git describe master` sẽ cho kết quả:', + '', + '`v1_2_gC2`', + '', + 'Trong khi `git describe side` sẽ cho kết quả:', + '', + '`v2_1_gC4`' + ], + 'command': 'git tag v2 C3', + 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' + } + }, + { + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Từng đó thông tin là khá đủ về git describe! Hãy thử dùng `git describe` trên vài vị trí để hiểu về lệnh này.', + '', + 'Một khi bạn đã sẵn sàng thì chỉ cần commit 1 lần là qua bài này. Bài này dễ chơi rồi nhé :P' ] } } diff --git a/src/levels/mixed/grabbingOneCommit.js b/src/levels/mixed/grabbingOneCommit.js index 42e748d3..5ad92542 100644 --- a/src/levels/mixed/grabbingOneCommit.js +++ b/src/levels/mixed/grabbingOneCommit.js @@ -25,7 +25,8 @@ exports.level = { "zh_CN": "只取一个提交记录", "zh_TW": "只取一個 commit", "ru_RU": "Выберем один коммит.", - "uk": "Вибираємо всього один коміт" + "uk": "Вибираємо всього один коміт", + "vi": "Chỉ lấy 1 commit" }, "hint": { "en_US": "Remember, interactive rebase or cherry-pick is your friend here", @@ -39,7 +40,8 @@ exports.level = { "zh_CN": "你有两个朋友,cherry-pick 和 rebase -i", "zh_TW": "記住,使用互動式的 rebase 或者 cherry-pick 會很有幫助", "ru_RU": "Не забывай, что интерактивный rebase и cherry-pick – это твои друзья!", - "uk": "Не забувай, що інтерактивний rebase та cherry-pick -- це твої друзі!" + "uk": "Не забувай, що інтерактивний rebase та cherry-pick -- це твої друзі!", + "vi": "Hãy nhớ 2 anh bạn tương tác rebase và cherry-pick!" }, "startDialog": { "en_US": { @@ -509,6 +511,45 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Commit xếp chồng tại địa phương", + "", + "Có tình huống thế này thường hay xảy ra trong quá trình phát triển: Tôi dang cố dò lỗi nhưng mà nó lại khá là trúc trắc. Để hỗ trợ cho việc này, thêm vào vài dòng lệnh gỡ lỗi và lệnh in.", + "", + "Mấy lệnh gỡ lỗi và in này nằm yên trong commit của chúng. Cuối cùng thì tôi cũng tìm ra lỗi, gỡ xong, ngon rồi!", + "", + "Bây giờ thì lại phải đưa `bugFix` trở về nhánh `master`. Nếu mà đơn giản dùng fast-forwarded lên `master`, thì `master` lại có tất cả các lệnh gỡ lỗi kia(chẳng muốn chút nào). Phải có cách khác chứ nhỉ..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ta cần phải bảo git chỉ sao chép 1 commit thôi. Điều này giống với cấp độ trước về điều chỉnh vị trí -- ta có thể dùng các câu lệnh tương tự:", + "", + "* `git rebase -i`", + "* `git cherry-pick`", + "", + "Để đạt được mục tiêu này." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Bây giờ là cấp độ cao hơn rồi nên bạn hãy tự quyết định nên dùng câu lệnh nào, nhưng để hoàn thành được cấp độ, hãy đàm bảo rằng `master` nhận được commit mà `bugFix` tham chiếu tới." + ] + } + } + ] } } }; diff --git a/src/levels/mixed/jugglingCommits.js b/src/levels/mixed/jugglingCommits.js index 747a518e..d430db0f 100644 --- a/src/levels/mixed/jugglingCommits.js +++ b/src/levels/mixed/jugglingCommits.js @@ -29,7 +29,8 @@ exports.level = { "zh_CN": "提交的技巧 #1", "zh_TW": "commit 的戲法", "ru_RU": "Жонглируем коммитами", - "uk": "Жонглюємо комітами" + "uk": "Жонглюємо комітами", + "vi": "Tung hứng commit" }, "hint": { "en_US": "The first command is git rebase -i HEAD~2", @@ -43,7 +44,8 @@ exports.level = { "zh_CN": "第一个命令是 `git rebase -i HEAD~2`", "zh_TW": "第一個命令是 'git rebase -i HEAD~2'", "ru_RU": "Первой командой должна быть git rebase -i HEAD~2", - "uk": "Перша команда має бути git rebase -i HEAD~2" + "uk": "Перша команда має бути git rebase -i HEAD~2", + "vi": "Lệnh đầu tiên là git rebase -i HEAD~2" }, "startDialog": { "en_US": { @@ -456,6 +458,40 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Tung hứng Commit", + "", + "Có một tình huống xảy ra khá thường xuyên. Bạn có vài thay đổi trên (`newImage`) và một vài thay đổi khác trên (`caption`) và chúng lại liên quan đến nhau, nên chúng nằm chồng lên nhau trong kho của bạn (một lại nối một).", + "", + "Tréo ngoe là bạn lại phải điều chỉnh một chút ở commit trước. Giả sử như tay thiết kết muốn ta đổi chiều của `newImage` một chút, mặc dù commit ấy đã xưa lắm rồi!!" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Để khắc phục khó khăn này ta có thể làm như sau:", + "", + "* Ta sẽ dùng `git rebase -i` sắp xếp lại commit để cái ta cần sửa sẽ nằm trên cùng", + "* Ta sẽ dùng `commit --amend` tạo ra một điều chỉnh nhỏ", + "* Sau đó ta sẽ lại sắp xếp lại commit như trước bằng cách dùng `git rebase -i`", + "* Cuối cùng, ta sẽ chuyển `master` tới phần đã cập nhật để hoàn thành cấp độ (dùng cách nào tùy bạn)", + "", + "Có nhiều cách để hoàn thành mục tiêu (Tôi thấy bạn hấp háy sang cherry-pick rồi đấy), rồi ta sẽ thấy chúng nhiều hơn, nhưng giờ hãy cứ tập trung vào kỹ thuật này đã.", + "Sau cùng thì, để ý các dấu nháy đơn(') chứ?-- vì ta đã chuyển commit 2 lần, nên chúng có thêm một dấu nháy đơn. Và một dấu nữa cho commit mà ta đã sửa đổi, thế là ta có trạng thái cuối cùng của cây lịch sử ", + "", + "Nói cách khác, khi tôi so sánh kết quả, tôi chỉ so sánh cấu trúc của cây lịch sử. Sự khác biệt về số lượng `'` không được bao gồm trong so sánh. Miễn là cấu trúc nhánh `master` của bạn giống với cấu trúc đích, tôi sẽ vẫn để bạn qua bài." + ] + } + } + ] } } }; diff --git a/src/levels/mixed/jugglingCommits2.js b/src/levels/mixed/jugglingCommits2.js index 29a97a31..9cd9670e 100644 --- a/src/levels/mixed/jugglingCommits2.js +++ b/src/levels/mixed/jugglingCommits2.js @@ -28,7 +28,8 @@ exports.level = { "zh_CN": "提交的技巧 #2", "zh_TW": "commit 的戲法 #2", "ru_RU": "Жонглируем коммитами №2", - "uk": "Жонглюємо комітами #2" + "uk": "Жонглюємо комітами #2", + "vi": "Tung hứng commit #2" }, "hint": { "en_US": "Don't forget to forward master to the updated changes!", @@ -42,7 +43,8 @@ exports.level = { "zh_CN": "别忘记了将 master 快进到最新的更新上!", "zh_TW": "別忘記了將 master 推到最新的 commit 上面!", "ru_RU": "Не забудь переместить master на последние изменения.", - "uk": "Не забудь перемістити master на останні зміни!" + "uk": "Не забудь перемістити master на останні зміни!", + "vi": "Đừng quên đẩy nhánh master lên cập nhật mới nhất!" }, "startDialog": { "en_US": { @@ -554,6 +556,49 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Tung hứng Commit #2", + "", + "*Nếu bạn vẫn chưa hoàn thành Tung hứng Commit #1 (cấp độ trước), hãy làm nó trước khi tiếp tục*", + "", + "Như bạn đã thấy ở cấp độ trước, ta dùng `rebase -i` để sắp xếp lại các commit. Một khi commit mà ta muốn sửa đã ở trên cùng, ta có thể dễ dàng --chỉnh sửa(amend) nó và sau đó sắp xếp lại trật tự lúc trước.", + "", + "Nhưng mà vẫn tồn tại vấn đề khi mà ta sắp xếp quá nhiều, điều này có thể dẫn đến xung đột khi rebase. Thử dùng cách khác với `git cherry-pick` nào" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Hãy nhớ rằng cherry-pick sẽ thả commit ở bất cứ đâu xuống dưới HEAD (miễn là nó không phải cha ông hay tổ tiên gì của HEAD).", + "", + "Hãy xem thử minh họa nhỏ sau:" + ], + "afterMarkdowns": [ + "Hay! Tiếp tục nào" + ], + "command": "git cherry-pick C2", + "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Vậy thì ở cấp độ này, hãy làm hoàn thành mục tiêu tương tự là chỉnh sửa `C2` một lần nhưng hãy tránh dùng `rebase -i`. Tự tìm cách đi nhé! :D", + "", + "Nhớ rằng, số lượng dấu nháy dơn (') trên commit không quan trọng, quan trọng là mối tương liên các tham chiếu. Nói cách khác, kể cả bất cứ commit nào của bạn có thêm một đấu(') tôi vẫn công nhận đáp án của bạn" + ] + } + } + ] } } }; diff --git a/src/levels/mixed/tags.js b/src/levels/mixed/tags.js index 511d62f0..23b28b77 100644 --- a/src/levels/mixed/tags.js +++ b/src/levels/mixed/tags.js @@ -14,7 +14,8 @@ exports.level = { "zh_TW": "git tag", "ru_RU": "git tag", "ko" : "Git 태그", - "uk" : "Git Tags" + "uk" : "Git Tags", + "vi" : "Tag trong Git" }, "hint": { "en_US": "you can either check out the commit directly or simply checkout the tag!", @@ -28,7 +29,8 @@ exports.level = { "zh_CN": "你可以直接 checkout 到 commit 上,或是简单地 checkout 到 tag 上", "ru_RU": "Можно сделать checkout напрямую на коммит или же на тег", "ko" : "커밋을 직접 또는 태그를 이용해서 체크아웃할수 있습니다!", - "uk" : "ти можеш або зробити checkout коміта напряму чи просто зачекаутити таг!" + "uk" : "ти можеш або зробити checkout коміта напряму чи просто зачекаутити таг!", + "vi" : "Bạn có thể chuyển trực tiếp sang commit hoặc đơn giản là chuyển sang tag!" }, "startDialog": { "en_US": { @@ -654,6 +656,58 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Tag trong Git", + "", + "Qua các bài học trước, bạn đã biết được rằng rất dễ dàng để di chuyển qua lại giữa các nhánh và chúng thường tham chiếu đến các commit khác nhau trong quá trình ta làm việc trên chúng. Nhánh thường dễ biết đổi, thường chỉ là tạm thời và chúng luôn như vậy.", + "", + "Nếu như vậy thì bạn có thể sẽ thắc mắc liệu có cách nào để đánh dấu *vĩnh viễn* một thời điểm nào đó trong lịch sử làm việc không? Khi mà dự án càng ngày càng mở rộng và merge thì diễn ra liên tục, vậy thì có cách nào để đánh dấu những commit đó một cách cố định hơn nhánh không?", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Tất nhiên là có chứ! Git có các tag(thẻ) để hỗ trợ vấn đề này -- chúng (bằng cách nào đó) đánh dấu vĩnh viễn một commit cụ thể nào đó như một \"cột mốc\" mà sau đó bạn có thể tham chiếu đến như với nhánh.", + "", + "Quan trọng hơn là, khi ta commit thì chúng không hề bị di chuyển. Bạn không thể \"check out\" một tag rồi làm việc trên đó -- tag giống như là mỏ neo để chỉ định một điểm cụ thể nào dó trên cây lịch sử.", + "", + "Cùng xem tag thực tế là như thế nào nào." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Hãy thử tạo một thẻ ở commit `C1` chỉ định rằng đây là phiên bản thứ nhất của ta" + ], + "afterMarkdowns": [ + "Đó! Đơn giản như đan rổ. Ta tạo ra thẻ `v1` và tham chiếu đến commit `C1`. Nếu bạn không chỉ định commit, git sẽ gắn thẻ vào commit mà `HEAD` đang trỏ tới" + ], + "command": "git tag v1 C1", + "beforeCommand": "git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Trong cấp độ này hãy tạo ra một thẻ tại vị trí chỉ định và chuyển sang `v1`. Để ý rằng bạn sẽ chuyến sang trạng thái tách biệt `HEAD` -- bởi vì bạn không thể tham chiếu đến thẻ `v1`.", + "", + "Sang cấp độ tới ta sẽ xem xét một vài cách hay ho để dùng thẻ." + ] + } + } + ] } } }; diff --git a/src/levels/rampup/cherryPick.js b/src/levels/rampup/cherryPick.js index 41f1bad7..23026ff0 100644 --- a/src/levels/rampup/cherryPick.js +++ b/src/levels/rampup/cherryPick.js @@ -18,7 +18,8 @@ exports.level = { "zh_TW": "介紹 cherry-pick", "ru_RU": "Введение в Cherry-pick", "ko" : "Cherry-pick 소개", - "uk": "Знайомство з cherry-pick" + "uk": "Знайомство з cherry-pick", + "vi" : "Giới thiệu về cherry-pick" }, "hint": { "fr_FR": "git cherry-pick suivi par les noms de commits", @@ -32,7 +33,8 @@ exports.level = { "zh_TW": "git cherry-pick 後面要接著 commit 的名稱", "ru_RU": "git cherry-pick основывается на именах коммитов!", "ko" : "커밋의 이름들로 git cherry-pick 하세요!", - "uk": "git cherry-pick базується на іменах комітів!" + "uk": "git cherry-pick базується на іменах комітів!", + "vi" : "git cherry-pick sau đó là tên commit!" }, "startDialog": { "en_US": { @@ -717,6 +719,63 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Mang đi kéo về", + "", + "Cho đến giờ thì ta đã nắm được cơ bản về git -- commit, rẽ nhánh, và dịch chuyển qua lại trên cây mã nguồn. Chừng ấy khái niệm là đã đủ để tác động đến 90% sức mạnh của kho chứa git và các chức nawmg cần thiết cho nhà phát triển phần mềm.", + "", + "Tuy nhiên 10% còn lại thì lại khá hữu ích trong các quy trình làm việc phức tạp (hoặc khi bạn vướng phải tình huống khó khăn). The next concept we're going to cover is \"chỉnh lý các bản ghi\" -- đó là cách để nhà phát triển nói rằng\"Tôi muốn lấy bản ghi ở đây và cả bản ghi ở đó\" một cách chính xác, linh hoạt và sống động.", + "", + "Nghe thì có vẻ phức tạp, nhưng thực ra khái niệm này khá đơn giản." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Cherry-pick", + "", + "Lệnh đầu tiên của loạt bài này là `git cherry-pick`, dạng lệnh là::", + "", + "* `git cherry-pick <...>`", + "", + "Đó là cách rất trực tiếp để copy một loạt commit xuống dưới vị trí hiện tại của bạn (`HEAD`). Cá nhân tôi thì rất thích `cherry-pick` bởi tính tiện dụng và dễ hiểu của nó.", + "", + "Hãy xem qua một ví dụ!", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Ở đây ta có một kho chứa mà ta muốn sao chép thành quả công việc từ nhánh `side` sang nhánh `master`. Có thể dùng rebase để làm việc này (kỹ thuật mà ta đã học), nhưng hãy xem thử cherry-pick làm điều này ra sao." + ], + "afterMarkdowns": [ + "Thế thôi! Chúng ta chỉ cần các commit `C2` và` C4`, vì vậy Git sẽ lấy chúng và đặt chúng dưới nhánh hiện tại. Thật đơn giản!" + ], + "command": "git cherry-pick C2 C4", + "beforeCommand": "git checkout -b side; git commit; git commit; git commit; git checkout master; git commit;" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Để hoàn thành cấp độ này, hãy copy thành quả công việc từ 3 nhánh khác vào master. Bạn có thể nhìn vào mô tả mục tiêu để biết chúng ta cần những commit nào.", + "" + ] + } + } + ] } } }; diff --git a/src/levels/rampup/detachedHead.js b/src/levels/rampup/detachedHead.js index 14c30287..ecfdd436 100644 --- a/src/levels/rampup/detachedHead.js +++ b/src/levels/rampup/detachedHead.js @@ -1,963 +1,1043 @@ exports.level = { - "goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\"},\"bugFix\":{\"target\":\"C4\",\"id\":\"bugFix\"}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"}},\"HEAD\":{\"target\":\"C4\",\"id\":\"HEAD\"}}", - "solutionCommand": "git checkout C4", - "startTree": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\"},\"bugFix\":{\"target\":\"C4\",\"id\":\"bugFix\"}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}", - "name": { - "en_US": "Detach yo' HEAD", - "es_AR": "Desatacheá tu HEAD", - "pt_BR": "Solte a sua cabeça", - "gl" : "Abandona o teu HEAD", - "fr_FR": "Détacher votre HEAD", - "zh_CN": "分离 HEAD", - "zh_TW": "分離 HEAD", - "de_DE": "Den Kopf abtrennen", - "ja" : "HEADの分離", - "ru_RU": "Теряем голову, или detached HEAD", - "ko" : "HEAD 분리하기", - "uk": "Втрачаємо голову чи detached HEAD" + 'goalTreeString': '{"branches":{"master":{"target":"C2","id":"master"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"C4","id":"HEAD"}}', + 'solutionCommand': 'git checkout C4', + 'startTree': '{"branches":{"master":{"target":"C2","id":"master"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"bugFix","id":"HEAD"}}', + 'name': { + 'en_US': 'Detach yo\' HEAD', + 'es_AR': 'Desatacheá tu HEAD', + 'pt_BR': 'Solte a sua cabeça', + 'gl': 'Abandona o teu HEAD', + 'fr_FR': 'Détacher votre HEAD', + 'zh_CN': '分离 HEAD', + 'zh_TW': '分離 HEAD', + 'de_DE': 'Den Kopf abtrennen', + 'ja': 'HEADの分離', + 'ru_RU': 'Теряем голову, или detached HEAD', + 'ko': 'HEAD 분리하기', + 'uk': 'Втрачаємо голову чи detached HEAD', + 'vi': 'Tháo đầu cái nào' }, - "hint": { - "en_US": "Use the label (hash) on the commit for help!", - "es_AR": "¡Usá la etiqueta (hash) sobre el commit para ayudarte!", - "pt_BR": "Use o identificador (hash) sobre o commit para te ajudar!", - "gl" : "¡Usa a etiqueta (hash) sobre o commit para axudarte!", - "de_DE": "Benutze den Bezeichner (den Hash) des Commits.", - "ja" : "コミットのラベル(hash)を使用", - "fr_FR": "Utilisez le label (identifiant) du commit pour aider !", - "zh_TW": "使用 commit 上的標籤(hash)來幫助你!", - "zh_CN": "使用提交记录上的标签(哈希值)来指定提交记录!", - "ru_RU": "Ориентируйся по идентификаторам (hash) коммитов.", - "ko" : "커밋에 있는 라벨(hash)을 활용하세요!", - "uk": "Орієнтуйся по індентифікаторам (hash) комітів." + 'hint': { + 'en_US': 'Use the label (hash) on the commit for help!', + 'es_AR': '¡Usá la etiqueta (hash) sobre el commit para ayudarte!', + 'pt_BR': 'Use o identificador (hash) sobre o commit para te ajudar!', + 'gl': '¡Usa a etiqueta (hash) sobre o commit para axudarte!', + 'de_DE': 'Benutze den Bezeichner (den Hash) des Commits.', + 'ja': 'コミットのラベル(hash)を使用', + 'fr_FR': 'Utilisez le label (identifiant) du commit pour aider !', + 'zh_TW': '使用 commit 上的標籤(hash)來幫助你!', + 'zh_CN': '使用提交记录上的标签(哈希值)来指定提交记录!', + 'ru_RU': 'Ориентируйся по идентификаторам (hash) коммитов.', + 'ko': '커밋에 있는 라벨(hash)을 활용하세요!', + 'uk': 'Орієнтуйся по індентифікаторам (hash) комітів.', + 'vi': 'Dùng mã băm (hash) của commit để hoàn thành!' }, - "startDialog": { - "en_US": { - "childViews": [ + 'startDialog': { + 'en_US': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## Moving around in Git", - "", - "Before we get to some of the more advanced features of Git, it's important to understand different ways to move through the commit tree that represents your project.", - "", - "Once you're comfortable moving around, your powers with other git commands will be amplified!", - "", - "", - "", - "", - "" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## Moving around in Git', + '', + 'Before we get to some of the more advanced features of Git, it\'s important to understand different ways to move through the commit tree that represents your project.', + '', + 'Once you\'re comfortable moving around, your powers with other git commands will be amplified!', + '', + '', + '', + '', + '' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## HEAD", - "", - "First we have to talk about \"HEAD\". HEAD is the symbolic name for the currently checked out commit -- it's essentially what commit you're working on top of.", - "", - "HEAD always points to the most recent commit which is reflected in the working tree. Most git commands which make changes to the working tree will start by changing HEAD.", - "", - "Normally HEAD points to a branch name (like bugFix). When you commit, the status of bugFix is altered and this change is visible through HEAD." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## HEAD', + '', + 'First we have to talk about "HEAD". HEAD is the symbolic name for the currently checked out commit -- it\'s essentially what commit you\'re working on top of.', + '', + 'HEAD always points to the most recent commit which is reflected in the working tree. Most git commands which make changes to the working tree will start by changing HEAD.', + '', + 'Normally HEAD points to a branch name (like bugFix). When you commit, the status of bugFix is altered and this change is visible through HEAD.' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "Let's see this in action. Here we will reveal HEAD before and after a commit." + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + 'Let\'s see this in action. Here we will reveal HEAD before and after a commit.' ], - "afterMarkdowns": [ - "See! HEAD was hiding underneath our `master` branch all along." + 'afterMarkdowns': [ + 'See! HEAD was hiding underneath our `master` branch all along.' ], - "command": "git checkout C1; git checkout master; git commit; git checkout C2", - "beforeCommand": "" + 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', + 'beforeCommand': '' } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "### Detaching HEAD", - "", - "Detaching HEAD just means attaching it to a commit instead of a branch. This is what it looks like beforehand:", - "", - "HEAD -> master -> C1", - "" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '### Detaching HEAD', + '', + 'Detaching HEAD just means attaching it to a commit instead of a branch. This is what it looks like beforehand:', + '', + 'HEAD -> master -> C1', + '' ], - "afterMarkdowns": [ - "And now it's", - "", - "HEAD -> C1" + 'afterMarkdowns': [ + 'And now it\'s', + '', + 'HEAD -> C1' ], - "command": "git checkout C1", - "beforeCommand": "" + 'command': 'git checkout C1', + 'beforeCommand': '' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "To complete this level, let's detach HEAD from `bugFix` and attach it to the commit instead.", - "", - "Specify this commit by its hash. The hash for each commit is displayed on the circle that represents the commit." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'To complete this level, let\'s detach HEAD from `bugFix` and attach it to the commit instead.', + '', + 'Specify this commit by its hash. The hash for each commit is displayed on the circle that represents the commit.' ] } } ] }, - "es_AR": { - "childViews": [ + 'es_AR': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## Moviéndose por ahí con Git", - "", - "Antes de meternos en algunas de las funcionalidades más avanzadas de git, es importante entender las distintas maneras de moverse por el árbol de commits que representa tu proyecto.", - "", - "Una vez que estés cómodo moviendote por ahí, tus poderes con los otros comandos de git ¡van a amplificarse!", - "", - "", - "", - "", - "" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## Moviéndose por ahí con Git', + '', + 'Antes de meternos en algunas de las funcionalidades más avanzadas de git, es importante entender las distintas maneras de moverse por el árbol de commits que representa tu proyecto.', + '', + 'Una vez que estés cómodo moviendote por ahí, tus poderes con los otros comandos de git ¡van a amplificarse!', + '', + '', + '', + '', + '' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## HEAD", - "", - "Primero tenemos que hablar de \"HEAD\". HEAD es el nombre simbólico del commit actualmente checkouteado -- es, básicamente, el commit sobre el que estás trabajando.", - "", - "HEAD siempre apunta al commit más reciente, reflejado en el árbol de commits. La mayoría de los comandos de git que hacen cambios al árbol de commits empiezan modificando HEAD.", - "", - "Normalmente HEAD apunta al nombre de una rama (como bugFix). Cuando commiteás, el estado de bugFix se altera y este cambio es visible a través de HEAD." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## HEAD', + '', + 'Primero tenemos que hablar de "HEAD". HEAD es el nombre simbólico del commit actualmente checkouteado -- es, básicamente, el commit sobre el que estás trabajando.', + '', + 'HEAD siempre apunta al commit más reciente, reflejado en el árbol de commits. La mayoría de los comandos de git que hacen cambios al árbol de commits empiezan modificando HEAD.', + '', + 'Normalmente HEAD apunta al nombre de una rama (como bugFix). Cuando commiteás, el estado de bugFix se altera y este cambio es visible a través de HEAD.' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "Veamoslo en acción. Acá vamos a ver a HEAD antes y después de un commit." + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + 'Veamoslo en acción. Acá vamos a ver a HEAD antes y después de un commit.' ], - "afterMarkdowns": [ - "¡Ves! HEAD estuvo oculta bajo nuestra rama `master` todo este tiempo." + 'afterMarkdowns': [ + '¡Ves! HEAD estuvo oculta bajo nuestra rama `master` todo este tiempo.' ], - "command": "git checkout C1; git checkout master; git commit; git checkout C2", - "beforeCommand": "" + 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', + 'beforeCommand': '' } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "### Detacheando HEAD", - "", - "Detachear (_des-adjuntar_) HEAD simplemente significa adjuntarla a un commit en lugar de a un branch. Así es como se ve de antemano:", - "", - "HEAD -> master -> C1", - "" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '### Detacheando HEAD', + '', + 'Detachear (_des-adjuntar_) HEAD simplemente significa adjuntarla a un commit en lugar de a un branch. Así es como se ve de antemano:', + '', + 'HEAD -> master -> C1', + '' ], - "afterMarkdowns": [ - "Y así queda ahora:", - "", - "HEAD -> C1" + 'afterMarkdowns': [ + 'Y así queda ahora:', + '', + 'HEAD -> C1' ], - "command": "git checkout C1", - "beforeCommand": "" + 'command': 'git checkout C1', + 'beforeCommand': '' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Para completar este nivel, detacheemos HEAD de `bugFix` y ataccheemosla al commit, en cambio.", - "", - "Especificá este commit por su hash. El hash de cada commit se muestra en el círculo que lo representa." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Para completar este nivel, detacheemos HEAD de `bugFix` y ataccheemosla al commit, en cambio.', + '', + 'Especificá este commit por su hash. El hash de cada commit se muestra en el círculo que lo representa.' ] } } ] }, - "pt_BR": { - "childViews": [ + 'pt_BR': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## Movendo-se no Git", - "", - "Antes de seguirmos para algumas funcionalidades mais avançadas do Git, é importante entender as diferentes formas de se mover através da árvore de commits que representa o seu projeto.", - "", - "Uma vez que você estiver confortável em se mover ao redor, seus poderes utilizando outros comandos do Git serão amplificados!", - "", - "", - "", - "", - "" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## Movendo-se no Git', + '', + 'Antes de seguirmos para algumas funcionalidades mais avançadas do Git, é importante entender as diferentes formas de se mover através da árvore de commits que representa o seu projeto.', + '', + 'Uma vez que você estiver confortável em se mover ao redor, seus poderes utilizando outros comandos do Git serão amplificados!', + '', + '', + '', + '', + '' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## HEAD", - "", - "Primeiro temos que conversar sobre a \"cabeça\" (\"HEAD\"). HEAD é um nome simbólico para o commit atualmente ativo (que sofreu checkout por último) -- é essencialmente o commit sobre o qual você está trabalhando no momento.", - "", - "O HEAD sempre aponta para o commit mais recentemente copiado sobre a árvore de trabalho (arquivos do projeto). A maioria dos comandos do git que realizam mudanças sobre a árvore de trabalho começarão mudando o HEAD.", - "", - "Normalmente o HEAD aponta para o nome de um ramo (por exemplo, bugFix). Quando você commita, o status do bugFix é alterado e essa mudança ocorre também sobre o HEAD." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## HEAD', + '', + 'Primeiro temos que conversar sobre a "cabeça" ("HEAD"). HEAD é um nome simbólico para o commit atualmente ativo (que sofreu checkout por último) -- é essencialmente o commit sobre o qual você está trabalhando no momento.', + '', + 'O HEAD sempre aponta para o commit mais recentemente copiado sobre a árvore de trabalho (arquivos do projeto). A maioria dos comandos do git que realizam mudanças sobre a árvore de trabalho começarão mudando o HEAD.', + '', + 'Normalmente o HEAD aponta para o nome de um ramo (por exemplo, bugFix). Quando você commita, o status do bugFix é alterado e essa mudança ocorre também sobre o HEAD.' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "Vejamos isto em ação. Aqui vamos mostrar o HEAD antes e depois de um commit." + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + 'Vejamos isto em ação. Aqui vamos mostrar o HEAD antes e depois de um commit.' ], - "afterMarkdowns": [ - "Veja! O HEAD estava se escondendo ao lado do nosso `master` esse tempo todo." + 'afterMarkdowns': [ + 'Veja! O HEAD estava se escondendo ao lado do nosso `master` esse tempo todo.' ], - "command": "git checkout C1; git checkout master; git commit; git checkout C2", - "beforeCommand": "" + 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', + 'beforeCommand': '' } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "### Soltando a cabeça", - "", - "Soltar o HEAD significa anexá-lo a um commit em vez de anexá-lo a um ramo. Antes do estado solto (\"detached\"), é assim como se parece:", - "", - "HEAD -> master -> C1", - "" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '### Soltando a cabeça', + '', + 'Soltar o HEAD significa anexá-lo a um commit em vez de anexá-lo a um ramo. Antes do estado solto ("detached"), é assim como se parece:', + '', + 'HEAD -> master -> C1', + '' ], - "afterMarkdowns": [ - "E agora é", - "", - "HEAD -> C1" + 'afterMarkdowns': [ + 'E agora é', + '', + 'HEAD -> C1' ], - "command": "git checkout C1", - "beforeCommand": "" + 'command': 'git checkout C1', + 'beforeCommand': '' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Para completar este nível, vamos soltar o HEAD do `bugFix` e em vez disso anexá-lo ao commit.", - "", - "Especifique o commit por meio do hash correspondente. O hash de cada commit é mostrado dentro do círculo que representa o commit (a letra C seguida de um número)." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Para completar este nível, vamos soltar o HEAD do `bugFix` e em vez disso anexá-lo ao commit.', + '', + 'Especifique o commit por meio do hash correspondente. O hash de cada commit é mostrado dentro do círculo que representa o commit (a letra C seguida de um número).' ] } } ] }, - "gl": { - "childViews": [ + 'gl': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## Movéndose en Git", - "", - "Antes de seguir con algunhas das funcionalidades máis avanzadas de Git, é importante entender as diferentes formas de se mover a través da árbore de commits que representa o teu proxecto.", - "", - "¡Unha vez que te sintas ben ó teu redor, os teus poderes empregando outros comandos de git serán amplificados!", - "", - "", - "", - "", - "" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## Movéndose en Git', + '', + 'Antes de seguir con algunhas das funcionalidades máis avanzadas de Git, é importante entender as diferentes formas de se mover a través da árbore de commits que representa o teu proxecto.', + '', + '¡Unha vez que te sintas ben ó teu redor, os teus poderes empregando outros comandos de git serán amplificados!', + '', + '', + '', + '', + '' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## HEAD", - "", - "Primeiro temos que falar sobre o \"commit actual\" (\"HEAD\"). HEAD é un nome simbólico para o commit atualmente ativo (o último checkout que se fixo) -- é esencialmente o commit sobre o cal estás traballando nese momento.", - "", - "O HEAD sempre apunta para o commit máis recentemente copiado sobre a árbore de traballo (arquivos do proxecto). A maioría dos comandos de git que fan algún cambio sobre a árbore de traballo empezarán movendo o HEAD.", - "", - "Normalmente o HEAD apunta para o nome dunha rama (por exemplo, bugFix). Quando fagas commit, o status do bugFix é alterado e ese cambio ocorre tamén sobre o HEAD." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## HEAD', + '', + 'Primeiro temos que falar sobre o "commit actual" ("HEAD"). HEAD é un nome simbólico para o commit atualmente ativo (o último checkout que se fixo) -- é esencialmente o commit sobre o cal estás traballando nese momento.', + '', + 'O HEAD sempre apunta para o commit máis recentemente copiado sobre a árbore de traballo (arquivos do proxecto). A maioría dos comandos de git que fan algún cambio sobre a árbore de traballo empezarán movendo o HEAD.', + '', + 'Normalmente o HEAD apunta para o nome dunha rama (por exemplo, bugFix). Quando fagas commit, o status do bugFix é alterado e ese cambio ocorre tamén sobre o HEAD.' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "Vexamos isto en acción. Aquí imos mostrar o HEAD antes e depois dun commit." + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + 'Vexamos isto en acción. Aquí imos mostrar o HEAD antes e depois dun commit.' ], - "afterMarkdowns": [ - "Ves! O HEAD estivo ó lado do noso `master` todo este tempo." + 'afterMarkdowns': [ + 'Ves! O HEAD estivo ó lado do noso `master` todo este tempo.' ], - "command": "git checkout C1; git checkout master; git commit; git checkout C2", - "beforeCommand": "" + 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', + 'beforeCommand': '' } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "### Soltando a cabeza", - "", - "Soltar o HEAD significa apuntar a un commit en vez de apuntar a unha rama. Antes do estado solo (\"detached\"), é así como aparece:", - "", - "HEAD -> master -> C1", - "" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '### Soltando a cabeza', + '', + 'Soltar o HEAD significa apuntar a un commit en vez de apuntar a unha rama. Antes do estado solo ("detached"), é así como aparece:', + '', + 'HEAD -> master -> C1', + '' ], - "afterMarkdowns": [ - "E agora é", - "", - "HEAD -> C1" + 'afterMarkdowns': [ + 'E agora é', + '', + 'HEAD -> C1' ], - "command": "git checkout C1", - "beforeCommand": "" + 'command': 'git checkout C1', + 'beforeCommand': '' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Para completar este nivel, imos soltar o HEAD de `bugFix` e en vez diso apuntamos ó commit.", - "", - "Especifica o commit por medio do hash correspondente. O hash de cada commit está dentro do círculo que representa ó commit (a letra C seguida dun número)." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Para completar este nivel, imos soltar o HEAD de `bugFix` e en vez diso apuntamos ó commit.', + '', + 'Especifica o commit por medio do hash correspondente. O hash de cada commit está dentro do círculo que representa ó commit (a letra C seguida dun número).' ] } } ] }, - "fr_FR": { - "childViews": [ + 'fr_FR': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## Se déplacer dans Git", - "", - "Avant que nous découvrions quelques-unes des fonctionnalités les plus avancées de Git, il est important de comprendre les différents manières de se déplacer dans l'arbre des commits qui représente votre projet.", - "", - "Une fois que ces déplacements seront aisés, votre puissance avec les autres commandes de git sera amplifiée !", - "", - "", - "", - "", - "" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## Se déplacer dans Git', + '', + 'Avant que nous découvrions quelques-unes des fonctionnalités les plus avancées de Git, il est important de comprendre les différents manières de se déplacer dans l\'arbre des commits qui représente votre projet.', + '', + 'Une fois que ces déplacements seront aisés, votre puissance avec les autres commandes de git sera amplifiée !', + '', + '', + '', + '', + '' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## HEAD", - "", - "Premièrement nous avons parlé de \"HEAD\". HEAD est le nom symbolique pour le commit sur lequel nous nous situons actuellement -- plus simplement c'est le commit sur lequel nous travaillons.", - "", - "HEAD pointe toujours sur le commit le plus récent dans l'arbre des commits. La plupart des commandes git qui modifient l'arbre des commits vont commencer par modifier HEAD.", - "", - "Normalement HEAD pointe sur le nom d'une branche (comme bugFix). Quand vous effectuez un commit, le statut de bugFix est modifié et ce changement est visible par le biais de HEAD." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## HEAD', + '', + 'Premièrement nous avons parlé de "HEAD". HEAD est le nom symbolique pour le commit sur lequel nous nous situons actuellement -- plus simplement c\'est le commit sur lequel nous travaillons.', + '', + 'HEAD pointe toujours sur le commit le plus récent dans l\'arbre des commits. La plupart des commandes git qui modifient l\'arbre des commits vont commencer par modifier HEAD.', + '', + 'Normalement HEAD pointe sur le nom d\'une branche (comme bugFix). Quand vous effectuez un commit, le statut de bugFix est modifié et ce changement est visible par le biais de HEAD.' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "Voyons cela en action. Ici nous allons indiquer où se situe HEAD avant et après un commit." + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + 'Voyons cela en action. Ici nous allons indiquer où se situe HEAD avant et après un commit.' ], - "afterMarkdowns": [ - "Vous voyez ! HEAD était caché en dessous de la branche `master` tout le long." + 'afterMarkdowns': [ + 'Vous voyez ! HEAD était caché en dessous de la branche `master` tout le long.' ], - "command": "git checkout C1; git checkout master; git commit; git checkout C2", - "beforeCommand": "" + 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', + 'beforeCommand': '' } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "### Détacher HEAD", - "", - "Détacher HEAD signifie simplement que l'on attache HEAD à un commit au lieu d'une branche. Voilà à quoi cela ressemble actuellement :", - "", - "HEAD -> master -> C1", - "" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '### Détacher HEAD', + '', + 'Détacher HEAD signifie simplement que l\'on attache HEAD à un commit au lieu d\'une branche. Voilà à quoi cela ressemble actuellement :', + '', + 'HEAD -> master -> C1', + '' ], - "afterMarkdowns": [ - "Et maintenant c'est", - "", - "HEAD -> C1" + 'afterMarkdowns': [ + 'Et maintenant c\'est', + '', + 'HEAD -> C1' ], - "command": "git checkout C1", - "beforeCommand": "" + 'command': 'git checkout C1', + 'beforeCommand': '' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Pour terminer ce niveau, détacher HEAD de `bugFix` et attachez-le plutôt au commit.", - "", - "Spécifiez le commit par son identifiant (hash). Le hash de chaque commit est affiché dans le rond qui représente le commit." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Pour terminer ce niveau, détacher HEAD de `bugFix` et attachez-le plutôt au commit.', + '', + 'Spécifiez le commit par son identifiant (hash). Le hash de chaque commit est affiché dans le rond qui représente le commit.' ] } } ] }, - "de_DE": { - "childViews": [ + 'de_DE': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## Navigation durch Git", - "", - "Bevor wir uns einige fortgeschrittene Konzepte in Git ansehen ist es wichtig, verschiedene Wege zum Navigieren durch den Commit-Baum, der das Projekt enthält, zu kennen.", - "", - "Sobald du das drauf hast, vergrößern sich deine Möglichkeiten in allen anderen Git-Befehlen.", - "", - "", - "", - "", - "" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## Navigation durch Git', + '', + 'Bevor wir uns einige fortgeschrittene Konzepte in Git ansehen ist es wichtig, verschiedene Wege zum Navigieren durch den Commit-Baum, der das Projekt enthält, zu kennen.', + '', + 'Sobald du das drauf hast, vergrößern sich deine Möglichkeiten in allen anderen Git-Befehlen.', + '', + '', + '', + '', + '' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## HEAD", - "", - "Erst mal müssen wir über `HEAD` reden. `HEAD` ist ein Alias für den Commit, der gerade ausgecheckt ist -- es ist im Prinzip der Commit, an den du deinen nächsten Commit hängst.", - "", - "`HEAD` zeigt immer auf den neuesten Commit. Die meisten Git-Befehle, die den Baum verändern, fangen damit an dass sie `HEAD` verschieben.", - "", - "Normalerweise zeigt `HEAD` auf einen Branch-Namen (z.B. `bugFix`). Wenn du einen Commit machst, wird `bugFix` auf diesen Commit geschoben, und `HEAD` (da es auf `bugFix` zeigt) automatisch auch." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## HEAD', + '', + 'Erst mal müssen wir über `HEAD` reden. `HEAD` ist ein Alias für den Commit, der gerade ausgecheckt ist -- es ist im Prinzip der Commit, an den du deinen nächsten Commit hängst.', + '', + '`HEAD` zeigt immer auf den neuesten Commit. Die meisten Git-Befehle, die den Baum verändern, fangen damit an dass sie `HEAD` verschieben.', + '', + 'Normalerweise zeigt `HEAD` auf einen Branch-Namen (z.B. `bugFix`). Wenn du einen Commit machst, wird `bugFix` auf diesen Commit geschoben, und `HEAD` (da es auf `bugFix` zeigt) automatisch auch.' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "Schauen wir uns das mal in Aktion an. Wir werden hier `HEAD` vor und nach dem Commit anzeigen." + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + 'Schauen wir uns das mal in Aktion an. Wir werden hier `HEAD` vor und nach dem Commit anzeigen.' ], - "afterMarkdowns": [ - "Siehst du? `HEAD` war die ganze Zeit unter `master` versteckt." + 'afterMarkdowns': [ + 'Siehst du? `HEAD` war die ganze Zeit unter `master` versteckt.' ], - "command": "git checkout C1; git checkout master; git commit; git checkout C2", - "beforeCommand": "" + 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', + 'beforeCommand': '' } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "### HEAD abkoppeln", - "", - "`HEAD` abzukoppeln bedeutet, es direkt an einen bestimmten Commit zu hängen, anstatt an einen Branch. Wir gelangen dadurch in den \"detached HEAD state\". So sieht's vorher aus:", - "", - "`HEAD` -> `master` -> `C1`", - "" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '### HEAD abkoppeln', + '', + '`HEAD` abzukoppeln bedeutet, es direkt an einen bestimmten Commit zu hängen, anstatt an einen Branch. Wir gelangen dadurch in den "detached HEAD state". So sieht\'s vorher aus:', + '', + '`HEAD` -> `master` -> `C1`', + '' ], - "afterMarkdowns": [ - "Und jetzt:", - "", - "`HEAD` -> `C1`" + 'afterMarkdowns': [ + 'Und jetzt:', + '', + '`HEAD` -> `C1`' ], - "command": "git checkout C1", - "beforeCommand": "" + 'command': 'git checkout C1', + 'beforeCommand': '' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Um diesen Level abzuschließen, lass uns mal `HEAD` von `bugFix` abkoppeln und an den Commit hängen.", - "", - "Gib den Commit mit seinem Hash an. Der Hash jedes Commits steht in dem Kreis, der den Commit darstellt." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Um diesen Level abzuschließen, lass uns mal `HEAD` von `bugFix` abkoppeln und an den Commit hängen.', + '', + 'Gib den Commit mit seinem Hash an. Der Hash jedes Commits steht in dem Kreis, der den Commit darstellt.' ] } } ] }, - "zh_CN": { - "childViews": [ + 'zh_CN': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## 在提交树上移动", - "", - "在接触 Git 更高级功能之前,我们有必要先学习在你项目的提交树上前后移动的几种方法。", - "", - "一旦熟悉了如何在 Git 提交树上移动,你驾驭其它命令的能力也将水涨船高!", - "" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## 在提交树上移动', + '', + '在接触 Git 更高级功能之前,我们有必要先学习在你项目的提交树上前后移动的几种方法。', + '', + '一旦熟悉了如何在 Git 提交树上移动,你驾驭其它命令的能力也将水涨船高!', + '' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## HEAD", - "", - "我们首先看一下 “HEAD”。 HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。", - "", - "HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。", - "", - "HEAD 通常情况下是指向分支名的(如 bugFix)。在你提交时,改变了 bugFix 的状态,这一变化通过 HEAD 变得可见。" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## HEAD', + '', + '我们首先看一下 “HEAD”。 HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。', + '', + 'HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。', + '', + 'HEAD 通常情况下是指向分支名的(如 bugFix)。在你提交时,改变了 bugFix 的状态,这一变化通过 HEAD 变得可见。' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "下面咱们通过实际操作看一下。我们将会观察提交前后 HEAD 的位置。" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '下面咱们通过实际操作看一下。我们将会观察提交前后 HEAD 的位置。' ], - "afterMarkdowns": [ - "看到了吗? HEAD 指向了 `master`,随着提交向前移动。", - "", - "(译者注:实际这些命令并不是真的在查看 HEAD 指向,看下一屏就了解了。如果想看 HEAD 指向,可以通过 `cat .git/HEAD` 查看,", - "如果 HEAD 指向的是一个引用,还可以用 `git symbolic-ref HEAD` 查看它的指向。但是该程序不支持这两个命令)" + 'afterMarkdowns': [ + '看到了吗? HEAD 指向了 `master`,随着提交向前移动。', + '', + '(译者注:实际这些命令并不是真的在查看 HEAD 指向,看下一屏就了解了。如果想看 HEAD 指向,可以通过 `cat .git/HEAD` 查看,', + '如果 HEAD 指向的是一个引用,还可以用 `git symbolic-ref HEAD` 查看它的指向。但是该程序不支持这两个命令)' ], - "command": "git checkout C1; git checkout master; git commit; git checkout C2", - "beforeCommand": "" + 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', + 'beforeCommand': '' } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "### 分离的 HEAD", - "", - "分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。在命令执行之前的状态如下所示: ", - "", - "HEAD -> master -> C1", - "", - "HEAD 指向 master, master 指向 C1" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '### 分离的 HEAD', + '', + '分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。在命令执行之前的状态如下所示: ', + '', + 'HEAD -> master -> C1', + '', + 'HEAD 指向 master, master 指向 C1' ], - "afterMarkdowns": [ - "现在变成了", - "", - "HEAD -> C1" + 'afterMarkdowns': [ + '现在变成了', + '', + 'HEAD -> C1' ], - "command": "git checkout C1", - "beforeCommand": "" + 'command': 'git checkout C1', + 'beforeCommand': '' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "想完成此关,从 `bugFix` 分支中分离出 HEAD 并让其指向一个提交记录。", - "", - "通过哈希值指定提交记录。每个提交记录的哈希值显示在代表提交记录的圆圈中。" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '想完成此关,从 `bugFix` 分支中分离出 HEAD 并让其指向一个提交记录。', + '', + '通过哈希值指定提交记录。每个提交记录的哈希值显示在代表提交记录的圆圈中。' ] } } ] }, - "zh_TW": { - "childViews": [ + 'zh_TW': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## 在 git 中前後移動", - "", - "在接觸 git 的更多進階的主題之前,我們先學習用不同的方法在你的 project 中的 commit tree 上面移動。", - "", - "一旦能夠熟練地在 commit tree 中隨意地移動,你使用其它的 git 指令也會更厲害!", - "" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## 在 git 中前後移動', + '', + '在接觸 git 的更多進階的主題之前,我們先學習用不同的方法在你的 project 中的 commit tree 上面移動。', + '', + '一旦能夠熟練地在 commit tree 中隨意地移動,你使用其它的 git 指令也會更厲害!', + '' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## HEAD", - "", - "我們首先看一下 \"HEAD\",HEAD 是一個 reference,它是指向目前所 checkout 的 commit,基本上,其實就是你目前所在的 commit。", - "", - "在 commit tree 中,HEAD 總是指向最近的一次commit。大部份 git 的指令如果要修改 commit tree 的狀態的話,都會先改變 HEAD 所指向的 commit。", - "", - "HEAD 通常指向一個 branch 的名稱(比如 bugFix)。當你 commit 的時候,改變了 bugFix 的狀態,這一個變化可以從 HEAD 的改變中看到。" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## HEAD', + '', + '我們首先看一下 "HEAD",HEAD 是一個 reference,它是指向目前所 checkout 的 commit,基本上,其實就是你目前所在的 commit。', + '', + '在 commit tree 中,HEAD 總是指向最近的一次commit。大部份 git 的指令如果要修改 commit tree 的狀態的話,都會先改變 HEAD 所指向的 commit。', + '', + 'HEAD 通常指向一個 branch 的名稱(比如 bugFix)。當你 commit 的時候,改變了 bugFix 的狀態,這一個變化可以從 HEAD 的改變中看到。' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "在實際的例子中。我們將會觀察 commit 前後 HEAD 的位置。" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '在實際的例子中。我們將會觀察 commit 前後 HEAD 的位置。' ], - "afterMarkdowns": [ - "看吧!HEAD 一直藏在 `master` 分支的後面。" + 'afterMarkdowns': [ + '看吧!HEAD 一直藏在 `master` 分支的後面。' ], - "command": "git checkout C1; git checkout master; git commit; git checkout C2", - "beforeCommand": "" + 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', + 'beforeCommand': '' } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "### 分離 HEAD", - "", - "分離 HEAD 就是讓其指向一個 commit 而不是 branch 的名稱。這是指令執行之前的樣子:", - "", - "HEAD -> master -> C1", - "" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '### 分離 HEAD', + '', + '分離 HEAD 就是讓其指向一個 commit 而不是 branch 的名稱。這是指令執行之前的樣子:', + '', + 'HEAD -> master -> C1', + '' ], - "afterMarkdowns": [ - "現在變成了", - "", - "HEAD -> C1" + 'afterMarkdowns': [ + '現在變成了', + '', + 'HEAD -> C1' ], - "command": "git checkout C1", - "beforeCommand": "" + 'command': 'git checkout C1', + 'beforeCommand': '' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "想要完成這一個關卡,從 `bugFix` 分離出 HEAD 並且讓它指向一個 commit。", - "", - "通過 hash 值可以指定 commit。每個 commit 的 hash 值顯示在各自的圓圈中。" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '想要完成這一個關卡,從 `bugFix` 分離出 HEAD 並且讓它指向一個 commit。', + '', + '通過 hash 值可以指定 commit。每個 commit 的 hash 值顯示在各自的圓圈中。' ] } } ] }, - "ja": { - "childViews": [ + 'ja': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## 任意の位置への移動", - "", - "Gitの上級機能に進む前に、自分のプロジェクトを表すコミットツリーの中で任意の位置へ移動する様々な方法を知っておく必要があります。", - "", - "移動方法が身につけば、他のgitコマンドをよりうまく扱えるようになるでしょう!", - "", - "", - "", - "", - "" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## 任意の位置への移動', + '', + 'Gitの上級機能に進む前に、自分のプロジェクトを表すコミットツリーの中で任意の位置へ移動する様々な方法を知っておく必要があります。', + '', + '移動方法が身につけば、他のgitコマンドをよりうまく扱えるようになるでしょう!', + '', + '', + '', + '', + '' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## HEAD", - "", - "まずは\"HEAD\"から始めましょう。HEADとは現在チェックアウトされているコミットを指す単語です -- ようするに今作業中のコミットを表します。", - "", - "HEADはいつも、作業中のツリーに反映されている最新のコミットを指します。作業ツリーへ変更を加える多くのgitコマンドはまずHEADから処理を始めます。", - "", - "HEADは普段、ブランチ名(例えば、bugFixなど)を指します。コミットすれば、bugFixの状態が変更され、その変更がHEADから確認できるようになります。" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## HEAD', + '', + 'まずは"HEAD"から始めましょう。HEADとは現在チェックアウトされているコミットを指す単語です -- ようするに今作業中のコミットを表します。', + '', + 'HEADはいつも、作業中のツリーに反映されている最新のコミットを指します。作業ツリーへ変更を加える多くのgitコマンドはまずHEADから処理を始めます。', + '', + 'HEADは普段、ブランチ名(例えば、bugFixなど)を指します。コミットすれば、bugFixの状態が変更され、その変更がHEADから確認できるようになります。' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "実際の動作を見てみましょう。ここでは、コミットの前と後のHEADの状態を確認します。" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '実際の動作を見てみましょう。ここでは、コミットの前と後のHEADの状態を確認します。' ], - "afterMarkdowns": [ - "ほら、HEADが元から`master`ブランチの下に隠れていたんですね!" + 'afterMarkdowns': [ + 'ほら、HEADが元から`master`ブランチの下に隠れていたんですね!' ], - "command": "git checkout C1; git checkout master; git commit; git checkout C2", - "beforeCommand": "" + 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', + 'beforeCommand': '' } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "### HEADの分離", - "", - "HEADの分離(detached HEAD)とは単に、ブランチではなく特定のコミットにHEADを紐づけることです。実行前の状態は次のようです:", - "", - "HEAD -> master -> C1", - "" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '### HEADの分離', + '', + 'HEADの分離(detached HEAD)とは単に、ブランチではなく特定のコミットにHEADを紐づけることです。実行前の状態は次のようです:', + '', + 'HEAD -> master -> C1', + '' ], - "afterMarkdowns": [ - "そして実行後はこう:", - "", - "HEAD -> C1" + 'afterMarkdowns': [ + 'そして実行後はこう:', + '', + 'HEAD -> C1' ], - "command": "git checkout C1", - "beforeCommand": "" + 'command': 'git checkout C1', + 'beforeCommand': '' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "このレベルをクリアするには、HEADを`bugFix`から分離し、その代わりに特定のコミットに紐づけましょう。", - "", - "このコミットをハッシュで指定します。コミットのハッシュはそのコミットを表す丸に刻まれています。" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'このレベルをクリアするには、HEADを`bugFix`から分離し、その代わりに特定のコミットに紐づけましょう。', + '', + 'このコミットをハッシュで指定します。コミットのハッシュはそのコミットを表す丸に刻まれています。' ] } } ] }, - "ru_RU": { - "childViews": [ + 'ru_RU': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## Прогулка по Git", - "", - "Прежде чем перейти к более продвинутым фичам Git, важно понять различные способы перемещения по дереву коммитов вашего проекта.", - "", - "Как только вы научитесь свободно передвигаться по дереву коммитов, ваши возможности в Git приумножатся.", - "", - "", - "", - "", - "" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## Прогулка по Git', + '', + 'Прежде чем перейти к более продвинутым фичам Git, важно понять различные способы перемещения по дереву коммитов вашего проекта.', + '', + 'Как только вы научитесь свободно передвигаться по дереву коммитов, ваши возможности в Git приумножатся.', + '', + '', + '', + '', + '' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## HEAD", - "", - "В первую очередь, поговорим о \"HEAD\". HEAD - это символическое имя текущего выбранного коммита — это, по сути, тот коммит, над которым мы в данным момент работаем.", - "", - "HEAD всегда указывает на последний коммит из вашего локального дерева. Большинство команд Git, изменяющих рабочее дерево, начнут с изменения HEAD.", - "", - "Обычно HEAD указывает на имя ветки (например, `bugFix`). Когда вы делаете коммит, статус ветки `bugFix` меняется и это изменение видно через HEAD." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## HEAD', + '', + 'В первую очередь, поговорим о "HEAD". HEAD - это символическое имя текущего выбранного коммита — это, по сути, тот коммит, над которым мы в данным момент работаем.', + '', + 'HEAD всегда указывает на последний коммит из вашего локального дерева. Большинство команд Git, изменяющих рабочее дерево, начнут с изменения HEAD.', + '', + 'Обычно HEAD указывает на имя ветки (например, `bugFix`). Когда вы делаете коммит, статус ветки `bugFix` меняется и это изменение видно через HEAD.' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "Посмотрим, как это работает. Обратите внимание на то, где находится HEAD до и после коммита." + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + 'Посмотрим, как это работает. Обратите внимание на то, где находится HEAD до и после коммита.' ], - "afterMarkdowns": [ - "Вот! HEAD всё это время скрывался за веткой `master`." + 'afterMarkdowns': [ + 'Вот! HEAD всё это время скрывался за веткой `master`.' ], - "command": "git checkout C1; git checkout master; git commit; git checkout C2", - "beforeCommand": "" + 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', + 'beforeCommand': '' } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "### Detaching HEAD", - "", - "Отделение (detaching) HEAD означает лишь присвоение его не ветке, а конкретному коммиту. Посмотрим, что было до отделения:", - "", - "HEAD -> master -> C1", - "" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '### Detaching HEAD', + '', + 'Отделение (detaching) HEAD означает лишь присвоение его не ветке, а конкретному коммиту. Посмотрим, что было до отделения:', + '', + 'HEAD -> master -> C1', + '' ], - "afterMarkdowns": [ - "А вот что получилось теперь", - "", - "HEAD -> C1" + 'afterMarkdowns': [ + 'А вот что получилось теперь', + '', + 'HEAD -> C1' ], - "command": "git checkout C1", - "beforeCommand": "" + 'command': 'git checkout C1', + 'beforeCommand': '' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Чтобы пройти уровень, давай отделим HEAD от ветки `bugFix` и присвоим его последнему коммиту в этой же ветке.", - "", - "Укажи коммит при помощи его идентификатора (hash). Hash для каждого коммита указан в кружке на схеме." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Чтобы пройти уровень, давай отделим HEAD от ветки `bugFix` и присвоим его последнему коммиту в этой же ветке.', + '', + 'Укажи коммит при помощи его идентификатора (hash). Hash для каждого коммита указан в кружке на схеме.' ] } } ] }, - "ko": { - "childViews": [ + 'ko': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## Git에서 여기저기로 옮겨다니기", - "", - "Git의 고급기능들에 대해 더 알아보기 전에, 여러분의 프로젝트를 표현하는 커밋 트리\(commit tree\)에서 이동 할 수 있는 여러가지 방법들을 아는것이 중요합니다.", - "", - "여기저기 이동하는 것에 익숙해지면, 여러분이 다른 git 명령어들을 사용하는 능력도 아주 좋아질 것입니다!", - "", - "", - "", - "", - "" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## Git에서 여기저기로 옮겨다니기', + '', + 'Git의 고급기능들에 대해 더 알아보기 전에, 여러분의 프로젝트를 표현하는 커밋 트리\(commit tree\)에서 이동 할 수 있는 여러가지 방법들을 아는것이 중요합니다.', + '', + '여기저기 이동하는 것에 익숙해지면, 여러분이 다른 git 명령어들을 사용하는 능력도 아주 좋아질 것입니다!', + '', + '', + '', + '', + '' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## HEAD", - "", - "먼저\"HEAD\"에 대해 이야기해 봅시다. HEAD는 현재 체크아웃된 커밋을 가리킵니다. -- 다시 말하자면 현재 작업중인 커밋입니다.", - "", - "HEAD는 항상 작업트리의 가장 최근 커밋을 가리킵니다. 작업트리에 변화를 주는 git 명령어들은 대부분 HEAD를 변경하는것으로 시작합니다.", - "", - "일반적으로 HEAD는 브랜치의 이름을 가리키고있습니다(bugFix와 같이). 커밋을 하게 되면, bugFix의 상태가 바뀌고 이 변경은 HEAD를 통해서 확인이 가능합니다." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## HEAD', + '', + '먼저"HEAD"에 대해 이야기해 봅시다. HEAD는 현재 체크아웃된 커밋을 가리킵니다. -- 다시 말하자면 현재 작업중인 커밋입니다.', + '', + 'HEAD는 항상 작업트리의 가장 최근 커밋을 가리킵니다. 작업트리에 변화를 주는 git 명령어들은 대부분 HEAD를 변경하는것으로 시작합니다.', + '', + '일반적으로 HEAD는 브랜치의 이름을 가리키고있습니다(bugFix와 같이). 커밋을 하게 되면, bugFix의 상태가 바뀌고 이 변경은 HEAD를 통해서 확인이 가능합니다.' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "직접 확인해 봅시다. 여기서 우리는 보이지 않던 HEAD를 커밋전, 후에 드러낼 것입니다." + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '직접 확인해 봅시다. 여기서 우리는 보이지 않던 HEAD를 커밋전, 후에 드러낼 것입니다.' ], - "afterMarkdowns": [ - "보세요! HEAD가 `master`브랜치 아래에 숨어 있던 거군요." + 'afterMarkdowns': [ + '보세요! HEAD가 `master`브랜치 아래에 숨어 있던 거군요.' ], - "command": "git checkout C1; git checkout master; git commit; git checkout C2", - "beforeCommand": "" + 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', + 'beforeCommand': '' } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "### HEAD 분리하기", - "", - "HEAD를 분리한다는 것은 HEAD를 브랜치 대신 커밋에 붙이는 것을 의미합니다. 명령을 사용하기 전의 모습은 다음과 같습니다:", - "", - "HEAD -> master -> C1", - "" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '### HEAD 분리하기', + '', + 'HEAD를 분리한다는 것은 HEAD를 브랜치 대신 커밋에 붙이는 것을 의미합니다. 명령을 사용하기 전의 모습은 다음과 같습니다:', + '', + 'HEAD -> master -> C1', + '' ], - "afterMarkdowns": [ - "이제는 이렇게 되는군요", - "", - "HEAD -> C1" + 'afterMarkdowns': [ + '이제는 이렇게 되는군요', + '', + 'HEAD -> C1' ], - "command": "git checkout C1", - "beforeCommand": "" + 'command': 'git checkout C1', + 'beforeCommand': '' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "다음 레벨로 넘어가기 위해서는, HEAD를 `bugfix`에서 분리하고 그 커밋에 붙이세요.", - "", - "각 커밋은 그것의 해시값으로 특정지을수 있습니다. 각 커밋의 해시값은 각 커밋을 나타내는 원안에 나타나있습니다." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '다음 레벨로 넘어가기 위해서는, HEAD를 `bugfix`에서 분리하고 그 커밋에 붙이세요.', + '', + '각 커밋은 그것의 해시값으로 특정지을수 있습니다. 각 커밋의 해시값은 각 커밋을 나타내는 원안에 나타나있습니다.' ] } } ] }, - "uk": { - "childViews": [ + 'uk': { + 'childViews': [ { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## Прогулянка по Git", - "", - "Перед тим як ми перейдемо до складніших можливостей гіта, важливо розуміти різні способи переміщення по дереву комітів твого проекту.", - "", - "Дуже важливо щоб тобі було комфортно переміщатись по репозиторію, так як цей навик тобі знадобиться для використання в більшості команд git!", - "", - "", - "", - "", - "" + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## Прогулянка по Git', + '', + 'Перед тим як ми перейдемо до складніших можливостей гіта, важливо розуміти різні способи переміщення по дереву комітів твого проекту.', + '', + 'Дуже важливо щоб тобі було комфортно переміщатись по репозиторію, так як цей навик тобі знадобиться для використання в більшості команд git!', + '', + '', + '', + '', + '' ] } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "## HEAD (голова)", - "", - "Спочатку розберемось з \"HEAD\". HEAD це символьне ім’я поточного вибраного коміта -- по суті це той коміт з яким ти зараз працюєш.", - "", - "HEAD завжди вказує на найновіший коміт з робочого дерева. Більшість команд що змінюють локальне дерево комітів, також модифікують HEAD.", - "", - "Зазвичай HEAD вказує на ім’я бранча (наприклад bugFix). Коли ти комітиш, змінюється статус гілки bugFix й це можна побачити подивившись на HEAD." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## HEAD (голова)', + '', + 'Спочатку розберемось з "HEAD". HEAD це символьне ім’я поточного вибраного коміта -- по суті це той коміт з яким ти зараз працюєш.', + '', + 'HEAD завжди вказує на найновіший коміт з робочого дерева. Більшість команд що змінюють локальне дерево комітів, також модифікують HEAD.', + '', + 'Зазвичай HEAD вказує на ім’я бранча (наприклад bugFix). Коли ти комітиш, змінюється статус гілки bugFix й це можна побачити подивившись на HEAD.' ] } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "Розберемось з цим на практиці. Зараз ми перевіримо HEAD до та після коміту." + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + 'Розберемось з цим на практиці. Зараз ми перевіримо HEAD до та після коміту.' ], - "afterMarkdowns": [ - "Ти диви! HEAD весь цей час ховався за гілкою `master`." + 'afterMarkdowns': [ + 'Ти диви! HEAD весь цей час ховався за гілкою `master`.' ], - "command": "git checkout C1; git checkout master; git commit; git checkout C2", - "beforeCommand": "" + 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', + 'beforeCommand': '' } }, { - "type": "GitDemonstrationView", - "options": { - "beforeMarkdowns": [ - "### Відокремлюємо голову", - "", - "Detached HEAD (відокремлена голова) просто означає що HEAD посилається на коміт, а не на якусь гілку. Ось як це виглядає спочатку:", - "", - "HEAD -> master -> C1", - "" + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '### Відокремлюємо голову', + '', + 'Detached HEAD (відокремлена голова) просто означає що HEAD посилається на коміт, а не на якусь гілку. Ось як це виглядає спочатку:', + '', + 'HEAD -> master -> C1', + '' ], - "afterMarkdowns": [ - "А в стані detached head:", - "", - "HEAD -> C1" + 'afterMarkdowns': [ + 'А в стані detached head:', + '', + 'HEAD -> C1' ], - "command": "git checkout C1", - "beforeCommand": "" + 'command': 'git checkout C1', + 'beforeCommand': '' } }, { - "type": "ModalAlert", - "options": { - "markdowns": [ - "Щоб пройти цей рівень, давайте відокремимо голову від гілки `bugFix` й натомість спрямуємо її на якийсь коміт.", - "", - "Вкажи цей коміт за його hash (хеш, ідентифікатором). Хеш кожного коміту відображений в кружечку що символізує коміт." + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Щоб пройти цей рівень, давайте відокремимо голову від гілки `bugFix` й натомість спрямуємо її на якийсь коміт.', + '', + 'Вкажи цей коміт за його hash (хеш, ідентифікатором). Хеш кожного коміту відображений в кружечку що символізує коміт.' + ] + } + } + ] + }, + 'vi': { + 'childViews': [ + { + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## Dịch chuyển trong Git', + '', + 'Trước khi học thêm vài chức năng nâng cao trong Git, ta cần phải biết cách dịch chuyển qua lại các commit có trong kho chứa.', + '', + 'Một khi bạn đã thành thao với chuyển dịch, khả năng sử dụng các lệnh git của bạn đã được nâng cao!', + '', + '', + '', + '', + '' + ] + } + }, + { + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + '## HEAD', + '', + 'Đầu tiên hãy bàn về "HEAD". HEAD là cái tên biểu tượng cho commit iện tại đang được trỏ đến -- về căn bản nó là commit mà bạn đang làm việc.', + '', + 'HEAD luôn luôn trỏ đến commit gần nhất được phản ánh trong cây làm việc. Hầu hết các lệnh git mà làm thay đổi nội dung cây làm việc thường bắt đầu với HEAD.', + '', + 'Bình thường HEAD thì trỏ tới tên nhánh (ví dụ bugFix). Khi bạn commit, thì trạng thái của bugFix được thay đổi và thay đổi này được trông thấy thông qua HEAD.' + ] + } + }, + { + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + 'Xem thử thực tế nào. Ở đây ta sẽ bộc lộ HEAD trước và sau khi commit.' + ], + 'afterMarkdowns': [ + 'Thấy chứ? HEAD đã ẩn dưới nhánh `master` suốt.' + ], + 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', + 'beforeCommand': '' + } + }, + { + 'type': 'GitDemonstrationView', + 'options': { + 'beforeMarkdowns': [ + '### Tháo HEAD', + '', + 'Tháo HEAD đơng giản nghĩa là dán nó vào một commit thay vì một nhánh. Lúc trước thì nó trông như thế này:', + '', + 'HEAD -> master -> C1', + '' + ], + 'afterMarkdowns': [ + 'Và bây giờ thì nó thế này', + '', + 'HEAD -> C1' + ], + 'command': 'git checkout C1', + 'beforeCommand': '' + } + }, + { + 'type': 'ModalAlert', + 'options': { + 'markdowns': [ + 'Để hoàn thành cấp độ này, hãy tháo HEAD khỏi `bugFix` thay vì đó hãy dán nó vào commit.', + '', + 'Chỉ rõ commit bằng mã băm (hash) của nó. Mã băm của mỗi commit nằm trong trong vòng tròn biểu thị commit đó.' ] } } diff --git a/src/levels/rampup/interactiveRebase.js b/src/levels/rampup/interactiveRebase.js index 39ceeeb8..7b5adb41 100644 --- a/src/levels/rampup/interactiveRebase.js +++ b/src/levels/rampup/interactiveRebase.js @@ -18,7 +18,8 @@ exports.level = { "ru_RU": "Можно использовать либо ветки, либо относительные ссылки (HEAD~), чтобы указать цель для Rebase", "ja" : "リベースする対象の指定には、ブランチ名や相対リファレンス(HEAD~)が使えます", "ko" : "리베이스할 타겟으로 브랜치나 상대 참조(HEAD~)를 사용할 수 있습니다", - "uk" : "ти можеш використовувати гілки чи відносні посилання (HEAD~) щоб вказувати ціль для rebase" + "uk" : "ти можеш використовувати гілки чи відносні посилання (HEAD~) щоб вказувати ціль для rebase", + "vi": "bạn có thể sử dụng tham chiếu tương đối (HEAD~) hoặc nhánh để chỉ định mục tiêu rebase", }, "name": { "en_US": "Interactive Rebase Intro", @@ -32,7 +33,8 @@ exports.level = { "zh_TW": "介紹互動式的 rebase", "ru_RU": "Введение в интерактивный Rebase", "ko" : "인터랙티브 리베이스 소개", - "uk" : "Знайомство з інтерактивним rebase" + "uk" : "Знайомство з інтерактивним rebase", + "vi" : "Giới thiệu về tương tác rebase" }, "startDialog": { "en_US": { @@ -685,7 +687,7 @@ exports.level = { } ] }, - "ko": { + "ko": { "childViews": [ { "type": "ModalAlert", @@ -814,6 +816,71 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Rebase Tương tác", + "", + "Khi bạn biết rõ mình muốn những commit nào (và mã băm tương ứng của chúng) thì Git cherry-pick là công cụ tuyệt vời -- nó đơn giản đến bất ngờ.", + "", + "Nhưng mà lỡ như bạn không biết mình cần commit nào thì sao? May mà git cũng có công cụ cho việc này! Ta có thể dùng rebase tương tác cho việc này -- đó là cách tốt nhất để cân nhắc lựa chọn các commit mà bạn muốn rebase.", + "", + "Hãy đi sâu vào chi tiết nào..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Rebase tương tác nghĩa là dùng lệnh `rebase` với tùy chọn `-i`.", + "", + "Nếu lệnh của bạn có bao hàm tùy chọn này, git sẽ mở một giao diện người dùng để cho bạn biết những commit nào sẽ được sao chép xuống dưới mục tiêu rebase. Nó cũng đồng thời thể hiện mã băm và thông điệp của commit, điều này là tuyệt vời bởi nhờ đó ta có thể phân biệt được chúng.", + "", + "Với git \"thật\", cửa sổ UI (giao diện người dùng) sẽ được mở thông qua một tệp nhờ công cụ chỉnh sửa văn bản như là `vim`. Vì mục đích học tập, tôi đã xây dựng một cửa sổ hội thoại nhỏ mà nó hành xử cũng tương tự như vậy." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Khi hội thoại tương tác rebase bật lên, bạn có thể làm được 3 điều:", + "", + "* Bạn có thể sắp xếp lại commit một cách đơn giản thông qua UI (bạn có thể làm điều này bằng cách kéo thả trên công cụ của chúng tôi).", + "* Bạn có thẻ bỏ qua một vài commit. Điều này được thể hiện qua nút `pick` -- tắt nút `pick` nghĩa là bạn bỏ qua commit đó.", + "* Cuối cùng, bạn có thể nén các commit. Đáng tiếc là trình độ của chúng tôi chưa hỗ trợ được chức năng này do vài vấn đề logic, cho nên tôi sẽ bỏ qua phần này. Nói dơn giản thì -- nó cho phép bạn kết hợp các commit.", + "", + "Tuyệt! Cùng xem qua một ví dụ nào." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Khi bạn bấm nút, một cửa sổ tương tác rebase sẽ xuất hiện. Sắp xếp lại một vài commit (hoặc thậm chí bỏ qua một vài cái) và xem thử kết quả!" + ], + "afterMarkdowns": [ + "BÙÙM! Git sao chép chính xác các commit mà bạn chọn thông qua UI" + ], + "command": "git rebase -i HEAD~4 --aboveAll", + "beforeCommand": "git commit; git commit; git commit; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Để hoàn thành cấp độ này, do an interactive rebase and achieve the order shown in the goal visualization. Remember you can always `undo` or `reset` to fix mistakes :D" + ] + } + } + ] } } }; diff --git a/src/levels/rampup/relativeRefs.js b/src/levels/rampup/relativeRefs.js index 0a8b3da8..7f9c7f8e 100644 --- a/src/levels/rampup/relativeRefs.js +++ b/src/levels/rampup/relativeRefs.js @@ -14,7 +14,8 @@ exports.level = { "de_DE": "Relative Referenzen (^)", "ru_RU": "Относительные ссылки (^)", "ko" : "상대 참조 (^) (Relative Refs)", - "uk": "Відносні посилання" + "uk": "Відносні посилання", + "vi": "Tham chiếu tương đối (^)" }, "hint": { "en_US": "Remember the Caret (^) operator!", @@ -28,7 +29,8 @@ exports.level = { "zh_TW": "不要忘記插入(^)符號!", "ru_RU": "Не забудь оператор `^`", "ko" : "(^)연산자를 기억하세요!", - "uk": "Не забудь оператор `^`" + "uk": "Не забудь оператор `^`", + "vi": "Đừng quên dấu mũ (^)!" }, "startDialog": { "en_US": { @@ -930,6 +932,81 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Tham chiếu tương đối", + "", + "Dịch chuyển trong Git bằng cách chỉ định mã băm(hash) của commit cỏ vẻ hơi buồn tẻ. Trong đời thực thì sẽ không có mô tả git trực quan ngay bên cạnh terminal của bạn đâu, nên nếu bạn muốn nhìn mã băm của commit thì phải dùng `git log` thôi.", + "", + "Hơn nữa, mã băm thực tế thường dài hơn rất nhiều. Ví dụ, mã băm của commit được giới thiệu trong phần trước là `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Đọc mà xoắn hết cả lưỡi...", + "", + "Được cái là Git cũng khá thông minh về mã băm. Nó chỉ yêu cầu bạn chỉ định mã băm đủ để xác định commit. Cho nên tôi có thể đơn giản chỉ cần gõ `fed2` thay vì cái chuỗi dài ngoằng phía trên." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Như tôi đã nói, xác định commit bằng mã băm của nó chẳng hề thuận tiện tẹo nào, đó là tại sao Git có những `tham chiếu tương đối`. Chúng rất tuyệt vời!", + "", + "Với tham chiếu tương đối, bạn có thể bắt đầu từ những nơi có thể ghi nhớ được (như là nhánh `bugFix` hoặc `HEAD`) và làm việc trên đó.", + "", + "Những commits tương đối rất mạnh mẽ, nhưng chúng tôi sẽ chỉ giới thiệu 2 loại đơn giản sau:", + "", + "* Dịch chuyển 1 commit lên trên trong 1 lần với `^`", + "* Dịch chuyển nhiều commit lên trên trong 1 lần với `~`" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Xem thử cái dấu mũ (^) trước nào. Mỗi lần bạn nối nó với một cái tên tham chiếu, bạn đang ra lệnh cho Git tìm kiếm cha của một commit cụ thể.", + "", + "Cho nên `master^` nghĩa là \"cha đầu tiên của `master`\".", + "", + "`master^^` là ông nội (tổ tiên thế hệ 2) của `master`", + "", + "Thử nhảy sang commit trước master nào" + ], + "afterMarkdowns": [ + "BÙUM! Đã xong. Đơn giản hơn gõ mã băm nhiều" + ], + "command": "git checkout master^", + "beforeCommand": "git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Bạn cũng có thể dùng `HEAD` như là tham chiếu tương đối. Thử dùng nó để leo commit vài lần nào" + ], + "afterMarkdowns": [ + "Game là dễ! Du hành ngược thời gian với `HEAD^`" + ], + "command": "git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^", + "beforeCommand": "git commit; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Để hoàn thành cấp độ này, nhảy sang cha của `bugFix`. Tức là tháo `HEAD`.", + "", + "Nếu muốn thì bạn có thể dùng mã băm, nhưng thế thì còn gì vui nữa dùng tham chiếu tương đối đi!" + ] + } + } + ] } } }; diff --git a/src/levels/rampup/relativeRefs2.js b/src/levels/rampup/relativeRefs2.js index 4d269a8c..4a9829b4 100644 --- a/src/levels/rampup/relativeRefs2.js +++ b/src/levels/rampup/relativeRefs2.js @@ -14,7 +14,8 @@ exports.level = { "ja" : "このレベルをクリアするには少なくとも一つの直接リファレンス(hash)を使用する必要があります", "ru_RU": "Понадобится использовать как минимум одну прямую ссылку (хеш), чтобы пройти этот уровень", "ko" : "이번 레벨을 완료하려면 최소 한번은 직접 참조(해시)를 사용해야 합니다.", - "uk": "Тобі потрібно використати як мінімум одне пряме посилання (хеш) щоб пройти цей рівень" + "uk": "Тобі потрібно використати як мінімум одне пряме посилання (хеш) щоб пройти цей рівень", + "vi": "Bạn sẽ cần dùng ít nhất một tham chiếu trực tiếp (mã băm) để hoàn thành cấp độ này" }, "name": { "en_US": "Relative Refs #2 (~)", @@ -28,7 +29,9 @@ exports.level = { "zh_TW": "相對引用二(~)", "ru_RU": 'Относительные ссылки №2', "ko" : "상대 참조 #2 (~)", - "uk": "Відносні посилання №2" + "uk": "Відносні посилання №2", + "vi": "Tham chiếu tương đối #2 (~)", + }, "startDialog": { "en_US": { @@ -841,6 +844,75 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Toán tử \"~\"", + "", + "Giả sử bạn muốn leo lên nhiều cấp trong git. Dùng `^` vài lần thì tù lắm, nên Git đã có dấu ngã (~) cho việc đó.", + "", + "", + "Theo sau toán tử ngã (~) là số lượng cha ông mà bạn muốn leo lên(không bắt buộc). Xem thử làm thật thì thế nào nào" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Hãy chỉ định số lượng commit với `~`." + ], + "afterMarkdowns": [ + "BÙUM! Quá chuẩn luôn -- tham chiếu tương đối tuyệt vời." + ], + "command": "git checkout HEAD~4", + "beforeCommand": "git commit; git commit; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Branch forcing", + "", + "Giờ thì bạn là cao thủ về tham chiếu tương đối rồi, *làm* thật thôi chứ nhỉ.", + "", + "Tôi thì hay thường dùng tham chiếu tương đối để dịch chuyển nhánh. Bạn có thể trực tiếp gán lại nhánh cho commit với cú pháp `-f`. Kiểu như thế này:", + "", + "`git branch -f master HEAD~3`", + "", + "dịch chuyển (ép buộc) nhánh master lên 3 commit phía trên HEAD." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Xem thử cái lệnh trên hoạt động sao nào." + ], + "afterMarkdowns": [ + "Đóóóó! Tham chiếu tương đối cho chúng ta một cách chuẩn xác để trỏ tới `C1` và ép nhánh bằng (`-f`) thì dịch chuyển nhanh chóng nhánh tới đó." + ], + "command": "git branch -f master HEAD~3", + "beforeCommand": "git commit; git commit; git commit; git checkout -b bugFix" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Giờ thì bạn đã thấy cách kết hợp tham chiếu tương đối và ép nhánh, dùng chúng để vượt level tiếp thôi.", + "", + "Để hoàn thành cấp độ này, chuyển `HEAD`, `master`, và `bugFix` đến mục tiêu được xác định của chúng." + ] + } + } + ] } } }; diff --git a/src/levels/rampup/reversingChanges.js b/src/levels/rampup/reversingChanges.js index b1c8f926..c7457c0e 100644 --- a/src/levels/rampup/reversingChanges.js +++ b/src/levels/rampup/reversingChanges.js @@ -15,7 +15,9 @@ exports.level = { "zh_CN": "撤销变更", "zh_TW": "在 git 中取消修改 ", "ru_RU": "Отмена изменений в Git", - "uk": "Відміна змін в Git" + "uk": "Відміна змін в Git", + "vi": "Hoàn tác thay đổi trong Git", + }, "hint": { "en_US": "Notice that revert and reset take different arguments.", @@ -29,7 +31,8 @@ exports.level = { "ko": "revert와 reset이 받는 인자가 다름을 기억하세요", "ja" : "revertとresetとで引数が異なることに注意。", "ru_RU": "Обрати внимание, что revert и reset принимают разные параметры.", - "uk": "Зверни увагу на те що revert та reset приймають різні параметри" + "uk": "Зверни увагу на те що revert та reset приймають різні параметри", + "vi": "Lưu ý rằng hoàn tác(revert) và đặt lại(reset) có những đối số khác nhau.", }, "startDialog": { "en_US": { @@ -789,6 +792,69 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Hoàn tác trong Git", + "", + "Có rất nhiều cách để hoàn tác thay đổi trong Git. Và cũng tương tự như commit, hủy thay đổi trong Git có cả thành phần bậc thấp (tạm thời lưu trữ một số tệp hoặc đoạn độc lập) và thành phần bậc cao (cách mà các thay đổi thực sự bị hủy). Ứng dụng của chúng tôi tập trung vào cái sau.", + "", + "Có 2 cách nguyên thủy để hủy thay đổi trong Git -- một là dùng `git reset` và cách khác là dùng `git revert`. Chúng ta sẽ xem xét từng cái trong hội thoại sau", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "## Git Reset", + "", + "`git reset` hoàn tác bằng cách chuyển tham chiếu của nhánh ngược lên commit cũ hơn. Bạn có thể hiểu nó như kiểu \"viết lại lịch sử;\" `git reset` sẽ dịch chuyển nhánh lên trên như thể commit chưa bao giờ được tạo ra vậy.", + "", + "Cùng xem thử nó trông thế nào nào:" + ], + "afterMarkdowns": [ + "Hay! Git chuyển tham chiếu của master trở lại `C1`; bây giờ kho cá nhân của ta trông như thể commit `C2` chưa bao giờ xảy ra vậy." + ], + "command": "git reset HEAD~1", + "beforeCommand": "git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "## Git Revert", + "", + "Trong khi git reset hoạt động rất tốt tại nhánh cục bộ trên máy cá nhân, cách thức \"viết lại lịch sử\" chẳng hề có tác dụng lên nhánh ở phương xa mà người khác sử dụng.", + "", + "Để có thể hoàn tác và *chia sẻ* hoàn tác đó với người khác, thì ta cần sử dụng `git revert`. Xem thử cách thức nó hoạt động nào" + ], + "afterMarkdowns": [ + "Lạ nhỉ, một commit mới được thả vào bên dưới commit mà ta muốn hoàn tác. Đó là bởi vì commit mới `C2'` này có chứa *thay đổi* -- đó là những thay đổi về hoàn tác commit `C2`.", + "", + "Dùng revert thì bạn có thể đẩy thay đổi mình lên và chia sẻ với người khác." + ], + "command": "git revert HEAD", + "beforeCommand": "git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Để hoàn thành cấp độ này, hoàn tác commit gần nhất trên cả `local` (`cục bộ`) và `pushed` (`được đẩy`). Bạn sẽ hoàn tác tổng cộng 2 commit(một trên mỗi nhánh).", + "", + "Nhớ rằng `pushed` là nhánh ở phương xa và `local` là nhánh địa phương -- như thế thì bạn sẽ chọn được phương án phù hợp." + ] + } + } + ] } } }; diff --git a/src/levels/rebase/manyRebases.js b/src/levels/rebase/manyRebases.js index 6da53c7b..291b2e9a 100644 --- a/src/levels/rebase/manyRebases.js +++ b/src/levels/rebase/manyRebases.js @@ -19,7 +19,8 @@ exports.level = { "zh_CN": "多次 Rebase", "zh_TW": "N次Rebase", "ru_RU": "Rebase over 9000 раз", - "uk" : "Rebase over 9000 разів" + "uk" : "Rebase over 9000 разів", + "vi" : "Rebase hơn 9000 lần" }, "hint": { "en_US": "Remember, the most efficient way might be to only update master at the end...", @@ -33,7 +34,8 @@ exports.level = { "zh_CN": "记住,最后更新 master 分支可能是最高效的方法……", "zh_TW": "要記住喔! 把 master branch 留到最後更新可能是最有效率的方法。", "ru_RU": "Не забудь, что лучше всего сдвинуть мастер в самом конце...", - "uk" : "Не забувай, що краще всього буде перемістити master в самому кінці... " + "uk" : "Не забувай, що краще всього буде перемістити master в самому кінці... ", + "vi" : "Hãy nhớ rằng, cách tốt nhất có lẽ là nên cuối cùng mới cập nhật nhánh `master`... " }, "startDialog": { "en_US": { @@ -251,6 +253,24 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Rebase nhiều nhánh", + "", + "Giời ạ, sao mà nhiều nhánh thế khôn biết! Chuyển hết chúng vào `master` thôi.", + "", + "Nhưng mà cha quản lý lại muốn oái oăm hơn cơ -- hắn muốn tất cả commit xếp thẳng hàng. Nghĩa là cây lịch sử của ta sẽ có `C7'` ở cuối, phía trên là`C6'`, và cứ thế theo đúng thứ tự.", + "", + "Nếu mà nhỡ may bạn làm nhầm thì có thể dùng lệnh `reset` để bắt đầu lại. Hãy nhớ đối chiếu với đáp án của chúng tôi xem bạn có thể hoàn thành với ít câu lệnh hơn không!" + ] + } + } + ] } } }; diff --git a/src/levels/rebase/selectiveRebase.js b/src/levels/rebase/selectiveRebase.js index b38d3ddf..d5030f9d 100644 --- a/src/levels/rebase/selectiveRebase.js +++ b/src/levels/rebase/selectiveRebase.js @@ -18,7 +18,8 @@ exports.level = { "zh_CN": "纠缠不清的分支", "zh_TW": "branch 漿糊", "ru_RU": "Спутанные ветки", - "uk" : "Макарони з гілок" + "uk" : "Макарони з гілок", + "vi" : "Nhánh rối như canh hẹ" }, "hint": { "en_US": "Make sure to do everything in the proper order! Branch one first, then two, then three", @@ -32,7 +33,8 @@ exports.level = { "zh_CN": "确保你是按照正确的顺序来操作!先操作分支 `one`, 然后 `two`, 最后才是 `three`", "zh_TW": "確認你是按照正確的順序來操作!先操作 branch `one`, 然後 `two`, 最後才是 `three`", "ru_RU": "Убедись, что у нас всё по порядку! Сначала ветка `one`, потом `two` и только потом `three`", - "uk": "Переконайся, що все йде за порядком! Спершу гілка `one`, потім `two`, і тільки потім `three`" + "uk": "Переконайся, що все йде за порядком! Спершу гілка `one`, потім `two`, і тільки потім `three`", + "vi": "Hãy chắc chắn rằng bạn làm đúng thứ tự! Nhánh `one` trước, rồi `two`, rồi mới đến `three`" }, "startDialog": { "en_US": { @@ -274,6 +276,26 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Nhánh rối như canh hẹ", + "", + "Chààà, anh bạn! Thử thách lần này hơi khoai đây.", + "", + "Hiện tại thì nhánh `master` đang có nhiều commit hơn các nhánh `one`, `two` và `three`. Vì một lý do nào đó, ta cần cập nhật những commit trên nhánh `master` lên các nhánh còn lại kèm với một vài điều chỉnh .", + "", + "Nhánh `one` thì cần sắp xếp lại và xóa commit `C5`, trong khi đó nhánh `two` thì đơn giản sắp xếp, còn `three` thì chỉ cần một commit!", + "", + "Cố gắng động não tìm ra cách đi nhé -- khi bạn làm xong thì nhớ so sánh với đáp án của chúng tôi bằng lệnh `show solution`. " + ] + } + } + ] } } }; diff --git a/src/levels/remote/clone.js b/src/levels/remote/clone.js index 5ef9ff65..465491c7 100644 --- a/src/levels/remote/clone.js +++ b/src/levels/remote/clone.js @@ -13,7 +13,8 @@ exports.level = { "zh_TW": "介紹 clone", "ru_RU": "Введение в клонирование", "ko" : "Clone 소개", - "uk" : "Знайомство з clone" + "uk" : "Знайомство з clone", + "vi" : "Giới thiệu về clone" }, "hint": { "en_US": "Just git clone!", @@ -27,7 +28,8 @@ exports.level = { "zh_TW": "只要 git clone 就好了", "ru_RU": "Простой git clone!", "ko" : "그냥 git clone 하세요!", - "uk" : "Просто git clone!" + "uk" : "Просто git clone!", + "vi" : "Đơn giản là `git clone`!" }, "startDialog": { "en_US": { @@ -712,6 +714,63 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Remotes(Kho lưu trữ từ xa)", + "", + "Thực ra thì kho remote cũng không khó hiểu lắm đâu. Giờ đây đâu đâu cũng thấy điện toán đám mây nên ai ai cũng tưởng git remote nó là cái gì đó ma thuật lắm, nhưng chúng thực ra chỉ là những bản sao chép ko chứa của bạn lên máy tính khác. Bạn có thể giao tiếp với chúng qua internet, tù đó mà chuyển giao commit qua lại.", + "", + "Vì lẽ đó mà kho remote có những đặc tính tuyệt vời:", + "", + "- Trước hết, có tác dụng như là bản sao dự phòng! Bạn đã biết rằng kho địa phương có thể khôi phục trở lại trạng thái trước đó, nhưng tất cả thông tin đó chỉ được lưu trữ cục bộ. Bằng cách sao chép toàn bộ kho chứa của bạn lên máy tính ở xa, bạn hoàn toàn có thể mất hết dữ liệu tại máy tính mà vẫn tiếp tục làm việc như chưa có gì xảy ra.", + "", + "- Quạn trọng hơn nữa, kho remote khiến lập trình có tính cộng đồng hơn! Bây giờ bản sao dự án của bạn đã được lưu trũ ở nơi khác, bạn bè của bạn có thể đóng góp (hoặc kéo về cập nhật mới nhất) dự án của bạn rất dễ dàng.", + "", + "Trực quan hóa các kho lưu trữ từ xa bằng cách sử dụng các trang web đang trở nên phổ biến hơn (như [Github] (https://github.com/) hoặc [Photypeator] (http://phovenator.org/)), nhưng các kho lưu trữ từ xa * * Luôn luôn ** là trụ cột của các công cụ này, vì vậy điều quan trọng là phải hiểu khái niệm này!" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Câu lệnh của chúng tôi để tạo kho lưu trữ từ xa", + "", + "Cho đến bây giờ, Learn Git Branching đã tập trung dạy về làm việc trên kho chứa _địa phương_ (rẽ nhánh `branch`, hợp nhánh `merge`, dịch chuyển nhánh `rebase`, vân vân ...). Nhưng bây giờ ta lại muốn học về làm việc trên kho lưu trữ từ xa, ta cần một câu lệnh để cài đặt môi trường cho những bài học này. Đó là `git clone`", + "", + "Về mặt kỹ thuật, thì `git clone` thực tế là câu lệnh dùng để tạo một bản sao chép _địa phương_ của khó chứa từ xa (ví dụ từ github chẳng hạn). Nhưng trong Learn Git Branching ta sẽ dùng câu lệnh này hơi khác biệt một chút -- `git clone` sẽ tạo ra một bản sao chép lên kho lưu trữu từ xa dựa trên kho chứa cục bộ của bạn. Điều này hoàn toàn ngược lại với câu lệnh thực tế, nhưng nó giúp ta nhân bản và làm việc với kho lưu trữ từ xa, nên ta sẽ dùng nó trong quá trình học.", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Nào cùng khởi động bằng cách nhìn xem kho lưu trữ từ xa trông như thế nào (trong mô tả của chúng tôi).", + "" + ], + "afterMarkdowns": [ + "Nó đây rồi! Giờ ta đã có kho lưu trữ dự án chúng ta từ xa. Nhìn nó cũng khá tương tự chỉ là được minh họa khác biệt một chút -- đến các cấp độ sau ta sẽ tìm hiểu thêm về cách thức trao đổi nội dung giữa các kho chứa này." + ], + "command": "git clone", + "beforeCommand": "" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Để hoàn thành cấp độ này chỉ cần đơn giản gõ lệnh `git clone` để sao chép kho chứa hiện tại. Ta sẽ học sâu hơn ở các bài học sau." + ] + } + } + ] } } }; diff --git a/src/levels/remote/fakeTeamwork.js b/src/levels/remote/fakeTeamwork.js index ca08387f..ee018853 100644 --- a/src/levels/remote/fakeTeamwork.js +++ b/src/levels/remote/fakeTeamwork.js @@ -14,7 +14,8 @@ exports.level = { "zh_TW": "模擬團隊合作", "ru_RU": "Коллективная работа", "uk" : "Симуляція колективної роботи", - "ko" : "가짜 팀워크" + "ko" : "가짜 팀워크", + "vi" : "Giả lập làm việc nhóm" }, "hint": { "en_US": "remember you can specify the number of commits to fake", @@ -28,7 +29,8 @@ exports.level = { "zh_TW": "你要記得指定要送多少個 commit 出去", "ru_RU": "помните, Вы можете указать количество фейковых коммитов", "uk" : "пам’ятай що ти можеш вказати кількість фейкових комітів", - "ko" : "가장할 커밋의 갯수를 조절할 수 있습니다." + "ko" : "가장할 커밋의 갯수를 조절할 수 있습니다.", + "vi" : "Nhớ rằng bạn có thể chỉ định số lượng commit để giả lập." }, "startDialog": { "en_US": { @@ -680,6 +682,60 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Mô phỏng hợp tác", + "", + "Bây giờ khó đây -- để chuẩn bị cho những bài học tới, chúng tôi cần chỉ bạn cách kéo về những cập nhật có trên kho chứa từ xa.", + "", + "Có nghĩa là ta cần \"giả vờ\" kho chứa từ xa được cập nhật bởi đồng nghiệp / bạn / cộng tác viên của bạn, có khi là một nhánh xác định hoặc là một số commit.", + "", + "Để làm điều này, chúng tôi sẽ giới thiệu cho bạn một lệnh tự tạo `git fakeTeamwork`! Cái tên nói lên tất cả, cùng xem thử bản giới thiệu..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Hành xử mặc định của `fakeTeamwork` đơn giản là tạo ra một commit ở trên nhánh master từ xa" + ], + "afterMarkdowns": [ + "Đó -- kho chứa từ xa đã được cập nhật thêm một commit, và ta chưa tải commit đó xuống vì ta chưa hề chạy lệnh `git fetch`." + ], + "command": "git fakeTeamwork", + "beforeCommand": "git clone" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Bạn cũng có thể chỉ định số lượng commit bằng cách thêm con số đằng sau câu lệnh" + ], + "afterMarkdowns": [ + "Chỉ với một câu lệnh ta có thể giả lập tạo ra 3 commit trên nhánh `foo` từ xa của ta" + ], + "command": "git fakeTeamwork foo 3", + "beforeCommand": "git branch foo; git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Các cấp độ tới sẽ khá là khó, nên ở cấp độ này chúng tôi sẽ yêu cầu bạn thêm một chút.", + "", + "Sao chép một kho chứa từ xa (sử dụng `git clone`), sau đó mô phỏng một số thay đổi trong kho chứa từ xa mà bạn vừa tạo, sau đó thực hiện một số commit trên nhánh cục bộ của riêng bạn, sau đó kéo các thay đổi từ kho chứa từ xa. Nhiều bài học trong một bài." + ] + } + } + ] } } }; diff --git a/src/levels/remote/fetch.js b/src/levels/remote/fetch.js index 29c94e80..274ed8c6 100644 --- a/src/levels/remote/fetch.js +++ b/src/levels/remote/fetch.js @@ -14,7 +14,8 @@ exports.level = { "zh_TW": "git fetch", "ru_RU": "Git fetch", "uk" : "Git fetch", - "ko" : "Git Fetch" + "ko" : "Git Fetch", + "vi" : "Git Fetch" }, "hint": { "en_US": "just run git fetch!", @@ -28,7 +29,8 @@ exports.level = { "zh_TW": "只要下 git fetch 指令", "ru_RU": "Просто выполните git fetch!", "uk" : "Просто виконай git fetch!", - "ko" : "그냥 git fetch를 하세요!" + "ko" : "그냥 git fetch를 하세요!", + "vi" : "Gõ git fetch là được!" }, "startDialog": { "en_US": { @@ -906,6 +908,79 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Fetch", + "", + "Lam việc với git remote về căn bản là chuyển giao dữ liệu _qua_ và _lại_ giữa các kho chứa. Miễn là ta có thể chia sẻ qua lại các commit, ta có thể chia sẻ bất kỳ cập nhật gì được theo dõi bở git (và từ đó chia sẻ thành quả, tập tin mới, ý tưởng mới, thư tình, các kiểu con đà điểu.).", + "", + "Ở bài học này ta sẽ học cách lấy dữ liệu về _từ_ một kho chứa từ xa -- lệnh đó là `git fetch`.", + "", + "Bạn sẽ nhận thấy rằng khi ta cập nhật đại điện kho chứa từ xa, Nhánh _từ xa_ của ta cũng được cập nhật để phản ánh đại diện đó. Điều này liên quan đến bài học trước về nhánh từ xa" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Trước khi đi vào chi tiết về `git fetch`, hãy xem cách nó hoạt động! Ở đây ta có một kho chứa từ xa trong đó chứa 2 commit mà kho chứa địa phương của ta không có." + ], + "afterMarkdowns": [ + "Đó! Commit `C2` và `C3` đã được tải xuống kho chứa cục bộ của ta, và nhánh từ xa `o/master` của ta đã được cập nhật để phản ánh điều này." + ], + "command": "git fetch", + "beforeCommand": "git clone; git fakeTeamwork 2" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Fetch làm gì", + "", + "`git fetch` thực hiện 2 bước chính, và chỉ 2 bước chính. Nó:", + "", + "* tải xuống commit có trên kho chứa từ xa mà kho chứa cục bộ của ta không có, và...", + "* cập nhật nơi mà nhánh từ xa của ta trỏ tới (ví dụ nhánh `o/master`)", + "", + "Về căn bản thì `git fetch` đưa đại diện _địa phương_ của kho chứa từ xa của ta về trạng thái đồng bộ với trạng thái _thực tế_ của kho chứa từ xa (ngay lúc này).", + "", + "Nếu bạn còn nhớ thì trong bài học trước, chúng tôi có đề cập rằng nhánh từ xa phản ánh trạng thái của kho chứa từ xa _kể từ_ kể từ lần cuối bạn tương tác với các nhánh từ xa đó. `git fetch` chính là cách để tương tác với cách nhánh từ xa! Hi vọng chúng tôi đã làm sáng tỏ sự liên kết giữa nhánh từ xa và `git fetch`.", + "", + "`git fetch` thường tương tác với kho chứa từ xa bằng Internet (thông qua các giao thức như `http://` hoặc `git://`).", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### fetch không làm gì", + "", + "Tuy nhiên, `git fetch` không hề thay đổi trạng thái kho chứa _địa phương_ của bạn. Nó sẽ không cập nhật nhánh `master` hay thay đổi bất kỳ điều gì trong hệ thống tập tin hiện tại của bạn.", + "", + "Điều này rất quan trọng, vì nhiều nhà phát triển nghĩ rằng `git fetch` sẽ làm kho chứa địa phương của họ phản ánh trạng thái của kho chúa từ xa. Nó có thể tải xuống tất cả dữ liệu cần thiết, nhưng nó thực tế _không_ thay đổi bất cứ thứ gì trên tập tin địa phương của bạn. Ta sẽ học lệnh để làm điều đó sau :D", + "", + "Nói tóm lại, bạn có thể coi `git fetch` thuần túy như một bước tải xuống." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Để hoàn thành cấp độ này, đơn giản hãy gõ `git fetch` để tải xuống tất cả commit!" + ] + } + } + ] } } }; diff --git a/src/levels/remote/fetchArgs.js b/src/levels/remote/fetchArgs.js index ee0bccd9..1a49d189 100644 --- a/src/levels/remote/fetchArgs.js +++ b/src/levels/remote/fetchArgs.js @@ -14,7 +14,8 @@ exports.level = { "ja" : "Fetchの引数", "ru_RU": "Аргументы для fetch", "ko" : "Fetch의 인자들", - "uk" : "Аргументи для fetch" + "uk" : "Аргументи для fetch", + "vi" : "Tham số fetch" }, "hint": { "en_US": "Pay attention how the commit ids may have swapped! You can read slides again with \"help level\"", @@ -28,7 +29,8 @@ exports.level = { "ja" : "コミットIDの入れ替わりに注意!スライドを復習するには`help level`を実行", "ru_RU": "Обратите внимание на то, как номера коммитов могут меняться! Вы можете прочесть слайды вновь, воспользовавшись командой \"help level\"", "ko" : "커밋 ID가 바뀔수도있으니 주의하세요! \"help level\"을 입력하면 슬라이드들을 다시 읽어볼수 있습니다.", - "uk" : "Зверни увагу на те, що номери комітів можуть змінюватися! Слайди уроку можна переглянути ще раз командою \"help level\"" + "uk" : "Зверни увагу на те, що номери комітів можуть змінюватися! Слайди уроку можна переглянути ще раз командою \"help level\"", + "vi" : "Lưu ý id của các commit bị tráo đổi, bạn có thể dùng \"help level\" để đọc lại hội thoại" }, "startDialog": { "en_US": { @@ -1383,6 +1385,129 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Tham số Git fetch", + "", + "Chúng ta vừa tìm hiểu về tham số của git push, sự tuyệt vời của tham số ``, và thậm chí cả refspecs (`:<đích>`). Liệu ta có thể áp dụng điều này vào `git fetch` không nhỉ?", + "", + "Đoán chuẩn rồi đấy! Tham số cho lệnh `git fetch` thực ra *rất, rất* giống với `git push`. Chúng có chung khái niệm nhưng được áp dụng cho hướng ngược lại(vì bây giờ ta tải xuống commit chứ không phải tải lên).", + "", + "Hãy lần lượt đi qua từng khái niệm một..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Tham số ``", + "", + "Nếu bạn chỉ định vị trí cho `git fetch` như câu lệnh dưới:", + "", + "`git fetch origin foo`", + "", + "Git sẽ lênh nhánh `foo` trên kho chứa từ xa, lấy toàn bộ các commit chưa có trên kho chứa cục bộ và thả chúng xuống nhánh `o/foo` ở kho chứa cục bộ.", + "", + "Hãy xem một ví dụ (vẫn là câu lệnh trên nhưng mà trực quan hơn)." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Thông qua chỉ định vị trí..." + ], + "afterMarkdowns": [ + "Ta chỉ tải xuống commit ở trên nhánh `foo` và đặt chúng ở nhánh `o/foo`" + ], + "command": "git fetch origin foo", + "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Có thể bạn sẽ thắc mắc -- tại sao git lại thả các commit xuống nhánh `o/foo` thay vì nhánh `foo` ở kho chứa cục bộ? Tôi tưởng tham số `` tồn tại ở cả kho chứa cục bộ và kho chứa từ xa mà?", + "", + "Chà trong trường hợp này git ứng xử có một chút ngoại lệ đặc biệt, vì có thể bạn đang làm việc trên nhánh `foo` ở kho chứa cục bộ mà bạn không muốn nó bị làm rối!! Điều này liên kết đến bài học trước về `git fetch` -- nó không cập nhật nhánh cục bộ không liên kết nhánh từ xa của bạn(nhánh không có tiền tố `origin/`), nó chỉ tải xuống các commit( mà bạn có thể xem xét hoặc hợp nhất sau).", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "\"Nếu vậy, thì điều gì sẽ xảy ra nếu tôi chỉ định cả nguồn và đích với `:<đích>`?\"", + "", + "Nếu bạn nhất quyết muốn tải commit *trực tiếp* xuống nhánh cục bộ,thì bạn có thể chỉ định điều này bằng cách dùng refspec hai chấm. Bạn không thể nạp commit vào nhánh mà bạn đang đứng, nhưng git sẽ cho phép bạn làm điều này:", + "", + "Đây là cách duy nhất -- `` là vị trí trên kho *từ xa* và `<đích>` là vị trí *cục bộ* để đặt các commit. Điều này hoàn toàn ngược lại với `git push`, và đó là tất nhiên thôi vì ta đang chuyển giao dữ liệu theo hướng ngược lại!", + "", + "Thực tế là, các nhà phát triển rất hiếm khi làm điều này. Tôi giới thiệu về nó chủ yếu là vì muốn giải thích rõ hơn việc `fetch` và `push` là khá tương đồng, chỉ là theo hướng ngược lại." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Lấy một ví dụ điên rồ..." + ], + "afterMarkdowns": [ + "Wao! Thấy chứ, git diễn giải `foo~1` thành một vị trí trên kho chứa từ xa sau đó tải xuống các commit lên nhánh `bar` ở kho chứa cục bộ. Để ý rằng nhánh `foo` và `o/foo` không hề được cập nhật vì ta đã chỉ định đích đến." + ], + "command": "git fetch origin foo~1:bar", + "beforeCommand": "git branch foo; git clone; git branch bar; git fakeTeamwork foo 2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Nếu như đích đến chưa hề tồn tại trước khi tôi chạy lệnh thì sao? Cùng xem lại ví dụ vừa rồi nhưng lần này nhánh `bar` chưa hề tồn tại." + ], + "afterMarkdowns": [ + "Thấy chứ, nó Y HỆT với git push. Git tạo ra đích đến ở kho chứa cục bộ trước khi nạp, cũng giống như git sẽ tạo ra đích đến trên kho chứa từ xa trước khi đẩy (trong trường hợp nó không tồn tại)." + ], + "command": "git fetch origin foo~1:bar", + "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Không có tham số?", + "", + "Nếu lệnh `git fetch` không nhận được bất kỳ tham số nào, nó sẽ tải xuống tất cả các commit có trên kho chứa từ xa lên tất cả các nhánh từ xa ở kho chứa cục bộ..." + ], + "afterMarkdowns": [ + "Khá là đơn giản, nhưng mà cũng nên xem qua thử." + ], + "command": "git fetch", + "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork master" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Được rồi, lý thuyết như vậy là đủ rồi! Để hoàn thành cấp độ này, hãy chỉ nạp những commit được chỉ định trong mô tả mục tiêu. Thoải mái ứng biến với những câu lệnh nhé!", + "", + "Bạn sẽ phải chỉ định nguồn và dích cho lệnh fetch. Chú ý đến mô tả mục tiêu vì các ID có thể bị xáo trộn!" + ] + } + } + ] } } }; diff --git a/src/levels/remote/fetchRebase.js b/src/levels/remote/fetchRebase.js index f1d6fdde..b5ca6fca 100644 --- a/src/levels/remote/fetchRebase.js +++ b/src/levels/remote/fetchRebase.js @@ -14,7 +14,8 @@ exports.level = { "ja" : "履歴の分岐", "ru_RU": "Расхождение в истории", "uk" : "Розбіжності в історії", - "ko" : "엇갈린 히스토리" + "ko" : "엇갈린 히스토리", + "vi" : "Dị biệt lịch sử" }, "hint": { "en_US": "check out the ordering from the goal visualization", @@ -28,7 +29,8 @@ exports.level = { "fr_FR": "regardez l'ordre dans la fenêtre de visualisation d'objectif", "ru_RU": "проверьте сортировку в визуализации цели", "uk" : "перевірте порядок в візуалізації цілі", - "ko" : "순서는 goal을 참고하세요" + "ko" : "순서는 goal을 참고하세요", + "vi" : "kiểm tra kỹ thứ tự trên mô hình mục tiêu" }, "startDialog": { "en_US": { @@ -1747,6 +1749,149 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Diverged Work", + "", + "Cho đến giờ ta đã biết cách `kéo`(`pull`) commit từ nơi khác về và cách `đẩy`(`push`) lên những thay đổi của ta. Chúng nhìn có vẻ khá đơn giản, vậy tại sao người ta lại thấy lúng túng về chúng?", + "", + "Khó khăn đến từ sự *dị biệt* của cây lịch sử trên kho chứa từ xa. Trước khi đi vào thảo luận chi tiết vấn đề này, hãy xem qua một ví dụ...", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Tưởng tượng bạn sao chép một kho chứa vào thứ Hai và bắt đầu phát triển một tính năng mới. Đến thứ Sáu thì bạn đã sẵn sàng để xuất bản thành quả của mình -- nhưng không! Đồng nghiệp của bạn đã viết thêm hàng loạt mã trong một tuần vừa rồi và điều này làm cho chức năng của bạn trở nên lỗi thời. Và họ cũng đã xuất bản những commit này lên kho chứa từ xa chung, vậy giờ thành quả của *bạn* lại dựa trên phiên bản *cũ* của dự án mà nó không còn thích đáng nữa.", + "", + "Trong trường hợp này, lệnh `git push` trở lên khá nhập nhằng. Nếu bạn dùng `git push`, liệu git nên thay đổi kho chứa từ xa trơ rveef trạng thái ngày thứ Hai? Hay nó nên cố gắng thêm mã của bạn vào trong khi không xóa mã mới? Hay là nó sẽ bỏ qua hoàn toàn mã của bạn vì nó đã lỗi thời?", + "", + "Vì có quá nhiều tình huống mơ hồ (dị biệt lịch sử), git sẽ không cho phép bạn `đẩy`(`push`) thay đổi của mình. Nó sẽ ép bạn phải sát nhập trạng thái mới nhất của kho chứa từ xa vào thành phẩm của mình trước khi chia sẻ chúng." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Nói quá nhiều rồi! Đi vào hành động thôi" + ], + "afterMarkdowns": [ + "Thấy chứ? Không có gì xảy ra cả vì lệnh bị thất bại. `git push` thất bại vì commit mới nhất của bạn: `C3` dựa trên commit `C1` ở nhánh từ xa. Nhánh đó đã được cập nhật lên commit `C2`, nên git từ chối lệnh đẩy của bạn" + ], + "command": "git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Vậy thì giải quyết tình huống này sao giờ? Đơn giản thôi, tất cả những gì bạn cần làm là khiến cho thành quả của mình dựa trên phiên bản mới nhất của nhánh từ xa.", + "", + "Có vài cách để làm điều này, nhưng cách trực tiếp nhất là bố trí lại (dùng rebase) để di chuyển thành quả của bạn. Cùng xem cách nó hoạt động nào." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Nào bây giờ trước push ta dùng rebase thì..." + ], + "afterMarkdowns": [ + "Bùùm! Ta đã cập nhật nhánh từ xa trong kho chứ cục bộ với `git fetch`, dịch chuyển thành quả của mình để phản ánh thay đổi mới của kho chứa từ xa, sau đó đẩy chúng lên với `git push`" + ], + "command": "git fetch; git rebase o/master; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Có cách nào khác để cập nhật thành quả của mình khi kho chứa từ xa được cập nhật không? Tất nhiên rồi! Hãy xem xét điều tương tự với `merge`.", + "", + "Mặc dù `git merge` không dịch chuyển commit của bạn (thay vì đó nó tạo ra một commit hơp nhất), đó là cách để nói với git rằng bạn đã kết hợp tất cả thay đổi từ nhánh từ xa. Đó là bởi vì bây giờ nhánh từ xa đã trở thành một *tổ tiên* của nhánh cục bộ của bạn, nghĩa là commit của bạn có thể tham chiếu điến tất cả commit có ở nhánh tù xa.", + "", + "Hãy xem qua bản biểu diễn sau..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Giờ nếu ta dùng merge thay vày rebase thì..." + ], + "afterMarkdowns": [ + "Bùùm! Ta đã cập nhật đại diện nhánh từ xa tại kho chứa địa phương với `git fetch`, *hợp nhất* (*merge*) thành quả mới vào thành quả của ta (để phản ánh thay đổi ở nhánh từ xa), sau đó đẩy chúng lên với `git push`" + ], + "command": "git fetch; git merge o/master; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Tuyệt vời! Có cách nào để làm việc này mà không phải gõ nhiều lệnh thế không nhỉ?", + "", + "Tất nhiên rồi -- bạn đã biết rằng `git pull` là lệnh tắt của fetch và merge. Tương tự như vậy, `git pull --rebase` là lệnh tắt của fetch và rebase!", + "", + "Hãy xem thử cách lệnh tắt này hoạt động ra sao." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Trước tiên với `--rebase`..." + ], + "afterMarkdowns": [ + "Giống hệt như trước! Chỉ là lệnh ngắn hơn." + ], + "command": "git pull --rebase; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Và giờ với lệnh `pull` thông thường" + ], + "afterMarkdowns": [ + "Lại một lần nữa, chính xác y hệt như trước!" + ], + "command": "git pull; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Quy trình tìm nạp (fetch), bố trí lại/hợp nhất (rebase/merge), và đẩy (push) là khá phổ biết. Ta sẽ xem xét các phiên bản phức tạp hơn của những quy trình này ở các bài học sau, còn bây giờ thì hãy tập trung vào bài này đã.", + "", + "Để giải quyết cấp độ này, hãy làm các bước sau:", + "", + "* Nhân bản kho chứa của bạn", + "* Giả lập làm việc nhóm (1 commit)", + "* Tạo ra 1 commit địa phương", + "* Xuất bản thành quả của bạn dùng *rebase*" + ] + } + } + ] } } }; diff --git a/src/levels/remote/mergeManyFeatures.js b/src/levels/remote/mergeManyFeatures.js index 136a202c..b06c89d0 100644 --- a/src/levels/remote/mergeManyFeatures.js +++ b/src/levels/remote/mergeManyFeatures.js @@ -14,7 +14,8 @@ exports.level = { "fr_FR": "Fusionner avec les branches distantes", "ru_RU": "Слияние с удалённым репозиторием", "ko" : "원격 작업과 merge하기", - "uk" : "Мердж з віддаленим репозиторієм" + "uk" : "Мердж з віддаленим репозиторієм", + "vi" : "Hợp nhất nhánh từ xa" }, "hint": { "en_US": "Pay attention to the goal tree!", @@ -28,7 +29,8 @@ exports.level = { "fr_FR": "Respectez l'arbre représentant l'objectif !", "ru_RU": "Внимательно посмотрите на цель уровня!", "ko" : "goal을 잘 살펴보세요!", - "uk" : "Уважно подивись як має виглядати результат!" + "uk" : "Уважно подивись як має виглядати результат!", + "vi" : "Hãy để ý đến cây mục tiêu!" }, "compareOnlyMaster": true, "startDialog": { @@ -571,6 +573,51 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Tại sao không hợp nhất?", + "", + "Để có thể đẩy cập nhật của bạn lên kho nhánh từ xa, tất cả những gì bạn cần làm là *kết nạp* thay đổi mới nhất từ nhánh từ xa. Nghĩa là bạn có thể dùng tái bố trí *hoặc* hợp nhất với nhánh từ xa (ví dụ `o/master`).", + "", + "Vậy ta có thể sử dụng một trong 2 cách, thì tại sao đến giờ ta chỉ tập trung vào tái bố trí trong các bài học? Tại sao khi làm việc với nhánh từ xa lại ta lại không thích `hợp nhất` (`merge`)?", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Trong cộng đồng phát triền phần mềm có rất nhiều tranh luận về ưu, nhươc, khuyết của việc sử dụng tái bố trí(`rebase`) hay hợp nhất(`merge`). Dưới đây là một vài ưu / nhược cơ bản của tái bố trí:", + "", + "Ưu điểm:", + "", + "* Tái bố trí làm cây commit của bạn trông gọn gàng hơn nhiều vì mọi thứ được xếp theo đường thẳng", + "", + "Nhược điểm:", + "", + "* Tái bố trí sửa đổi lịch sử (biểu hiện) của cây commit.", + "", + "Ví dụ, commit `C1` có thể bố trí lên *sau* `C3`. Thế là `C1'` biểu hiện như là nó xuất hiện sau `C3` trong khi thực tế nó được hoàn thành trước đó.", + "", + "Có những nhà phát triển muốn tôn trọng tính lịch sự nên họ ưa thích hợp nhất hơn. Những người khác (như tôi chẳng hạn) thì thiên về tái bố trí hơn vì muốn có cây commit gọn gàng. Rốt cục cũng là thiên hướng thôi :D" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ở cấp độ này, hãy thử giải bài tập trước nhưng mà với *hợp nhất*. Có lẽ bài này hơi thừa nhưng mà nó mịnh họa quan điểm trên rõ ràng hơn." + ] + } + } + ] } } }; diff --git a/src/levels/remote/pull.js b/src/levels/remote/pull.js index a19a0f80..59802a2a 100644 --- a/src/levels/remote/pull.js +++ b/src/levels/remote/pull.js @@ -14,7 +14,8 @@ exports.level = { "fr_FR": "Git pull", "ru_RU": "Git pull", "uk" : "Git pull", - "ko" : "Git pull" + "ko" : "Git pull", + "vi" : "Git pull" }, "hint": { "en_US": "Just run git pull!", @@ -28,7 +29,8 @@ exports.level = { "fr_FR": "Utilisez facilement git pull !", "ru_RU": "Запустите комманду git pull !", "uk" : "Просто виконай git pull !", - "ko" : "그냥 git pull을 하세요!" + "ko" : "그냥 git pull을 하세요!", + "vi" : "Đơn giản là gõ git pull!", }, "startDialog": { "en_US": { @@ -738,6 +740,65 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Pull", + "", + "Ta đã biết cách dùng `git fetch` để nạp các commit từ kho chứa từ xa, giờ hãy cập nhật các commit này vào các nhánh địa phương!", + "", + "Thực ra thì có nhiều cách đề làm điều này -- một khi bạn đã có các commit này ở ko chứa địa phương, bạn có thể hợp nhất chúng như với các commit ở các nhánh khác. Nghĩa là bạn có thể sử dụng các câu lệnh sau:", + "", + "* `git cherry-pick o/master`", + "* `git rebase o/master`", + "* `git merge o/master`", + "* etc., etc.", + "", + "Thực tế thì, quá trình *nạp* commit từ kho chứa từ xa và *hợp nhất* chúng phổ biết đến nỗi git cung cấp một câu lệnh để làm cả 2 điều này một lúc! Đó là `git pull`." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Trước tiên hãy xem quá trình `nạp` và `hợp nhất` được thực hiện một cách tuần tự" + ], + "afterMarkdowns": [ + "Bùùm -- ta tải xuống commit `C3` với lệnh `git fetch` rồi sau đó hợp nhất nó với lệnh `git merge o/master`. Giờ thì nhánh `master` đã phản ánh trạng thái mới từ kho chứa từ xa (trong trường hợp này là `origin`)" + ], + "command": "git fetch; git merge o/master", + "beforeCommand": "git clone; git commit; git fakeTeamwork" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Nếu thay vì dó ta dùng `git pull` thì điều gì xảy ra?" + ], + "afterMarkdowns": [ + "Cũng như nhau! Điều đó có nghĩa là `git pull` về cơ bản là cách làm tắt cho việc thực hiện tuần tự `git fetch` sau đó là hợp nhất các nhánh từ xa được nạp." + ], + "command": "git pull", + "beforeCommand": "git clone; git commit; git fakeTeamwork" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ta sẽ tìm hiều chi tiết về `git pull` sau (bao gồm các tùy chọn và tham số), còn bây giờ thì cứ dùng thử nó ở cấp độ này đã.", + "", + "Nhớ rằng -- bạn có thể giải quyết cấp độ này với `fetch` và sau đó `merge`, nhưng mà như thế thì lại tốn têm một câu lệnh :P" + ] + } + } + ] } } }; diff --git a/src/levels/remote/pullArgs.js b/src/levels/remote/pullArgs.js index c719162a..3b624b29 100644 --- a/src/levels/remote/pullArgs.js +++ b/src/levels/remote/pullArgs.js @@ -14,7 +14,8 @@ exports.level = { "fr_FR": "Arguments de pull", "ru_RU": "Аргументы для pull", "ko" : "pull 인자들", - "uk" : "Аргументи pull" + "uk" : "Аргументи pull", + "vi" : "Tham số pull" }, "hint": { "en_US": "Remember that you can create new local branches with fetch/pull arguments", @@ -28,7 +29,8 @@ exports.level = { "fr_FR": "Vous pouvez aussi créer une nouvelle branche locale avec les arguments de fetch/pull", "ru_RU": "Напоминаю, что новые ветки можно создавать и с помощью команд fetch/pull", "ko" : "fetch/pull 과 인자들로 새 로컬 브랜치를 생성할수 있다는것을 기억하세요.", - "uk" : "Пам'ятай, що ти можеш створювати нові гілки, використовуючи fetch/pull з аргументами" + "uk" : "Пам'ятай, що ти можеш створювати нові гілки, використовуючи fetch/pull з аргументами", + "vi" : "Nhớ rằng,bạn có thể tạo nhánh cục bộ mới với tham số của fetch/pull" }, "startDialog": { "en_US": { @@ -844,6 +846,80 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Tham số git pull", + "", + "Giờ thì bạn đã biết gần như là *tất cả* về tham số của `git fetch` và `git push`, thế thì hầu như chẳng còn gì mới cho git pull cả :)", + "", + "Đó và vì nói cho cùng thì git pull *về thực tế* cũng chỉ là lệnh tắt cho tìm nạp và sau đó là hợp nhất những gì vừa mới được nạp. Bạn có thể coi nó như là chạy lệnh git fetch với *cùng* tham số được chỉ định và sau đó hợp nhất các commit vào *nơi* được chỉ định.", + "", + "Điều này được áp dụng kể cả khi bạn sử dụng những tham số phức tạp đến độ điên rồ. Hãy xem qua một vài ví dụ:" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Dưới đây là một vài câu lệnh tương đồng nhau trong git:", + "", + "`git pull origin foo` tương đương với:", + "", + "`git fetch origin foo; git merge o/foo`", + "", + "Và...", + "", + "`git pull origin bar~1:bugFix` tương đương với:", + "", + "`git fetch origin bar~1:bugFix; git merge bugFix`", + "", + "Thấy chứ? git pull thực ra chỉ là lệnh tắt cho fetch + merge, và tất cả những gì git pull quan tâm là nơi mà các commit sẽ tới (tham số `đích` mà nó diễn giải được trong quá trình nạp).", + "", + "Hãy xem qua một bản giới thiệu:" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Nếu ta chỉ định vị trí để nạp, mọi thứ diễn ra như với git fetch nhưng giờ đây có thêm một bước đó là ta hợp nhất những gì mà ta đã nạp" + ], + "afterMarkdowns": [ + "Thấy chứ! Bằng cách chỉ định nhánh `master` ta tải các commit xuống nhánh `o/master` như thường lệ. Sau đó hợp nhất nhánh `o/master` vào nhánh cục bộ mà ta đang đứng, nhánh mà *không phải* nhánh cục bộ `master`. Nhờ vậy mà ta có thể chạy cùng một lệnh git pull(với cùng tham số) nhiều lần ở những vị trí khác nhau để áp dụng cùng cập nhật lên các nhánh khác nhau." + ], + "command": "git pull origin master", + "beforeCommand": "git clone; go -b bar; git commit; git fakeTeamwork" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Điều này có hoạt động với đích và nguồn không? Đoán đúng rồi đấy! Cùng xem thử nào:" + ], + "afterMarkdowns": [ + "Wao, quá NHIỀU trong một câu lệnh. Ta tạo ra một nhánh cục bộ là `foo`, tải commit xuống từ nhánh từ xa master xuống nhánh `foo` đó, và sau đó hợp nhất commit vào nhánh `bar` mà ta đang đứng. Đủ thứ luôn!!!" + ], + "command": "git pull origin master:foo", + "beforeCommand": "git clone; git fakeTeamwork; go -b bar; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Được rồi, để kết thúc khóa học, hãy đạt đến mục tiêu được mô tả. Bạn sẽ cần tải xuống vài commit, tạo ra vài nhánh mới, và hợp nhất những nhánh đó sang những nhánh khác, nhưng mà đừng dùng nhiều lệnh quá nhé :P" + ] + } + } + ] } } }; diff --git a/src/levels/remote/push.js b/src/levels/remote/push.js index 92a3f681..a124d771 100644 --- a/src/levels/remote/push.js +++ b/src/levels/remote/push.js @@ -17,7 +17,8 @@ exports.level = { "fr_FR": "Git push", "ru_RU": "Git push", "uk" : "Git push", - "ko" : "Git push" + "ko" : "Git push", + "vi" : "Git push" }, "hint": { "en_US": "Remember you have to clone before you can push!", @@ -30,7 +31,8 @@ exports.level = { "fr_FR": "Rappelez-vous que vous devez cloner avant de pouvoir faire un push !", "ru_RU": "Помните, что прежде чем push-ить вам нужно склонировать репозиторий!", "uk" : "Пам’ятай, що перед тим як щось push-нути потрібно склонувати репозиторій!", - "ko" : "push를 하기전에 clone을 먼저해야 된다는것을 기억하세요!" + "ko" : "push를 하기전에 clone을 먼저해야 된다는것을 기억하세요!", + "vi" : "Nhớ rằng bạn phải clone trước khi push!" }, "startDialog": { "en_US": { @@ -543,6 +545,49 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Push", + "", + "Được rồi, ta đã biết cách nạp thay đổi từ kho chứa từ xa và kết hợp chúng vào các nhánh cục bộ. Khá là tuyệt rồi... nhưng nếu tôi muốn chia sẻ tác phẩm tuyệt vời _của tôi_ với mọi người khác thì sao?", + "", + "Chà, cách tải lên thì phải ngược với tải xuống rồi. Vậy thì đối nghịch của `git pull`(kéo) là gì? `git push`(đẩy)!", + "", + "`git push` có trách nhiệm tải lên thay đổi _của bạn_ vào nhánh từ xa được chỉ định và cập nhật nhánh đó để kết hợp với commit đẩy lên của bạn. Một khi lệnh `git push` hoàn thành, tất cả bạn bè của bạn có thể tải xuống thay đổi của nhánh từ xa đó đó.", + "", + "Bạn có thể xem `git push` là câu lệnh để \"xuất bản\" thành quả công việc của bạn. Lệnh này có nhiều tính năng tinh tế mà ta sẽ tìm hiểu nhanh thôi, nhưng giờ hãy cứ bắt đầu với từng bước nhỏ đã...", + "", + "*lưu ý --`git push` mà không có tham số hành xử tùy biến phụ thuộc vào cài đặt của git là `push.default`. Giá trị mặc định cho cài đặt này phụ thuộc vào phiên bản git mà bạn đang sử dụng, còn ở bài học của chúng ta thì ta sẽ sử dụng giá trị `upstream` (ngược dòng). Bây giờ thì đó chưa phải là vấn đề gì lớn, nhưng chúng tôi khuyến nghị bạn kiểm tra cài đặt của mình trước khi đẩy lên dự án của bạn.*" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Ở đây ta có một vài thay đổi mà kho chứa từ xa không có. Hãy tải chúng lên!" + ], + "afterMarkdowns": [ + "Đó -- kho chứa từ xa đã nhận được commit `C2`, nhánh `master` ở kho chứa từ xa đã được cập nhật lên `C2`, và phản chiếu nhánh từ xa *của ta* (`o/master`) cũng được cập nhật luôn. Mọi thứ đã đồng bộ!" + ], + "command": "git push", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Để hoàn thành cấp độ này, đơn giản là hãy chia sẻ 2 commit mới với kho chứa từ xa. Chuẩn bị tinh thần nhé, vì các bài học sẽ khó dần lên nhiều đấy!" + ] + } + } + ] } } }; diff --git a/src/levels/remote/pushArgs.js b/src/levels/remote/pushArgs.js index f1810aec..5fb6db85 100644 --- a/src/levels/remote/pushArgs.js +++ b/src/levels/remote/pushArgs.js @@ -17,7 +17,8 @@ exports.level = { "fr_FR": "Arguments de git push", "ru_RU": "Аргументы git push", "ko" : "git push의 인자들", - "uk" : "Аргументи git push" + "uk" : "Аргументи git push", + "vi" : "Tham số git push" }, "hint": { "en_US": "You can always look at the last slide of the dialog with \"objective\"", @@ -31,7 +32,8 @@ exports.level = { "fr_FR": "Vous pouvez toujours regarder le dernier slide des dialogues en tapant \"objective\".", "ru_RU": "Вы всегда можете ознакомиться с последним слайдом, воспользовавшись \"objective\".", "ko" : "대화창의 마지막 슬라이드를 \"objective\"로 다시 볼 수 있습니다.", - "uk" : "Завжди можна подивитися останній слайд діалогу за допомогою \"objective\"" + "uk" : "Завжди можна подивитися останній слайд діалогу за допомогою \"objective\"", + "vi" : "Bạn có thể sử dụng \"objective\" để đọc trang cuối của cửa sổ hộp thoại" }, "startDialog": { "en_US": { @@ -840,6 +842,81 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Tham số đẩy", + "", + "Tuyệt! Bạn đã biết đến theo dõi từ xa, giờ thì ta có thể tìm hiểu sâu hơn về cách hoạt động của đẩy( `git push`), tìm nạp(`git fetch`) và kéo(`git pull`). Ta sẽ giải quyết từng câu lệnh một nhưng về căn bản chúng khá là giống nhau.", + "", + "Trước hết hãy xem qua `git push`. Trong bài học về theo dõi từ xa bạn đã biết rằng git sử dụng thuộc tính(nhánh từ xa mà nó \"theo dõi\") của nhánh hiện tại để xác định kho và nhánh từ xa để đẩy. Git làm việc này mà không cần tham số chỉ định, nhưng lệnh git push có thể thêm tham số dưới dạng sau:", + "", + "`git push `", + "", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Tham số `` là gì vậy? Chúng ta sẽ đi sâu vào chi tiết sau sau, hãy xem ví dụ trước. Đưa ra câu lệnh:", + "", + "`git push origin master`", + "", + "được dịch lại là:", + "", + "*Chuyển sang nhánh \"master\" trong kho lưu trữ cục bộ, nhận tất cả các commit và tìm nhánh \"master\" trong kho chứa từ xa tên là \"origin\". Thêm tất cả các commit không có trong nhánh đó và báo cho tôi biết khi nào hoàn tất.*", + "", + "Bằng cách chỉ định `master` trong tham số \"vị trí\",ta báo với git nơi mà commit *xuất phát* và nơi chúng *sẽ đến*. Về căn bản nó là \"địa điểm\" để đồng bộ hóa 2 kho chứa.", + "", + "Lưu ý rằng ta ta đã thông báo cho gi tất cả thông tin cần thiết( thông qua chỉ định 2 tham số), nó sẽ không quan tâm nhánh mà ta đang đứng!" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Hãy xem xét một ví dụ về việc xác định tham số. Lưu ý vị trí nhánh mà ta đang đứng." + ], + "afterMarkdowns": [ + "Được rồi! Bằng cách chỉ định các tham số, nhánh `master` trong kho lưu trữ từ xa đã được cập nhật." + ], + "command": "git checkout C0; git push origin master", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Giả sử ta không chỉ định các tham số thì sao? Điều gì sẽ xảy ra?" + ], + "afterMarkdowns": [ + "Lệnh thất bại (như bạn có thể thấy, không có gì xảy ra)! Bởi vì `HEAD` không trỏ đến nhánh nào có theo dõi từ xa." + ], + "command": "git checkout C0; git push", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Được rồi, trong cấp độ này hãy cập nhánh `foo` và `master` trên kho lưu trữ từ xa. Cái khó là ở cấp độ này lệnh `git checkout` đã bị vô hiệu hóa!", + "", + "*Chú ý: Các nhánh từ xa được đánh dấu bằng tiền tố `o/` bời vì UI của chúng tôi không chứa được hết `origin/`. Đừng lo ", + "về vấn đề này... đơn giản cứ dùng `origin` như bình thường thôi.*" + ] + } + } + ] } } }; diff --git a/src/levels/remote/pushArgs2.js b/src/levels/remote/pushArgs2.js index 80a104bb..5683a235 100644 --- a/src/levels/remote/pushArgs2.js +++ b/src/levels/remote/pushArgs2.js @@ -14,7 +14,8 @@ exports.level = { "fr_FR": "Arguments de git push -- toujours plus !", "ru_RU": "Аргументы для push -- расширенная версия!", "ko" : "git push 인자 -- 확장판!", - "uk" : "Розширені аргументи git push!" + "uk" : "Розширені аргументи git push!", + "vi" : "Tham số git push -- bản mở rộng!" }, "hint": { "en_US": "Remember you can admit defeat and type in \"show solution\" :P", @@ -28,7 +29,8 @@ exports.level = { "fr_FR": "N'oubliez pas que vous pouvez toujours déclarer forfait avec \"show solution\" :P", "ru_RU": "Помните, Вы всегда можете признать своё поражение, набрав команду \"show solution\" (показать решение) :P", "ko" : "혹시 아세요? 패배를 인정하고 \"show solution\"을 입력할 수 있다는 걸요 :P", - "uk" : "Пам'ятай, ти завжди можеш визнати поразку і підглянути рішення командою \"show solution\" :P" + "uk" : "Пам'ятай, ти завжди можеш визнати поразку і підглянути рішення командою \"show solution\" :P", + "vi" : "Nhớ rằng, bạn có thể thừa nhận thất bại và gõ \"show solution\" :P" }, "startDialog": { "en_US": { @@ -800,6 +802,76 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Chi tiết về tham số ``", + "", + "Nhớ lại học trước, khi chỉ định tham số `` là `master` cho lệnh `git push`, ta cũng đã chỉ định nguồn và đích cho các commit.", + "", + "Có thể bạn sẽ thắng mắc -- Nếu như ta muốn nguồn và đích khác đi thì sao? Nếu như ta muốn đẩy commit từ nhánh cục bộ `foo` lên nhánh từ xa `bar` thì sao?", + "", + "Chà đáng tiếc là điều này là bất khả thi tron git... đùa thôi! Tất nhiên là làm được chứ :)... git có nhiều và rất nhiều lựa chọn linh động(có lẽ là quá nhiều)", + "", + "Hãy xem cách nó hoạt động ..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Để chỉ định `` cho cả nguồn và đích, chỉ cần sử dụng dấu hai chấm `:` để kết nối cả hai:", + "", + "`git push origin :<đích>`", + "", + "Giá trị thực của tham số này là một refspec, \"refspec\" là một từ tự tạo, nghĩa là một vị trí được Git nhận ra (chẳng hạn như nhánh `foo` hoặc` HEAD ~ 1`).", + "", + "Một khi bạn đã chỉ định các nguồn và đích độc lập, bạn có thể thao tác với kho chứa từ xa một cách khá thú vị và chính xác, hãy xem bản demo!" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Nhớ rằng, `nguồn` là bất kỳ vị trí nào mà git hiểu:" + ], + "afterMarkdowns": [ + "Wao! Lệnh này khá phức tạp, nhưng mà hợp lý -- git diễn giải `foo^` thành một vị trí, tải lên tất cả các commit từ đó trở về trước mà chưa có trên nhánh đích rồi cập nhật nó." + ], + "command": "git push origin foo^:master", + "beforeCommand": "git clone; go -b foo; git commit; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Nếu như đích đến mà bạn muốn không tồn tại thì sao? Chẳng sao cả! Đơn giản hãy gõ tên nhánh và git sẽ tạo nhánh đó trên kho chứa từ xa cho bạn." + ], + "afterMarkdowns": [ + "Tuyệt vời, thấy git thú vị không :D" + ], + "command": "git push origin master:newBranch", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ở cấp độ này, hãy hoàn thành mục tiêu được mô tả, và hãy nhớ cấu trúc:", + "", + "`:<đích>`" + ] + } + } + ] } } }; diff --git a/src/levels/remote/pushManyFeatures.js b/src/levels/remote/pushManyFeatures.js index 3069169a..66599bd7 100644 --- a/src/levels/remote/pushManyFeatures.js +++ b/src/levels/remote/pushManyFeatures.js @@ -14,7 +14,8 @@ exports.level = { "fr_FR": "Rappelez-vous que vous pouvez toujours utiliser les commandes undo et reset.", "ru_RU": "Помни - ты всегда можешь отменить команды с помощью undo или reset", "ko" : "명령어를 undo와 reset으로 되돌릴 수 있다는 것을 잊지마세요", - "uk" : "Пам'ятай, ти в будь-який момент можеш використовувати команди undo або reset" + "uk" : "Пам'ятай, ти в будь-який момент можеш використовувати команди undo або reset", + "vi" : "Nhớ rằng bạn luôn luôn có thể hoàn tác hoặc soạn lại câu lệnh " }, "name": { "en_US": "Push Master!", @@ -28,7 +29,8 @@ exports.level = { "fr_FR": "Maître du push !", "ru_RU": "Push Мастер!", "ko" : "Push Master!", - "uk" : "Push Maйстер!" + "uk" : "Push Maйстер!", + "vi" : "Push Master!" }, "compareOnlyMasterHashAgnostic": true, "startDialog": { @@ -667,6 +669,59 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Sáp nhập các nhánh tính năng", + "", + "Giờ thì bạn đã quen thuộc với tìm nạp, kéo và đẩy, bây giờ chúng tôi sẽ kiểm tra kỹ năng của bạn với một quy trình làm việc mới.", + "", + "Trong các dự án lớn, các nhà phát triển thường làm việc trên các nhánh tính năng (được phân nhánh từ `master`) và chỉ thực hiện tích hợp sau khi công việc hoàn thành. Điều này tương tự như mô tả trong bài học trước (đẩy nhánh bên sang kho lưu trữ từ xa), nhưng chúng ta sẽ đi sâu hơn một chút trong phần này.", + "", + "Một vài nhà phát triển chỉ thực hiện đẩy và kéo khi ở trên nhánh `master` -- như vậy thì nhánh `master` luôn luôn được cập nhật với nhánh từ xa (`o/master`).", + "", + "Vậy nên với quy trình làm việc này chúng tôi đã kết hợp 2 việc:", + "", + "* tích hợp nhánh chức năng lên nhánh `master`, và", + "* đẩy và kéo từ nhánh từ xa" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Hãy xem qua cách cập nhật nhánh `master` và đẩy lên nhánh từ xa hoạt động như thế nào." + ], + "afterMarkdowns": [ + "Ta thực thi 2 câu lệnh làm việc sau:", + "", + "* tái bố trí (`rebase`) thành quả của ta lên commit của nhánh từ xa, và", + "* xuất bản thành quả của ta lên nhánh từ xa" + ], + "command": "git pull --rebase; git push", + "beforeCommand": "git clone; git commit; git fakeTeamwork" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Cấp độ này khá là phức tạp đấy -- để hoàn thành thì hãy xem qua hướng dẫn cơ bản sau:", + "", + "* Có 3 nhánh chức năng là -- `side1` `side2` vả `side3`", + "* Chúng tôi muốn bạn đẩy từng nhánh chức năng, theo thứ tự, lên nhánh từ xa", + "* Nhánh từ xa cũng đã được cập nhật, nên ta cũng cần sát nhập thay đổi đó nữa", + "", + ":O khoai đây! Cố lên nhé, hoàn thành cấp độ này là lên trình nhiều lắm đấy." + ] + } + } + ] } } }; diff --git a/src/levels/remote/remoteBranches.js b/src/levels/remote/remoteBranches.js index 82f630cf..76f5781b 100644 --- a/src/levels/remote/remoteBranches.js +++ b/src/levels/remote/remoteBranches.js @@ -14,7 +14,8 @@ exports.level = { "fr_FR": "Les branches distantes", "ru_RU": "Удалённые ветки", "ko" : "원격 브랜치(remote branch)", - "uk" : "Віддалені гілки" + "uk" : "Віддалені гілки", + "vi" : "Nhánh từ xa" }, "hint": { "en_US": "Pay attention to the ordering -- commit on master first!", @@ -28,7 +29,8 @@ exports.level = { "fr_FR": "Prêtez attention à l'ordre -- les commits sur master d'abord !", "ru_RU": "Уделяйте внимание очерёдности -- сперва commit на master", "ko" : "순서에 주의하세요 -- master에서 먼저 커밋하세요!", - "uk" : "Звертайте увагу на послідовність -- спочатку коміт в мастер!" + "uk" : "Звертайте увагу на послідовність -- спочатку коміт в мастер!", + "vi" : "Chú ý đến thứ tự -- commit trên nhánh master trước!" }, "startDialog": { "en_US": { @@ -762,6 +764,67 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Nhánh Git từ xa", + "", + "Giờ bạn đã thấy cách thức hoạt động của `git clone`, cùng xem xét kỹ hơn những gì đã xảy ra.", + "", + "Điều đầu tiên mà có thể bạn để ý là một nhánh mới xuất hiện trong kho chứa địa phương của ta là `o/master`. Loại nhánh này được gọi là nhánh _từ xa_ (_remote_) ; nhánh từ xa có những thuộc tính đặc biệt vì chúng phục vụ những mục đích duy nhất.", + "", + "Nhánh từ xa phản ánh _trạng thái_ (_state_) của kho chứa từ xa (kể từ lần cuối cùng bạn tương tác với kho chứa từ xa). Chúng giúp bạn hiểu về sự khác biệt giữa công tác trên kho chứa cục bộ với kho chứa từ xa -- một bước quan trọng trước khi chia sẻ công việc của bạn với người khác.", + "", + "Nhánh từ xa có một thuộc tính đặc biệt đó là khi bạn chuyển sang chúng bạn sẽ vào trạng thái tách rời `HEAD`. Git chủ tâm làm việc này vì bạn không thể công tác trực tiếp trên chúng; bạn phải công tác ở nơi khác và chia sẻ thành quả lên kho chứa từ xa (sau đó nhánh từ xa sẽ được cập nhật)." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "###`o/` là gì vậy?", + "", + "Có thể bạn sẽ thắc mắc về ký tự `o/` ở đầu tên nhánh từ xa có ý nghĩa gì. Chà, tên nhánh từ xa cũng có (thiết yếu) quy tắc đặt tên -- chúng được hiển thị dưới dạng:", + "", + "* `/`", + "", + "Do đó, ở trong `o/master` thì `master` là tên nhánh còn `o` là tên kho chứa từ xa.", + "", + "Thực tế thì hầu hết các nhà phát triển đặt tên kho chứa từ xa là `origin` chứ không phải `o`. Nó trở thành thông lệ đến nỗi Git đặt tên `origin` cho kho chứa từ xa khi bạn dùng `git clone` để sao chép một kho chứa.", + "", + "Đáng tiêc là `origin` không khớp trong giao diện của chúng tôi, nên chúng tôi đành phải viết tắt là `o` :( Nhưng hãy nhớ rằng khi dùng git thật sự thì chắc hẳn tên của kho chứa từ xa sẽ là `origin`!", + "", + "Lý thuyết hơi nhiều rồi, đi vào thực hành thôi." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Hãy thử chuyển sang nhánh từ xa xem điểu gì xảy ra" + ], + "afterMarkdowns": [ + "Như bạn thấy, git đưa ta vào trạng thái `HEAD` và không cập nhật nhánh `o/master` khi ta thêm một commit. Đó là bởi vì `o/master` chỉ cập nhật khi kho chứa từ xa được cập nhật." + ], + "command": "git checkout o/master; git commit", + "beforeCommand": "git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Để hoàn thành cấp độ này, commit một lần trên `master` và một lần nữa sau khi chuyển sang `o/master`. Điều nãy sẽ giúp ta hiểu cách nhánh từ xa hành xử, chúng chỉ cập nhật để phản ánh trạng thái của kho chứa từ xa." + ] + } + } + ] } } }; diff --git a/src/levels/remote/sourceNothing.js b/src/levels/remote/sourceNothing.js index 7b7e58c0..f8922fd1 100644 --- a/src/levels/remote/sourceNothing.js +++ b/src/levels/remote/sourceNothing.js @@ -18,7 +18,8 @@ exports.level = { "fr_FR": "Source de rien du tout", "ru_RU": "Пустой источник", "ko" : "Source가 없다", - "uk" : "Нема джерела" + "uk" : "Нема джерела", + "vi" : "Không có nguồn" }, "hint": { "en_US": "The branch command is disabled for this level so you'll have to use fetch!", @@ -33,6 +34,7 @@ exports.level = { "ru_RU": "Команда branch недоступна на этом упражнении, пользуйтесь командой fetch!", "ko" : "branch 명령이 비활성화 되어있습니다. fetch를 사용해야 되요!", "uk" : "Команда branch недоступна на цьому уроці, користуйся командою fetch!", + "vi" : "Lệnh branch đã bị vô hiệu hóa ở cấp độ này nên bạn sẽ phải dùng fetch!" }, "startDialog": { "en_US": { @@ -617,6 +619,59 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Sự kỳ quặc của ``", + "", + "Git lợi dụng tham số `` theo 2 cách khá dị.Hai cách lợi dụng này bắt nguồn từ thục tế là bạn có thể \"không chỉ định\" `nguồn` cho cả git push và git fetch. Bạn có thể làm điều này bằng cách để trống tham số như sau:", + "", + "* `git push origin :side`", + "* `git fetch origin :bugFix`", + "", + "Hãy xem thử 2 câu lệnh này làm việc gì..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Nếu ta đẩy \"không gì cả\" lên một nhánh từ xa thì nó sẽ làm gì? Nó xóa nhánh đó!" + ], + "afterMarkdowns": [ + "Đó, ta đã xóa thành công nhánh `foo` trên kho chứa từ xa bằng cách đẩy \"không gì cả\" lên nó. Khá là hợp lý..." + ], + "command": "git push origin :foo", + "beforeCommand": "git clone; git push origin master:foo" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Cuối cùng, nạp \"không gì cả\" vào một kho chứa cục bộ thực tế sẽ tạo ra một nhánh mới" + ], + "afterMarkdowns": [ + "Khá là quái và dị. Nhưng mà dó là những gì git làm!" + ], + "command": "git fetch origin :bar", + "beforeCommand": "git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ở cấp độ đơn giản này -- bạn chỉ cần xóa một nhánh từ xa và tạo ra một nhánh mới với `git fetch` để hoàn thành!" + ] + } + } + ] } } }; diff --git a/src/levels/remote/tracking.js b/src/levels/remote/tracking.js index 27393e13..87618e3e 100644 --- a/src/levels/remote/tracking.js +++ b/src/levels/remote/tracking.js @@ -14,7 +14,8 @@ exports.level = { "fr_FR": "Suivi de branche distante", "ru_RU": "Слежка за удалённым репозиторием", "ko" : "원격 저장소 추적하기", - "uk" : "Слідкуємо за віддаленим репозиторієм" + "uk" : "Слідкуємо за віддаленим репозиторієм", + "vi" : "Theo dõi từ xa" }, "hint": { "en_US": "Remember there are two ways to set remote tracking!", @@ -28,7 +29,8 @@ exports.level = { "fr_FR": "Rappelez-vous qu'il existe deux façons de configurer le suivi de branche distante !", "ru_RU": "Помни, есть два способа установить слежку за удалённым репозиторием!", "ko" : "원격 추적하기를 설정하는데에는 두가지 방법이 있습니다!", - "uk" : "Пам'ятай, є два способи слідкувати за віддаленим репозиорієм!" + "uk" : "Пам'ятай, є два способи слідкувати за віддаленим репозиорієм!", + "vi" : "Hãy nhớ rằng, có 2 cách để thiết lập theo dõi từ xa!" }, "startDialog": { "en_US": { @@ -1447,6 +1449,124 @@ exports.level = { } } ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Theo dõi nhánh từ xa", + "", + "Trong những bài học vừa qua có một điểu có vẻ như là \"ma thuật\" đó là git lại biết được nhánh `master` có liên kết đến nhánh `o/master`. Đúng là chúng có tên tương tự và nhánh `master` ở kho chứa từ xa có kết nối đến nhánh `master` ở kho chứa địa phương có vẻ như là hợp lý, nhưng kết nối này được thể hiện rõ ràng trong 2 trường hợp:", + "", + "* Trong quá trình thực hiện thao tác kéo, các commit được tải xuống nhánh `o/master` và sau đó *hợp nhất* vào nhánh `master`. Mục tiêu hợp nhất dược ngầm định bởi kết nối này.", + "* Trong quá trình thực hiện thao tác đẩy, thảnh quả trên nhánh `master` được đẩy lên nhánh `master` từ xa (sau dó được biểu thị bằng nhánh `o/master` ở kho chứa địa phương). *Đích đến* của lệnh đẩy được xác định bằng kết nối giữa nhánh `master` và nhánh `o/master`.", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Theo dõi từ xa", + "", + "Nói tóm lại, kết nối giữa nhánh `master` và nhánh `o/master` đơn giản được giải thích bằng thuộc tính \"theo dõi từ xa\" (\"remote tracking\") của các nhánh. Nhánh `master` được thiết lập để theo dõi nhánh `o/master` -- Điều này có nghĩa là nhánh `master` được chỉ định đích của lệnh đẩy và mục tiêu hợp nhất sau khi kéo.", + "", + "Có thể bạn sẽ thắc mắc rằng tại sao thuộc tính này được thiết lập lên nhánh `master` trong khi bạn chẳng hề chạy một câu lệnh nào chỉ định điều này. Chà, khi bạn dùng git để nhân bản kho chứa, thì thuộc tính này đã được tự động thiết lập cho bạn rồi. ", + "", + "Trong quá trình thực hiện nhân bản, git tạo ra nhánh từ xa trên kho chứa địa phương cho tất cả các nhánh trên kho chứa từ xa (các nhánh như `o/master`). Sau đó nó sẽ tạo một nhánh địa phương theo dõi nhánh hoạt dộng hiện tại của kho chứa từ xa, đa phần các trường hợp là nhánh `master`.", + "", + "Một khi quá trình nhân bản hoàn thành, bạn sẽ chỉ có một nhánh địa phương (để bạn không thấy quá tải) nhưng bạn có thể thấy tất cả các nhánh trên kho chứa từ xa (phòng trường hợp bạn thấy tò mò). Đây là phương án tối ưu!", + "", + "Điều này giải thích việc sau khi nhân bản bạn có thể thấy dòng lệnh sau xuất hiện:", + "", + " local branch \"master\" set to track remote branch \"o/master\"" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Tôi có thể tự chỉ định chứ?", + "", + "Tất nhiên là được chứ! Bạn có thế khiến bất kỳ nhánh nào theo dõi nhánh `o/master`, và nếu bạn làm vậy, nhánh đó sẽ được được chỉ định đích của lệnh đẩy và mục tiêu hợp nhất giống như nhánh `master`. Điều này có nghĩa là bạn có thể chạy lệnh `git push` trên nhánh có tên là `totallyNotMaster` và thành quả của bạn sẽ được đẩy lên nhánh `master` ở kho chứa từ xa!", + "", + "Có 2 cách để thiết lập thuộc tính này. Cách đầu tiên là chuyển sang một nhánh mới từ một nhánh từ xa bằng cách thực hiện", + "", + "`git checkout -b totallyNotMaster o/master`", + "", + "Tạo ra một nhánh mới `totallyNotMaster` và thiết lập cho nó theo dõi nhánh `o/master`." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Nói vậy là đủ rồi, hãy xem thử một mô tả nào! Ta sẽ chuyển sang một nhánh tên là `foo` và thiết lập cho nó theo dõi nhánh `master` trên kho chứa từ xa." + ], + "afterMarkdowns": [ + "Như bạn đã thấy, chúng tôi đã sử dụng mục tiêu ngầm `o / master` để cập nhật nhánh` foo. Để ý rằng nhánh `master` không được cập nhật!!" + ], + "command": "git checkout -b foo o/master; git pull", + "beforeCommand": "git clone; git fakeTeamwork" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Điểu này cũng được áp dụng cho lệnh git push" + ], + "afterMarkdowns": [ + "Bùùm. Ta đã đẩy thành quả lên nhánh `master` ở kho chứa tù xa mặc dù nhánh của ta có tên hoàn toàn khác biệt" + ], + "command": "git checkout -b foo o/master; git commit; git push", + "beforeCommand": "git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Cách thứ #2", + "", + "Cách khác để thiết lập theo dõi trên một nhánh đó là đơn giản sử dụng lệnh `git branch -u`. Thực hiện", + "", + "`git branch -u o/master foo`", + "", + "sẽ thiết lập nhánh `foo` theo dõi nhánh `o/master`. Nếu nhánh `foo` đang được `HEAD` trỏ tới bạn có thể bỏ tham số này:", + "", + "`git branch -u o/master`", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Hãy xem thử cách khác để thiết lập theo dõi..." + ], + "afterMarkdowns": [ + "Y hệt như trước, nhưng lệnh này biểu hiện rõ ràng hơn. Tuyệt!" + ], + "command": "git branch -u o/master foo; git commit; git push", + "beforeCommand": "git clone; git checkout -b foo" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Được rồi! Ở cấp độ này hãy để thành quả lên nhánh `master` trên kho lưu trữ từ xa mà không chuyển sang nhánh `master` tại kho địa phương. Hãy tự tìm ra cách nhé, giờ là khóa học nâng cao rồi :P" + ] + } + } + ] } } }; From 68a5229c63bf2813e9bb2a2b8c254423a908fa02 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Tue, 4 Feb 2020 10:20:27 -0800 Subject: [PATCH 156/359] Resolves #631 -- add locked master level --- src/levels/index.js | 3 +- src/levels/remote/lockedMaster.js | 53 +++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/levels/remote/lockedMaster.js diff --git a/src/levels/index.js b/src/levels/index.js index 5c85899d..46e03d81 100644 --- a/src/levels/index.js +++ b/src/levels/index.js @@ -36,7 +36,8 @@ exports.levelSequences = { require('./remote/pull').level, require('./remote/fakeTeamwork').level, require('./remote/push').level, - require('./remote/fetchRebase').level + require('./remote/fetchRebase').level, + require('./remote/lockedMaster').level ], remoteAdvanced: [ require('./remote/pushManyFeatures').level, diff --git a/src/levels/remote/lockedMaster.js b/src/levels/remote/lockedMaster.js new file mode 100644 index 00000000..f685f3eb --- /dev/null +++ b/src/levels/remote/lockedMaster.js @@ -0,0 +1,53 @@ +exports.level = { + "goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":\"o/master\"},\"o/master\":{\"target\":\"C1\",\"id\":\"o/master\",\"remoteTrackingBranchID\":null},\"feature\":{\"target\":\"C2\",\"id\":\"feature\",\"remoteTrackingBranchID\":\"o/feature\"},\"o/feature\":{\"target\":\"C2\",\"id\":\"o/feature\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"}},\"tags\":{},\"HEAD\":{\"target\":\"feature\",\"id\":\"HEAD\"},\"originTree\":{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":null},\"feature\":{\"target\":\"C2\",\"id\":\"feature\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"}},\"tags\":{},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}}", + "solutionCommand": "git checkout -b feature;git checkout master;git reset --hard o/master;git checkout feature;git push origin feature", + "startTree": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\",\"remoteTrackingBranchID\":\"o/master\"},\"o/master\":{\"target\":\"C1\",\"id\":\"o/master\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"}},\"tags\":{},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"},\"originTree\":{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"}},\"tags\":{},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}}", + "hint": { + "en_US": "Make the feature branch from the local master before resetting it back to be the same as origin's master" + }, + "name": { + "en_US": "Locked Master" + }, + "startDialog": { + "en_US": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Remote Rejected!", + "", + "If you work on a large collaborative team its likely that master is locked and requires some Pull Request process to merge changes. If you commit directly to master locally and try pushing you will be greeted with a message similar to this:", + "", + "```", + " ! [remote rejected] master -> master (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)", + "```" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Why was it rejected?", + "", + "The remote rejected the push of commits directly to master because of the policy on master requiring pull requests to instead be used.", + "", + "You meant to follow the process creating a branch then pushing that branch and doing a pull request, but you forgot and committed directly to master. Now you are stuck and cannot push your changes." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## The solution", + "", + "Create another branch called feature and push that to the remote. Also reset your master back to be in sync with the remote otherwise you may have issues next time you do a pull and someone else's commit conflicts with yours." + ] + } + } + ] + } + } +}; From cac0f99f02ce604445cafaf66d5fa29d212b6613 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Tue, 4 Feb 2020 10:25:29 -0800 Subject: [PATCH 157/359] Issue #631 -- improve solution a bit --- src/levels/remote/lockedMaster.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/remote/lockedMaster.js b/src/levels/remote/lockedMaster.js index f685f3eb..419992a4 100644 --- a/src/levels/remote/lockedMaster.js +++ b/src/levels/remote/lockedMaster.js @@ -1,6 +1,6 @@ exports.level = { "goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":\"o/master\"},\"o/master\":{\"target\":\"C1\",\"id\":\"o/master\",\"remoteTrackingBranchID\":null},\"feature\":{\"target\":\"C2\",\"id\":\"feature\",\"remoteTrackingBranchID\":\"o/feature\"},\"o/feature\":{\"target\":\"C2\",\"id\":\"o/feature\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"}},\"tags\":{},\"HEAD\":{\"target\":\"feature\",\"id\":\"HEAD\"},\"originTree\":{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":null},\"feature\":{\"target\":\"C2\",\"id\":\"feature\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"}},\"tags\":{},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}}", - "solutionCommand": "git checkout -b feature;git checkout master;git reset --hard o/master;git checkout feature;git push origin feature", + "solutionCommand": "git reset --hard o/master;git checkout -b feature C2; git push origin feature", "startTree": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\",\"remoteTrackingBranchID\":\"o/master\"},\"o/master\":{\"target\":\"C1\",\"id\":\"o/master\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"}},\"tags\":{},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"},\"originTree\":{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"}},\"tags\":{},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}}", "hint": { "en_US": "Make the feature branch from the local master before resetting it back to be the same as origin's master" From d1ff9a0a5e14be516a2e426463e0f205095a7c03 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Tue, 4 Feb 2020 10:34:10 -0800 Subject: [PATCH 158/359] Fix some security issues in dependencies in yarn.lock --- yarn.lock | 962 +++++++++++++++++++++++++++++------------------------- 1 file changed, 511 insertions(+), 451 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5f477b4b..4f79c66d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,184 +2,184 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" - integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== +"@babel/code-frame@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== dependencies: - "@babel/highlight" "^7.0.0" + "@babel/highlight" "^7.8.3" "@babel/core@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.4.tgz#84055750b05fcd50f9915a826b44fa347a825250" - integrity sha512-lQgGX3FPRgbz2SKmhMtYgJvVzGZrmjaF4apZ2bLwofAKiSjxU0drPh4S/VasyYXwaTs+A1gvQ45BN8SQJzHsQQ== + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.4.tgz#d496799e5c12195b3602d0fddd77294e3e38e80e" + integrity sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA== dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.4" - "@babel/helpers" "^7.4.4" - "@babel/parser" "^7.4.4" - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" - convert-source-map "^1.1.0" + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.8.4" + "@babel/helpers" "^7.8.4" + "@babel/parser" "^7.8.4" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.4" + "@babel/types" "^7.8.3" + convert-source-map "^1.7.0" debug "^4.1.0" + gensync "^1.0.0-beta.1" json5 "^2.1.0" - lodash "^4.17.11" + lodash "^4.17.13" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" - integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== +"@babel/generator@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.4.tgz#35bbc74486956fe4251829f9f6c48330e8d0985e" + integrity sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA== dependencies: - "@babel/types" "^7.4.4" + "@babel/types" "^7.8.3" jsesc "^2.5.1" - lodash "^4.17.11" + lodash "^4.17.13" source-map "^0.5.0" - trim-right "^1.0.1" -"@babel/helper-builder-react-jsx@^7.3.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" - integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== +"@babel/helper-builder-react-jsx@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz#dee98d7d79cc1f003d80b76fe01c7f8945665ff6" + integrity sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ== dependencies: - "@babel/types" "^7.3.0" + "@babel/types" "^7.8.3" esutils "^2.0.0" -"@babel/helper-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" - integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== +"@babel/helper-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" + integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== dependencies: - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" -"@babel/helper-get-function-arity@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" - integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== +"@babel/helper-get-function-arity@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" + integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.8.3" -"@babel/helper-plugin-utils@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== +"@babel/helper-plugin-utils@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" + integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== -"@babel/helper-split-export-declaration@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" - integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== +"@babel/helper-split-export-declaration@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" + integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== dependencies: - "@babel/types" "^7.4.4" + "@babel/types" "^7.8.3" -"@babel/helpers@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.4.tgz#868b0ef59c1dd4e78744562d5ce1b59c89f2f2a5" - integrity sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A== +"@babel/helpers@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73" + integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w== dependencies: - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.4" + "@babel/types" "^7.8.3" -"@babel/highlight@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" - integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== +"@babel/highlight@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" + integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== dependencies: chalk "^2.0.0" esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.4.tgz#5977129431b8fe33471730d255ce8654ae1250b6" - integrity sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w== +"@babel/parser@^7.8.3", "@babel/parser@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.4.tgz#d1dbe64691d60358a974295fa53da074dd2ce8e8" + integrity sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw== -"@babel/plugin-syntax-jsx@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" - integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== +"@babel/plugin-syntax-jsx@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94" + integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-react-display-name@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" - integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== +"@babel/plugin-transform-react-display-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" + integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-react-jsx-self@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz#461e21ad9478f1031dd5e276108d027f1b5240ba" - integrity sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg== +"@babel/plugin-transform-react-jsx-self@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz#c4f178b2aa588ecfa8d077ea80d4194ee77ed702" + integrity sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" -"@babel/plugin-transform-react-jsx-source@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz#20c8c60f0140f5dd3cd63418d452801cf3f7180f" - integrity sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g== +"@babel/plugin-transform-react-jsx-source@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz#951e75a8af47f9f120db731be095d2b2c34920e0" + integrity sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" -"@babel/plugin-transform-react-jsx@^7.0.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" - integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== +"@babel/plugin-transform-react-jsx@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz#4220349c0390fdefa505365f68c103562ab2fc4a" + integrity sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g== dependencies: - "@babel/helper-builder-react-jsx" "^7.3.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" + "@babel/helper-builder-react-jsx" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" "@babel/preset-react@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" - integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w== + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.8.3.tgz#23dc63f1b5b0751283e04252e78cf1d6589273d2" + integrity sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-react-display-name" "^7.8.3" + "@babel/plugin-transform-react-jsx" "^7.8.3" + "@babel/plugin-transform-react-jsx-self" "^7.8.3" + "@babel/plugin-transform-react-jsx-source" "^7.8.3" -"@babel/template@^7.1.0", "@babel/template@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" - integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== +"@babel/template@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8" + integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ== dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.3" + "@babel/types" "^7.8.3" -"@babel/traverse@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.4.tgz#0776f038f6d78361860b6823887d4f3937133fe8" - integrity sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A== +"@babel/traverse@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.4.tgz#f0845822365f9d5b0e312ed3959d3f827f869e3c" + integrity sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg== dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.4" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.4" - "@babel/parser" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.8.4" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.8.4" + "@babel/types" "^7.8.3" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.11" + lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" - integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== +"@babel/types@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" + integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== dependencies: esutils "^2.0.2" - lodash "^4.17.11" + lodash "^4.17.13" to-fast-properties "^2.0.0" "@sindresorhus/is@^0.14.0": @@ -215,35 +215,29 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -acorn-dynamic-import@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" - integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== - acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.6.1: - version "1.6.2" - resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.6.2.tgz#b7d7ceca6f22e6417af933a62cad4de01048d5d2" - integrity sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg== + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== dependencies: - acorn "^6.0.2" - acorn-dynamic-import "^4.0.0" - acorn-walk "^6.1.0" - xtend "^4.0.1" + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" -acorn-walk@^6.1.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" - integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== +acorn-walk@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.0.0.tgz#c8ba6f0f1aac4b0a9e32d1f0af12be769528f36b" + integrity sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg== acorn@^5.2.1: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== -acorn@^6.0.2: - version "6.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" - integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== +acorn@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== ansi-regex@^2.0.0: version "2.1.1" @@ -317,26 +311,11 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-filter@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" - integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= - array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= -array-map@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" - integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= - -array-reduce@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" - integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= - array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" @@ -362,10 +341,11 @@ asn1.js@^4.0.0: minimalistic-assert "^1.0.0" assert@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== dependencies: + object-assign "^4.1.1" util "0.10.3" assign-symbols@^1.0.0: @@ -384,11 +364,11 @@ async@^1.5.2, async@~1.5.2: integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= async@^2.5.0, async@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" - integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== dependencies: - lodash "^4.17.11" + lodash "^4.17.14" async@~0.9.0: version "0.9.2" @@ -400,7 +380,7 @@ async@~1.0.0: resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k= -atob@^2.1.1: +atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== @@ -423,9 +403,9 @@ balanced-match@^1.0.0: integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base64-js@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" - integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== base@^0.11.1: version "0.11.2" @@ -445,6 +425,13 @@ binary-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" @@ -646,9 +633,9 @@ browserify@^13.0.0: xtend "^4.0.0" browserify@^16.0.0, browserify@^16.1.0: - version "16.2.3" - resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.2.3.tgz#7ee6e654ba4f92bce6ab3599c3485b1cc7a0ad0b" - integrity sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ== + version "16.5.0" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.5.0.tgz#a1c2bc0431bec11fd29151941582e3f645ede881" + integrity sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw== dependencies: JSONStream "^1.0.3" assert "^1.4.0" @@ -687,7 +674,7 @@ browserify@^16.0.0, browserify@^16.1.0: shasum "^1.0.0" shell-quote "^1.6.1" stream-browserify "^2.0.0" - stream-http "^2.0.0" + stream-http "^3.0.0" string_decoder "^1.1.1" subarg "^1.0.0" syntax-error "^1.1.1" @@ -710,18 +697,18 @@ buffer-xor@^1.0.3: integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^4.1.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" isarray "^1.0.0" buffer@^5.0.2: - version "5.2.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" - integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== + version "5.4.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115" + integrity sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -747,19 +734,19 @@ cache-base@^1.0.1: unset-value "^1.0.0" cacheable-request@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.0.0.tgz#4a1727414e02ac4af82560c4da1b61daa3fa2b63" - integrity sha512-2N7AmszH/WPPpl5Z3XMw1HAP+8d+xugnKQAeKvxFZ/04dbT/CAznqwbl+7eSr3HkwdepNwtb2yx3CAMQWvG01Q== + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== dependencies: clone-response "^1.0.2" - get-stream "^4.0.0" + get-stream "^5.1.0" http-cache-semantics "^4.0.0" keyv "^3.0.0" - lowercase-keys "^1.0.1" - normalize-url "^3.1.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" responselike "^1.0.2" -cached-path-relative@^1.0.0: +cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg== @@ -803,9 +790,9 @@ chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2, chalk@~2.4.1: supports-color "^5.3.0" chokidar@^2.1.1: - version "2.1.5" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" - integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A== + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== dependencies: anymatch "^2.0.0" async-each "^1.0.1" @@ -822,9 +809,9 @@ chokidar@^2.1.1: fsevents "^1.2.7" chownr@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" - integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + version "1.1.3" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" + integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -922,9 +909,9 @@ colors@1.0.x: integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= colors@^1.1.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" - integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== colors@~1.1.2: version "1.1.2" @@ -975,13 +962,18 @@ concat-stream@~1.5.0, concat-stream@~1.5.1: readable-stream "~2.0.0" typedarray "~0.0.5" -console-browserify@1.1.x, console-browserify@^1.1.0: +console-browserify@1.1.x: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= dependencies: date-now "^0.1.4" +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -993,9 +985,9 @@ constants-browserify@~1.0.0: integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= contributor-faces@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/contributor-faces/-/contributor-faces-1.0.2.tgz#5bfd7798bc0b896db98dabba06eb350ca46a2562" - integrity sha512-fbGvdXpQnhSB0DWLbJj8xfOVKm1ErV2ZpzcQRx5CW4WOgA6smR9CfE4ngyg/WYutWgLSUvNjhWYM/IGwBqWxCA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/contributor-faces/-/contributor-faces-1.0.3.tgz#0b64e6f25e202b8daa6c9b8deabcc56302a63d2d" + integrity sha512-sVd+Wc1RonQqVEK1C95ZC+t0MSmixhC71PzZC7yvQ18RnN2mIqyEWwz2m3tSAGOFA/6yItBPyy83t61YpPQg+w== dependencies: gh-got "^8.0.1" meow "^3.7.0" @@ -1003,10 +995,10 @@ contributor-faces@^1.0.2: readme-filename "^1.0.0" replace-in-file "^2.0.1" -convert-source-map@^1.1.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== +convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== dependencies: safe-buffer "~5.1.1" @@ -1026,9 +1018,9 @@ core-js@^1.0.0: integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= core-js@^2.4.1: - version "2.6.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" - integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== core-util-is@~1.0.0: version "1.0.2" @@ -1129,6 +1121,13 @@ debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" +debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + debug@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" @@ -1164,9 +1163,9 @@ deep-extend@^0.6.0: integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== defer-to-connect@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.0.2.tgz#4bae758a314b034ae33902b5aac25a8dd6a8633e" - integrity sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw== + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== define-property@^0.2.5: version "0.2.5" @@ -1201,19 +1200,19 @@ delegates@^1.0.0: integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= deps-sort@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5" - integrity sha1-CRckkC6EZYJg65EHSMzNGvbiH7U= + version "2.0.1" + resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.1.tgz#9dfdc876d2bcec3386b6829ac52162cda9fa208d" + integrity sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw== dependencies: JSONStream "^1.0.3" - shasum "^1.0.0" + shasum-object "^1.0.0" subarg "^1.0.0" through2 "^2.0.0" des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -1231,7 +1230,7 @@ detective@^4.0.0: acorn "^5.2.1" defined "^1.0.0" -detective@^5.0.2: +detective@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== @@ -1250,12 +1249,12 @@ diffie-hellman@^5.0.0: randombytes "^2.0.0" dom-serializer@0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" - integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== dependencies: - domelementtype "^1.3.0" - entities "^1.1.1" + domelementtype "^2.0.1" + entities "^2.0.0" domain-browser@^1.2.0: version "1.2.0" @@ -1267,11 +1266,16 @@ domain-browser@~1.1.0: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" integrity sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw= -domelementtype@1, domelementtype@^1.3.0: +domelementtype@1: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + domhandler@2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" @@ -1300,9 +1304,9 @@ duplexer3@^0.1.4: integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= elliptic@^6.0.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" - integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -1320,9 +1324,9 @@ encoding@^0.1.11: iconv-lite "~0.4.13" end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" @@ -1331,10 +1335,10 @@ entities@1.0: resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY= -entities@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== +entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" + integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== error-ex@^1.2.0: version "1.3.2" @@ -1354,9 +1358,9 @@ esprima@^4.0.0: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esutils@^2.0.0, esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== eventemitter2@~0.4.13: version "0.4.14" @@ -1467,6 +1471,11 @@ eyes@0.1.x: resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= +fast-safe-stringify@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" + integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== + fbemitter@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-2.1.1.tgz#523e14fdaf5248805bb02f62efc33be703f51865" @@ -1514,6 +1523,11 @@ figures@^1.0.1: escape-string-regexp "^1.0.5" object-assign "^4.1.0" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" @@ -1598,11 +1612,11 @@ fragment-cache@^0.2.1: map-cache "^0.2.2" fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== dependencies: - minipass "^2.2.1" + minipass "^2.6.0" fs.realpath@^1.0.0: version "1.0.0" @@ -1610,12 +1624,12 @@ fs.realpath@^1.0.0: integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.2.7: - version "1.2.9" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" - integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + version "1.2.11" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" + integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== dependencies: + bindings "^1.5.0" nan "^2.12.1" - node-pre-gyp "^0.12.0" function-bind@^1.1.1: version "1.1.1" @@ -1651,6 +1665,11 @@ gaze@~1.1.2: dependencies: globule "^1.0.0" +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + get-assigned-identifiers@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" @@ -1671,13 +1690,20 @@ get-stream@^3.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= -get-stream@^4.0.0, get-stream@^4.1.0: +get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" +get-stream@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -1727,9 +1753,9 @@ glob@3.x, "glob@~ 3.2.1": minimatch "0.3" glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -1767,9 +1793,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globule@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" - integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== + version "1.3.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.0.tgz#41d0e9fb44afd4b80d93a23263714f90b3dec904" + integrity sha512-YlD4kdMqRCQHrhVdonet4TdRtv1/sZKepvoxNT4Nrhrp5HI8XFfc8kFlGlBn2myBo80aGp8Eft259mbcUJhgSg== dependencies: glob "~7.1.1" lodash "~4.17.10" @@ -1793,9 +1819,14 @@ got@^9.5.0: url-parse-lax "^3.0.0" graceful-fs@^4.1.11, graceful-fs@^4.1.2: - version "4.1.15" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" - integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +growl@^1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== growl@~1.7.0: version "1.7.0" @@ -2050,9 +2081,9 @@ hooker@^0.2.3, hooker@~0.2.3: integrity sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk= hosted-git-info@^2.1.4: - version "2.7.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + version "2.8.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" + integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== htmlescape@^1.1.0: version "1.1.1" @@ -2103,9 +2134,9 @@ ieee754@^1.1.4: integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== dependencies: minimatch "^3.0.4" @@ -2129,16 +2160,21 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" @@ -2328,7 +2364,7 @@ is-number@^4.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -2370,11 +2406,6 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= -isarray@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7" - integrity sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -2412,21 +2443,21 @@ jasmine-growl-reporter@~0.0.2: dependencies: growl "~1.7.0" -jasmine-growl-reporter@~0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/jasmine-growl-reporter/-/jasmine-growl-reporter-0.2.1.tgz#d5f0a37b92f6a83fd5c6482b809495c90a8b55fe" - integrity sha1-1fCje5L2qD/VxkgrgJSVyQqLVf4= +jasmine-growl-reporter@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/jasmine-growl-reporter/-/jasmine-growl-reporter-2.0.0.tgz#4943a2481193d66a8a68ee2f38b6c360fb037859" + integrity sha512-RYwVfPaGgxQQSHDOt6jQ99/KAkFQ/Fiwg/AzBS+uO9A4UhGhxb7hwXaUUSU/Zs0MxBoFNqmIRC+7P4/+5O3lXg== dependencies: - growl "~1.7.0" + growl "^1.10.5" jasmine-node@>=1.4.0: - version "1.16.2" - resolved "https://registry.yarnpkg.com/jasmine-node/-/jasmine-node-1.16.2.tgz#c9cec44f4bccc3bb9c3eb2c8f877590ce6530f38" - integrity sha512-A4AA2WaikuE7s/NYQCqfYsyCczEgObLgNH7IxRQ2SBshLBZg7vUEiiGX4GPbveW5f06nYmXYlzY4UjnZjXjV9g== + version "3.0.0" + resolved "https://registry.yarnpkg.com/jasmine-node/-/jasmine-node-3.0.0.tgz#f12b6fdd24633402ec23e8ea6fef6ffbcb464f90" + integrity sha512-vUa5Q7bQYwHHqi6FlJYndiKqZp+d+c3MKe0QUMwwrC4JRmoRV3zkg0buxB/uQ6qLh0NO34TNstpAnvaZ6xGlAA== dependencies: coffeescript "~1.12.7" gaze "~1.1.2" - jasmine-growl-reporter "~0.2.0" + jasmine-growl-reporter "~2.0.0" jasmine-reporters "~1.0.0" mkdirp "~0.3.5" requirejs "~2.3.6" @@ -2486,9 +2517,9 @@ jsesc@^2.5.1: integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jshint@~2.10.2: - version "2.10.2" - resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.10.2.tgz#ed6626c4f8223c98e94aaea62767435427a49a3d" - integrity sha512-e7KZgCSXMJxznE/4WULzybCMNXNAd/bf5TSrvVEq78Q/K8ZwFpmBqQeDtNiHc3l49nV4E/+YeHU/JZjSUIrLAA== + version "2.10.3" + resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.10.3.tgz#98dc765bf6920b41bc2719f76b8739d6f6e93a9c" + integrity sha512-d8AoXcNNYzmm7cdmulQ3dQApbrPYArtVBO6n4xOICe4QsXGNHCAKDcFORzqP52LhK61KX0VhY39yYzCsNq+bxQ== dependencies: cli "~1.0.0" console-browserify "1.1.x" @@ -2526,9 +2557,9 @@ json-stable-stringify@~0.0.0: jsonify "~0.0.0" json5@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" - integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== dependencies: minimist "^1.2.0" @@ -2574,17 +2605,16 @@ kind-of@^5.0.0: integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== labeled-stream-splicer@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz#9cffa32fd99e1612fd1d86a8db962416d5292926" - integrity sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz#42a41a16abcd46fd046306cf4f2c3576fffb1c21" + integrity sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw== dependencies: inherits "^2.0.1" - isarray "^2.0.4" stream-splicer "^2.0.0" lcid@^1.0.0: @@ -2628,10 +2658,10 @@ lodash.memoize@~3.0.3: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8= -lodash@^4.17.11, lodash@^4.17.4, lodash@~4.17.10, lodash@~4.17.11, lodash@~4.17.5: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== +lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.4, lodash@~4.17.10, lodash@~4.17.11, lodash@~4.17.5: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== lodash@~2.4.1: version "2.4.2" @@ -2658,6 +2688,11 @@ lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + lru-cache@2: version "2.7.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" @@ -2857,20 +2892,20 @@ minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= -minipass@^2.2.1, minipass@^2.3.4: - version "2.3.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" - integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" -minizlib@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" - integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== dependencies: - minipass "^2.2.1" + minipass "^2.9.0" mixin-deep@^1.2.0: version "1.3.2" @@ -2914,16 +2949,16 @@ module-deps@^4.0.8: xtend "^4.0.0" module-deps@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.0.tgz#d41a2e790245ce319171e4e7c4d8c73993ba3cd5" - integrity sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA== + version "6.2.2" + resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.2.tgz#d8a15c2265dfc119153c29bb47386987d0ee423b" + integrity sha512-a9y6yDv5u5I4A+IPHTnqFxcaKr4p50/zxTjcQJaX2ws9tN/W6J6YXnEKhqRyPhl494dkcxx951onSKVezmI+3w== dependencies: JSONStream "^1.0.3" browser-resolve "^1.7.0" - cached-path-relative "^1.0.0" + cached-path-relative "^1.0.2" concat-stream "~1.6.0" defined "^1.0.0" - detective "^5.0.2" + detective "^5.2.0" duplexer2 "^0.1.2" inherits "^2.0.1" parents "^1.0.0" @@ -2940,9 +2975,9 @@ ms@2.0.0: integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== mute-stream@~0.0.4: version "0.0.8" @@ -2950,9 +2985,9 @@ mute-stream@~0.0.4: integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.12.1: - version "2.13.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" - integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== nanomatch@^1.2.9: version "1.2.13" @@ -2977,11 +3012,11 @@ ncp@1.0.x: integrity sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY= needle@^2.2.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.1.tgz#d272f2f4034afb9c4c9ab1379aabc17fc85c9388" - integrity sha512-CaLXV3W8Vnbps8ZANqDGz7j4x7Yj1LW4TWF/TQuDfj7Cfx4nAPTvw98qgTevtto1oHDrh3pQkaODbqupXlsWTg== + version "2.3.2" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.2.tgz#3342dea100b7160960a450dc8c22160ac712a528" + integrity sha512-DUzITvPVDUy6vczKKYTnWc/pBZ0EnjMJnQ3y+Jo5zfKFimJs7S3HFCxCRZYB9FUZcrzUQr3WsmvZgddMEIZv6w== dependencies: - debug "^4.1.0" + debug "^3.2.6" iconv-lite "^0.4.4" sax "^1.2.4" @@ -2993,10 +3028,10 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" -node-pre-gyp@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" - integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== +node-pre-gyp@*: + version "0.14.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" + integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -3007,7 +3042,7 @@ node-pre-gyp@^0.12.0: rc "^1.2.7" rimraf "^2.6.1" semver "^5.3.0" - tar "^4" + tar "^4.4.2" nopt@^4.0.1: version "4.0.1" @@ -3053,23 +3088,31 @@ normalize-path@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== +normalize-url@^4.1.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" + integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== npm-bundled@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" - integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + version "1.1.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" + integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== npm-packlist@^1.1.6: - version "1.4.1" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" - integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== + version "1.4.8" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" + npm-normalize-package-bin "^1.0.1" npm-run-path@^2.0.0: version "2.0.2" @@ -3215,9 +3258,9 @@ pako@~0.2.0: integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= pako@~1.0.5: - version "1.0.10" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" - integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== parents@^1.0.0, parents@^1.0.1: version "1.0.1" @@ -3227,9 +3270,9 @@ parents@^1.0.0, parents@^1.0.1: path-platform "~0.11.15" parse-asn1@^5.0.0: - version "5.1.4" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" - integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" @@ -3385,9 +3428,9 @@ process-nextick-args@~1.0.6: integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process@~0.11.0: version "0.11.10" @@ -3512,29 +3555,28 @@ rc@^1.2.7: strip-json-comments "~2.0.1" react-dom@^16.8.6: - version "16.8.6" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.6.tgz#71d6303f631e8b0097f56165ef608f051ff6e10f" - integrity sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA== + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.12.0.tgz#0da4b714b8d13c2038c9396b54a92baea633fe11" + integrity sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.13.6" + scheduler "^0.18.0" react-is@^16.8.1: - version "16.8.6" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" - integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" + integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== react@^16.8.6: - version "16.8.6" - resolved "https://registry.yarnpkg.com/react/-/react-16.8.6.tgz#ad6c3a9614fd3a4e9ef51117f54d888da01f2bbe" - integrity sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw== + version "16.12.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83" + integrity sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.13.6" read-only-stream@^2.0.0: version "2.0.0" @@ -3595,9 +3637,9 @@ readable-stream@1.1: string_decoder "~0.10.x" readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -3607,6 +3649,15 @@ readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.0.6: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.5.0.tgz#465d70e6d1087f6162d079cd0b5db7fbebfd1606" + integrity sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" @@ -3713,9 +3764,9 @@ resolve@1.1.7, resolve@~1.1.0: integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.4.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" - integrity sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA== + version "1.15.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5" + integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw== dependencies: path-parse "^1.0.6" @@ -3741,7 +3792,14 @@ rewire@~2.1.5: resolved "https://registry.yarnpkg.com/rewire/-/rewire-2.1.5.tgz#764599179cae5e393839bf3ad6e0be371ee49d81" integrity sha1-dkWZF5yuXjk4Ob861uC+Nx7knYE= -rimraf@2.x.x, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: +rimraf@2.x.x, rimraf@^2.6.1, rimraf@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -3756,7 +3814,12 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -3778,38 +3841,28 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.13.6: - version "0.13.6" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889" - integrity sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ== +scheduler@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4" + integrity sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1: - version "5.7.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" - integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -3829,6 +3882,13 @@ sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: inherits "^2.0.1" safe-buffer "^5.0.1" +shasum-object@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shasum-object/-/shasum-object-1.0.0.tgz#0b7b74ff5b66ecf9035475522fa05090ac47e29e" + integrity sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg== + dependencies: + fast-safe-stringify "^2.0.7" + shasum@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" @@ -3850,14 +3910,9 @@ shebang-regex@^1.0.0: integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= shell-quote@^1.4.2, shell-quote@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" - integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= - dependencies: - array-filter "~0.0.0" - array-map "~0.0.0" - array-reduce "~0.0.0" - jsonify "~0.0.0" + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== shelljs@0.3.x: version "0.3.0" @@ -3910,11 +3965,11 @@ snapdragon@^0.8.1: use "^3.1.0" source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: - atob "^2.1.1" + atob "^2.1.2" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" @@ -3957,9 +4012,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" - integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA== + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -4018,10 +4073,20 @@ stream-http@^2.0.0: to-arraybuffer "^1.0.0" xtend "^4.0.0" +stream-http@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.1.0.tgz#22fb33fe9b4056b4eccf58bd8f400c4b993ffe57" + integrity sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^3.0.6" + xtend "^4.0.0" + stream-splicer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83" - integrity sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM= + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd" + integrity sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg== dependencies: inherits "^2.0.1" readable-stream "^2.0.2" @@ -4044,11 +4109,11 @@ string-width@^1.0.1: strip-ansi "^4.0.0" string_decoder@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" - integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: - safe-buffer "~5.1.0" + safe-buffer "~5.2.0" string_decoder@~0.10.0, string_decoder@~0.10.x: version "0.10.31" @@ -4136,18 +4201,18 @@ syntax-error@^1.1.1: dependencies: acorn-node "^1.2.0" -tar@^4: - version "4.4.8" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" - integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== +tar@^4.4.2: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== dependencies: chownr "^1.1.1" fs-minipass "^1.2.5" - minipass "^2.3.4" - minizlib "^1.1.1" + minipass "^2.8.6" + minizlib "^1.2.1" mkdirp "^0.5.0" safe-buffer "^5.1.2" - yallist "^3.0.2" + yallist "^3.0.3" through2@^2.0.0: version "2.0.5" @@ -4214,11 +4279,6 @@ trim-newlines@^1.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= - tty-browserify@0.0.1, tty-browserify@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" @@ -4230,9 +4290,9 @@ typedarray@^0.0.6, typedarray@~0.0.5: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= ua-parser-js@^0.7.18: - version "0.7.19" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" - integrity sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ== + version "0.7.21" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" + integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== uglify-es@~3.3.0: version "3.3.9" @@ -4272,9 +4332,9 @@ underscore@1.6.x: integrity sha1-izixDKze9jM3uLJOT/htRa6lKag= "underscore@>= 1.3.1", underscore@>=1.8.3, underscore@~1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" - integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== + version "1.9.2" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.2.tgz#0c8d6f536d6f378a5af264a72f7bec50feb7cf2f" + integrity sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ== underscore@~1.4.3: version "1.4.4" @@ -4282,14 +4342,14 @@ underscore@~1.4.3: integrity sha1-YaajIBBiKvoHljvzJSA88SI51gQ= union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" get-value "^2.0.6" is-extendable "^0.1.1" - set-value "^0.4.3" + set-value "^2.0.1" unset-value@^1.0.0: version "1.0.0" @@ -4300,9 +4360,9 @@ unset-value@^1.0.0: isobject "^3.0.0" upath@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" - integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== uri-path@^1.0.0: version "1.0.0" @@ -4334,7 +4394,7 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -util-deprecate@^1.0.2, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -4374,9 +4434,9 @@ validate-npm-package-license@^3.0.1: spdx-expression-parse "^3.0.0" vm-browserify@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" - integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== vm-browserify@~0.0.1: version "0.0.4" @@ -4386,9 +4446,9 @@ vm-browserify@~0.0.1: indexof "0.0.1" "walkdir@>= 0.0.1": - version "0.3.2" - resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.3.2.tgz#ac8437a288c295656848ebc19981ebc677a5f590" - integrity sha512-0Twghia4Z5wDGDYWURlhZmI47GvERMCsXIu0QZWVVZyW9ZjpbbZvD9Zy9M6cWiQQRRbAcYajIyKNavaZZDt1Uw== + version "0.4.1" + resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.4.1.tgz#dc119f83f4421df52e3061e514228a2db20afa39" + integrity sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ== walkdir@~0.0.12: version "0.0.12" @@ -4459,14 +4519,14 @@ wrappy@1: integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= xmldom@^0.1.22: - version "0.1.27" - resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" - integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= + version "0.1.31" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" + integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^3.2.1: version "3.2.1" @@ -4478,10 +4538,10 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" - integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== +yallist@^3.0.0, yallist@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yargs-parser@^7.0.0: version "7.0.0" From 9c0c5c6bdcd71f7f077fade3bfc7557168aa62a1 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Tue, 4 Feb 2020 10:42:26 -0800 Subject: [PATCH 159/359] attempt 2 --- yarn.lock | 232 ++---------------------------------------------------- 1 file changed, 6 insertions(+), 226 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4f79c66d..545ac61a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -269,19 +269,6 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -808,11 +795,6 @@ chokidar@^2.1.1: optionalDependencies: fsevents "^1.2.7" -chownr@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" - integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== - cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -974,11 +956,6 @@ console-browserify@^1.1.0: resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - constants-browserify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -1121,13 +1098,6 @@ debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - debug@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" @@ -1157,11 +1127,6 @@ deep-equal@~0.2.1: resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d" integrity sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0= -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - defer-to-connect@^1.0.1: version "1.1.3" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" @@ -1194,11 +1159,6 @@ defined@^1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - deps-sort@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.1.tgz#9dfdc876d2bcec3386b6829ac52162cda9fa208d" @@ -1217,11 +1177,6 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detective@^4.0.0: version "4.7.1" resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e" @@ -1611,13 +1566,6 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1636,20 +1584,6 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - gaze@~0.3.2: version "0.3.4" resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.3.4.tgz#5f94bdda0afe53bc710969bcd6f282548d60c279" @@ -2007,11 +1941,6 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -2121,7 +2050,7 @@ i@0.3.x: resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d" integrity sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0= -iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -2133,13 +2062,6 @@ ieee754@^1.1.4: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" @@ -2892,21 +2814,6 @@ minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" @@ -3011,15 +2918,6 @@ ncp@1.0.x: resolved "https://registry.yarnpkg.com/ncp/-/ncp-1.0.1.tgz#d15367e5cb87432ba117d2bf80fdf45aecfb4246" integrity sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY= -needle@^2.2.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.2.tgz#3342dea100b7160960a450dc8c22160ac712a528" - integrity sha512-DUzITvPVDUy6vczKKYTnWc/pBZ0EnjMJnQ3y+Jo5zfKFimJs7S3HFCxCRZYB9FUZcrzUQr3WsmvZgddMEIZv6w== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -3028,30 +2926,6 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" -node-pre-gyp@*: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - nopt@~2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/nopt/-/nopt-2.1.2.tgz#6cccd977b80132a07731d6e8ce58c2c8303cf9af" @@ -3093,27 +2967,6 @@ normalize-url@^4.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -3121,16 +2974,6 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -3189,11 +3032,6 @@ os-browserify@~0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - os-locale@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" @@ -3203,19 +3041,6 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - outpipe@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2" @@ -3544,16 +3369,6 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - react-dom@^16.8.6: version "16.12.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.12.0.tgz#0da4b714b8d13c2038c9396b54a92baea633fe11" @@ -3636,7 +3451,7 @@ readable-stream@1.1: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.6, readable-stream@~2.3.6: +readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -3792,7 +3607,7 @@ rewire@~2.1.5: resolved "https://registry.yarnpkg.com/rewire/-/rewire-2.1.5.tgz#764599179cae5e393839bf3ad6e0be371ee49d81" integrity sha1-dkWZF5yuXjk4Ob861uC+Nx7knYE= -rimraf@2.x.x, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@2.x.x, rimraf@^2.6.2: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -3836,11 +3651,6 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - scheduler@^0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4" @@ -3849,12 +3659,12 @@ scheduler@^0.18.0: loose-envify "^1.1.0" object-assign "^4.1.1" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1: +"semver@2 || 3 || 4 || 5", semver@^5.4.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -4100,7 +3910,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0: +string-width@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -4170,11 +3980,6 @@ strip-json-comments@1.0.x: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E= -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - subarg@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" @@ -4201,19 +4006,6 @@ syntax-error@^1.1.1: dependencies: acorn-node "^1.2.0" -tar@^4.4.2: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -4485,13 +4277,6 @@ which@^1.2.9, which@~1.3.0: dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - winston@2.1.x: version "2.1.1" resolved "https://registry.yarnpkg.com/winston/-/winston-2.1.1.tgz#3c9349d196207fd1bdff9d4bc43ef72510e3a12e" @@ -4538,11 +4323,6 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - yargs-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" From 462656433bbf5e222bb3c12d5254b883867e5408 Mon Sep 17 00:00:00 2001 From: zengdabo Date: Wed, 5 Feb 2020 16:11:43 +0800 Subject: [PATCH 160/359] add simple chinese translation to lockedMaster --- src/levels/remote/lockedMaster.js | 47 +++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/src/levels/remote/lockedMaster.js b/src/levels/remote/lockedMaster.js index 419992a4..ece6926a 100644 --- a/src/levels/remote/lockedMaster.js +++ b/src/levels/remote/lockedMaster.js @@ -3,10 +3,12 @@ exports.level = { "solutionCommand": "git reset --hard o/master;git checkout -b feature C2; git push origin feature", "startTree": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\",\"remoteTrackingBranchID\":\"o/master\"},\"o/master\":{\"target\":\"C1\",\"id\":\"o/master\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"}},\"tags\":{},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"},\"originTree\":{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"}},\"tags\":{},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}}", "hint": { - "en_US": "Make the feature branch from the local master before resetting it back to be the same as origin's master" + "en_US": "Make the feature branch from the local master before resetting it back to be the same as origin's master", + "zh_CN": "从本地的master创建一个feature分支, 然后重置master和origin master保持一致。" }, "name": { - "en_US": "Locked Master" + "en_US": "Locked Master", + "zh_CN": "锁定的Master(Locked Master)" }, "startDialog": { "en_US": { @@ -49,5 +51,46 @@ exports.level = { } ] } + + "zh_CN": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## 远程服务器拒绝!(Remote Rejected)", + "", + "如果你是在一个大的合作团队中工作, 很可能是master被锁定了, 需要一些Pull Request流程来合并修改。如果你直接提交(commit)到本地master, 然后试图推送(push)修改, 你将会收到这样类似的信息:", + "", + "```", + " ! [远程服务器拒绝] master -> master (TF402455: 不允许推送(push)这个分支; 你必须使用pull request来更新这个分支.)", + "```" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## 为什么会被拒绝?", + "", + "远程服务器拒绝直接推送(push)提交到master, 因为策略配置要求 pull requests 来提交更新.", + "", + "你应该按照流程,新建一个分支, 推送(push)这个分支并申请pull request,但是你忘记并直接提交给了master.现在你卡住并且无法推送你的更新." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## 解决办法", + "", + "新建一个分支feature, 推送到远程服务器. 然后reset你的master分支和远程服务器保持一致, 否则下次你pull并且他人的提交和你冲突的时候就会有问题." + ] + } + } + ] + } } }; From 039f8c9894b0eed6b44e0dfb9c6f00e6b95bfca7 Mon Sep 17 00:00:00 2001 From: andreySy4 Date: Wed, 5 Feb 2020 14:39:11 +0300 Subject: [PATCH 161/359] Add RUS translate --- src/levels/remote/lockedMaster.js | 50 +++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/src/levels/remote/lockedMaster.js b/src/levels/remote/lockedMaster.js index 419992a4..d0cdcdbb 100644 --- a/src/levels/remote/lockedMaster.js +++ b/src/levels/remote/lockedMaster.js @@ -3,10 +3,12 @@ exports.level = { "solutionCommand": "git reset --hard o/master;git checkout -b feature C2; git push origin feature", "startTree": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\",\"remoteTrackingBranchID\":\"o/master\"},\"o/master\":{\"target\":\"C1\",\"id\":\"o/master\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"}},\"tags\":{},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"},\"originTree\":{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"}},\"tags\":{},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}}", "hint": { - "en_US": "Make the feature branch from the local master before resetting it back to be the same as origin's master" + "en_US": "Make the feature branch from the local master before resetting it back to be the same as origin's master", + "ru_RU": "Создайте новую feature ветвь от master перед тем, как откатить изменения в master до состояния o/master." }, "name": { - "en_US": "Locked Master" + "en_US": "Locked Master", + "ru_RU": "Заблокированная ветвь master" }, "startDialog": { "en_US": { @@ -48,6 +50,50 @@ exports.level = { } } ] + }, + "ru_RU": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Remote Rejected!", + "", + "Когда вы работаете в составе большой команды разработчиков над проектом, то, вероятнее всего, ветвь `master` будет _заблокирована_. Для внесения изменений в неё в git существует понятие запроса на слияние `Pull Request`. В такой ситуации если вы закоммитите свои наработки непосредственно в `master` ветвь, а после выполните `git push`, то будет сгенерировано сообщение об ошибке:", + "", + "```", + " ! [remote rejected] master -> master (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)", + "```", + "", + "```", + " ! [удалённо отклонено] master -> master (TF402455: Изменение этой ветви запрещены; вы можете использовать pull request для обновления этой ветви.)", + "```" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Почему произошло отклонение моих изменений?", + "", + "Удалённый репозиторий отклонил загруженные коммиты непосредственно в `master` ветку потому, что на `master` _настроена политика_, которая требует использование `Pull request` вместо обычного `git push`.", + "", + "Эта политика подразумевает процесс создания новой ветви разработки, внесение в неё всех необходимых коммитов, загрузка изменений в удалённый репозиторий и _открытие нового_ `Pull request`. Однако вы забыли про это и закоммитили наработки непосредственно в `master` ветвь. Теперь вы застряли и не можете запушить свои изменения :(. " + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Решение:", + "", + "Создайте ещё одну ветвь под названием `feature` и отправьте изменения на удалённый репозиторий. Так же не забудьте вернуть вашу локальную `master` ветвь в исходное состояние (чтобы она была синхронизирована с удалённой). В противном случае у вас могут возникнуть проблемы при следующем выполнении `git pull`." + ] + } + } + ] } } }; From 8e51e1afc16c2721f07c93f241dcc8554e83251f Mon Sep 17 00:00:00 2001 From: Marko Schulz Date: Wed, 5 Feb 2020 12:55:20 +0100 Subject: [PATCH 162/359] Fix spelling --- src/levels/intro/commits.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/intro/commits.js b/src/levels/intro/commits.js index fe290ce6..47de7043 100644 --- a/src/levels/intro/commits.js +++ b/src/levels/intro/commits.js @@ -101,7 +101,7 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Mal sehen wie das in der Praxis ist. Rechts sehen wir ein (kleines) Git-Repository. Es gibt akutell zwei Commits -- den initialen, `C0`, und den danach, `C1`, der irgendwelche Änderungen enthält.", + "Mal sehen wie das in der Praxis ist. Rechts sehen wir ein (kleines) Git-Repository. Es gibt aktuell zwei Commits -- den initialen, `C0`, und den danach, `C1`, der irgendwelche Änderungen enthält.", "", "Klick die Schaltfläche unten um einen neuen Commit zu erzeugen:" ], From 39fb80f57be64d6bfcd893fe177f1e32886ad8b1 Mon Sep 17 00:00:00 2001 From: zengdabo Date: Wed, 5 Feb 2020 21:26:52 +0800 Subject: [PATCH 163/359] missing one ',' after '}" fixed!!! --- src/levels/remote/lockedMaster.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/remote/lockedMaster.js b/src/levels/remote/lockedMaster.js index ece6926a..fd27a985 100644 --- a/src/levels/remote/lockedMaster.js +++ b/src/levels/remote/lockedMaster.js @@ -50,7 +50,7 @@ exports.level = { } } ] - } + }, "zh_CN": { "childViews": [ From 2be8fcd2d91465ab7bbec09a38e506a61efbe345 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Wed, 5 Feb 2020 10:58:17 -0800 Subject: [PATCH 164/359] Resolves #637 -- fix merge conflict --- src/levels/remote/lockedMaster.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/remote/lockedMaster.js b/src/levels/remote/lockedMaster.js index d2b736a5..5e4e8c61 100644 --- a/src/levels/remote/lockedMaster.js +++ b/src/levels/remote/lockedMaster.js @@ -128,7 +128,7 @@ exports.level = { { "type": "ModalAlert", "options": { - "markdowns": + "markdowns": [ "## Решение:", "", "Создайте ещё одну ветвь под названием `feature` и отправьте изменения на удалённый репозиторий. Так же не забудьте вернуть вашу локальную `master` ветвь в исходное состояние (чтобы она была синхронизирована с удалённой). В противном случае у вас могут возникнуть проблемы при следующем выполнении `git pull`." From 9fc6b5d9690a688f9f426a215a6eb0d52314f952 Mon Sep 17 00:00:00 2001 From: txabman42 Date: Mon, 17 Feb 2020 22:20:09 +0100 Subject: [PATCH 165/359] Spanish translation of locked master level --- src/levels/remote/lockedMaster.js | 48 +++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/src/levels/remote/lockedMaster.js b/src/levels/remote/lockedMaster.js index 5e4e8c61..0c9b4f87 100644 --- a/src/levels/remote/lockedMaster.js +++ b/src/levels/remote/lockedMaster.js @@ -5,12 +5,14 @@ exports.level = { "hint": { "en_US": "Make the feature branch from the local master before resetting it back to be the same as origin's master", "ru_RU": "Создайте новую feature ветвь от master перед тем, как откатить изменения в master до состояния o/master.", - "zh_CN": "从本地的master创建一个feature分支, 然后重置master和origin master保持一致。" + "zh_CN": "从本地的master创建一个feature分支, 然后重置master和origin master保持一致。", + "es_ES": "Crea la rama feature desde la rama master en local antes de restablecerlo para que sea el mismo que la rama master de origen" }, "name": { "en_US": "Locked Master", "ru_RU": "Заблокированная ветвь master", - "zh_CN": "锁定的Master(Locked Master)" + "zh_CN": "锁定的Master(Locked Master)", + "es_ES": "Master bloqueado", }, "startDialog": { "en_US": { @@ -136,6 +138,48 @@ exports.level = { } } ] + }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Remote Rejected!", + "", + "\n" + + "Si trabajas en un equipo colaborativo, es probable que la rama `master` esté bloqueada y requiera algún proceso de `Pull Request` para poder `mergear` los cambios. Si haces `commit` directamente a `master e intentas realizar `push`, recibirás un mensaje similar a este:", + "", + "```", + " ! [remote rejected] master -> master (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)", + "```" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## ¿Por qué fue rechazado?", + "", + + "Se rechazó el `push` del `commit` a la rama `master` debido a la política en la rama `master` que requiere el uso de `Pull Requests`.", + "", + "Trataste de crear una rama y luego hacer `pushs` creando una `Pull Request`, pero te olvidaste e hiciste `commit` directamente a `master`. Ahora estás atascado y no puedes hacer `push` de tus cambios." + + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## The solution", + "", + "Crea otra rama llamada `feature` y haz `push` a remoto. También restablece su rama `master` nuevamente para que esté sincronizado con el repositorio remoto; de lo contrario, puedes tener problemas la próxima vez que realices un `pull` y el `commit` de otra persona entre en conflicto con el tuyo." + ] + } + } + ] } } }; From 5f69bf24facb3a608523fe449bc2915fc8f1e724 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Tue, 18 Feb 2020 16:56:28 +0900 Subject: [PATCH 166/359] remove leading + for linter lets see if this passes --- src/levels/remote/lockedMaster.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/levels/remote/lockedMaster.js b/src/levels/remote/lockedMaster.js index 0c9b4f87..88d08c83 100644 --- a/src/levels/remote/lockedMaster.js +++ b/src/levels/remote/lockedMaster.js @@ -147,8 +147,7 @@ exports.level = { "markdowns": [ "## Remote Rejected!", "", - "\n" - + "Si trabajas en un equipo colaborativo, es probable que la rama `master` esté bloqueada y requiera algún proceso de `Pull Request` para poder `mergear` los cambios. Si haces `commit` directamente a `master e intentas realizar `push`, recibirás un mensaje similar a este:", + "Si trabajas en un equipo colaborativo, es probable que la rama `master` esté bloqueada y requiera algún proceso de `Pull Request` para poder `mergear` los cambios. Si haces `commit` directamente a `master e intentas realizar `push`, recibirás un mensaje similar a este:", "", "```", " ! [remote rejected] master -> master (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)", From e2b76991ec613856d0d47c7cfe883edde8168c92 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Sat, 22 Feb 2020 08:27:29 +0900 Subject: [PATCH 167/359] Resolves #642 -- explain how to access next level --- src/js/level/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/level/index.js b/src/js/level/index.js index 43540760..a394468d 100644 --- a/src/js/level/index.js +++ b/src/js/level/index.js @@ -498,7 +498,7 @@ var Level = Sandbox.extend({ finishAnimationChain = deferred.promise; Main.getEventBaton().trigger( 'commandSubmitted', - 'echo "level solved!"' + 'echo "level solved! type in \'levels\' to access the next level"' ); } else { GlobalStateActions.changeIsAnimating(true); From 4a72afd2c6cbdc92dfc2fba97e63aa719cf72fc4 Mon Sep 17 00:00:00 2001 From: Shubidumdu Date: Sat, 29 Feb 2020 21:03:43 +0900 Subject: [PATCH 168/359] translated to Korean in lockedMaster.js --- src/levels/remote/lockedMaster.js | 46 +++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/src/levels/remote/lockedMaster.js b/src/levels/remote/lockedMaster.js index 88d08c83..1e82655e 100644 --- a/src/levels/remote/lockedMaster.js +++ b/src/levels/remote/lockedMaster.js @@ -6,13 +6,15 @@ exports.level = { "en_US": "Make the feature branch from the local master before resetting it back to be the same as origin's master", "ru_RU": "Создайте новую feature ветвь от master перед тем, как откатить изменения в master до состояния o/master.", "zh_CN": "从本地的master创建一个feature分支, 然后重置master和origin master保持一致。", - "es_ES": "Crea la rama feature desde la rama master en local antes de restablecerlo para que sea el mismo que la rama master de origen" + "es_ES": "Crea la rama feature desde la rama master en local antes de restablecerlo para que sea el mismo que la rama master de origen", + "ko" : "로컬 저장소의 master 브랜치로부터 feature 브랜치를 만드세요. 그리고 o/master와 같아질 수 있도록 로컬 저장소의 master 브랜치를 reset 하세요." }, "name": { "en_US": "Locked Master", "ru_RU": "Заблокированная ветвь master", "zh_CN": "锁定的Master(Locked Master)", "es_ES": "Master bloqueado", + "ko" : "잠겨버린 Master" }, "startDialog": { "en_US": { @@ -179,6 +181,46 @@ exports.level = { } } ] - } + }, + "ko": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## 원격저장소 거부! (Remote Rejected!)", + "", + "규모가 큰 개발팀에서 일하는 경우, 보통 원격저장소의 `master` 브랜치는 잠겨있습니다(locked). 그래서 변경사항을 적용하려면 pull request 과정을 거쳐야하죠. 만약에 여러분이 로컬 저장소의 `master`브랜치에서 커밋을 한 후 `push`하려고 시도한다면, 다음과 같은 오류를 받게 될겁니다. :", + "", + "```", + " ! [remote rejected] master -> master (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)", + "```" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## 왜 거부됐나요?", + "", + "원격 저장소는 자신의 `master` 브랜치에 대한 직접적인 커밋을 제한합니다. 왜냐하면 `push` 대신에 pull request가 쓰여야 한다는 규칙이 원격 저장소의 `master` 브랜치에는 적용되어 있기 때문이죠.", + "", + "여러분은 브랜치를 따로 만들어 작업한 다음, 그것을 `push`하고 pull request를 하려 했습니다. 하지만 그걸 잊고 실수로 `master` 브랜치에서 직접 커밋을 해버렸네요! 이제 변경 사항을 `push` 하지도 못하고 옴짝달싹 못하는 상황이 되어버렸습니다." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## 해결책", + "", + "`feature` 라는 이름의 다른 브랜치를 만들어 원격 저장소에 `push` 하세요. 그리고 원격 저장소와 동기화될 수 있도록 로컬 저장소의 `master` 브랜치를 `reset`하세요. 그렇지 않으면 여러분이 다음에 `pull`을 시도할 때 문제가 발생하거나, 다른 협업자들의 커밋이 여러분의 커밋과 충돌할 수도 있습니다." + ] + } + } + ] + }, } }; From 8eaa9f285c5259088371365278072817becd2c56 Mon Sep 17 00:00:00 2001 From: hongarc Date: Thu, 5 Mar 2020 12:09:28 +0700 Subject: [PATCH 169/359] feat: use node.js module instead of --- src/js/intl/checkStrings.js | 52 ++++++++++--------------------------- src/js/util/index.js | 16 ++++++++++++ 2 files changed, 29 insertions(+), 39 deletions(-) diff --git a/src/js/intl/checkStrings.js b/src/js/intl/checkStrings.js index 4a1c5212..80aa49f0 100644 --- a/src/js/intl/checkStrings.js +++ b/src/js/intl/checkStrings.js @@ -1,54 +1,28 @@ -var sys = require('sys'); +var { join } = require('path'); +var { readFileSync } = require('fs'); + var util = require('../util'); -var child_process = require('child_process'); -var strings = require('../intl/strings').strings; +var { strings } = require('../intl/strings'); -var searchCommand = 'grep -C 2 -r "intl.str(" ../../'; -var genBadKeyCommand = function(key) { - return 'grep -r "' + key + '" ../../'; -}; - -var easyRegex = /intl.str\('([a-zA-Z\-]+)'/g; -var hardRegex = /\s+'([a-z\-]+)',/g; - -var findKey = function(badKey) { - child_process.exec(genBadKeyCommand(badKey), function(err, output) { - console.log(output); - }); -}; +var easyRegex = /intl\.str\(\s*'([a-zA-Z\-]+)'/g; var goodKeys = 0; var validateKey = function(key) { if (!strings[key]) { console.log('NO KEY for: "', key, '"'); - findKey(key); } else { goodKeys++; } }; -var processLines = function(lines) { - lines.forEach(function(line) { - var results = easyRegex.exec(line); - if (results && results[1]) { - validateKey(results[1]); - return; - } - // could be a multi-liner - results = hardRegex.exec(line); - if (results && results[1]) { - validateKey(results[1]); +if (!util.isBrowser()) { + util.readDirDeep(join(__dirname, '../..')).forEach(function(path) { + var content = readFileSync(path); + var match; + while (match = easyRegex.exec(content)) { + console.log(match[1]) + validateKey(match[1]); } }); -}; - -if (!util.isBrowser()) { - child_process.exec( - searchCommand, - function(err, output) { - processLines(output.split('\n')); - console.log(goodKeys + ' good keys found!'); - } - ); + console.log(goodKeys + ' good keys found!'); } - diff --git a/src/js/util/index.js b/src/js/util/index.js index 51944aed..17d4bdc5 100644 --- a/src/js/util/index.js +++ b/src/js/util/index.js @@ -1,3 +1,6 @@ +var { readdirSync, lstatSync } = require('fs'); +var { join } = require('path'); + var escapeString = require('../util/escapeString'); var constants = require('../util/constants'); @@ -56,3 +59,16 @@ exports.genParseCommand = function(regexMap, eventName) { }; }; }; + +exports.readDirDeep = function(dir) { + var paths = []; + readdirSync(dir).forEach(function(path) { + var aPath = join(dir, path); + if (lstatSync(aPath).isDirectory()) { + paths.push(...exports.readDirDeep(aPath)); + } else { + paths.push(aPath); + } + }); + return paths; +} From 77bd782e5b46ea7fe04c5eecc3e087337e4b9bcc Mon Sep 17 00:00:00 2001 From: hongarc Date: Thu, 5 Mar 2020 12:50:40 +0700 Subject: [PATCH 170/359] feat: show unused key --- src/js/intl/checkStrings.js | 15 ++++++++++----- src/js/util/index.js | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/js/intl/checkStrings.js b/src/js/intl/checkStrings.js index 80aa49f0..f7e473d0 100644 --- a/src/js/intl/checkStrings.js +++ b/src/js/intl/checkStrings.js @@ -6,23 +6,28 @@ var { strings } = require('../intl/strings'); var easyRegex = /intl\.str\(\s*'([a-zA-Z\-]+)'/g; -var goodKeys = 0; +var allKetSet = new Set(Object.keys(strings)); +allKetSet.delete('error-untranslated'); // used in ./index.js + +var goodKeySet = new Set(); var validateKey = function(key) { if (!strings[key]) { console.log('NO KEY for: "', key, '"'); } else { - goodKeys++; + goodKeySet.add(key); + allKetSet.delete(key); } }; if (!util.isBrowser()) { - util.readDirDeep(join(__dirname, '../..')).forEach(function(path) { + util.readDirDeep(join(__dirname, '../../')).forEach(function(path) { var content = readFileSync(path); var match; while (match = easyRegex.exec(content)) { - console.log(match[1]) validateKey(match[1]); } }); - console.log(goodKeys + ' good keys found!'); + console.log(goodKeySet.size, ' good keys found!'); + console.log(allKetSet.size, ' keys did not use!'); + console.log(allKetSet); } diff --git a/src/js/util/index.js b/src/js/util/index.js index 17d4bdc5..84d7ffc2 100644 --- a/src/js/util/index.js +++ b/src/js/util/index.js @@ -71,4 +71,4 @@ exports.readDirDeep = function(dir) { } }); return paths; -} +}; From a84c4b14eeda1ad9f18332900fcab7a4e9df74b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2020 22:57:49 +0000 Subject: [PATCH 171/359] Bump acorn from 5.7.3 to 5.7.4 Bumps [acorn](https://github.com/acornjs/acorn) from 5.7.3 to 5.7.4. - [Release notes](https://github.com/acornjs/acorn/releases) - [Commits](https://github.com/acornjs/acorn/compare/5.7.3...5.7.4) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 545ac61a..5061ba7d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -230,9 +230,9 @@ acorn-walk@^7.0.0: integrity sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg== acorn@^5.2.1: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== acorn@^7.0.0: version "7.1.0" From edfd052c4c175367a2b9b7fb0847313cbf7d8074 Mon Sep 17 00:00:00 2001 From: hongarc Date: Sun, 15 Mar 2020 03:31:53 +0700 Subject: [PATCH 172/359] chore: use `gulp` instead of `grunt` --- .jshintrc | 41 + .travis.yml | 2 +- Gruntfile.js | 252 --- __tests__/base.js | 67 +- __tests__/git.spec.js | 218 +-- __tests__/levels.spec.js | 3 +- __tests__/mercurial.spec.js | 3 +- __tests__/remote.spec.js | 250 +-- __tests__/simpleRemote.spec.js | 2 +- gulpfile.js | 190 ++ package.json | 33 +- src/js/git/headless.js | 2 +- src/levels/mixed/describe.js | 2 +- src/levels/rampup/cherryPick.js | 2 +- src/levels/rampup/detachedHead.js | 4 +- src/levels/rampup/interactiveRebase.js | 2 +- src/levels/rampup/relativeRefs.js | 2 +- src/levels/rampup/relativeRefs2.js | 2 +- src/style/main.css | 2 +- src/template.index.html | 12 +- yarn.lock | 2417 +++++++++++++++--------- 21 files changed, 2021 insertions(+), 1487 deletions(-) create mode 100644 .jshintrc delete mode 100644 Gruntfile.js create mode 100644 gulpfile.js diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 00000000..94ef1d9a --- /dev/null +++ b/.jshintrc @@ -0,0 +1,41 @@ +{ + "esversion": 6, + "curly": true, + "eqeqeq": false, + "regexp": false, + "nonew": false, + "latedef": false, + "forin": false, + "globalstrict": false, + "node": true, + "immed": true, + "newcap": true, + "noarg": true, + "bitwise": true, + "sub": true, + "undef": true, + "unused": true, + "trailing": true, + "devel": true, + "jquery": true, + "nonstandard": true, + "boss": true, + "eqnull": true, + "browser": true, + "debug": true, + "globals": { + "casper": true, + "Raphael": true, + "require": true, + "console": true, + "describe": true, + "expect": true, + "it": true, + "runs": true, + "waitsFor": true, + "exports": true, + "module": true, + "prompt": true, + "process": true + } +} diff --git a/.travis.yml b/.travis.yml index 777c536e..3b6b4d6f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,5 +12,5 @@ cache: - "node_modules" script: - ./checkgit.sh "Source files were modified before build; is yarn.lock out of sync with package.json?" || travis_terminate $? - - yarn grunt + - yarn gulp - ./checkgit.sh "Source files were modified by the build" || travis_terminate $? diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index 92babe3e..00000000 --- a/Gruntfile.js +++ /dev/null @@ -1,252 +0,0 @@ -var _ = require('underscore'); -var fs = require('fs'); -var babelify = require('babelify'); - -// Haha, this is so tricky. so we have a template for index.html to stick -// in the hashed JS and style files -- that template also contains -// templates used in the app. in order to avoid evaluating those -// templates, we change the regexes so we can effectively nest templates -_.templateSettings.interpolate = /\{\{(.+?)\}\}/g; -_.templateSettings.escape = /\{\{\{(.*?)\}\}\}/g; -_.templateSettings.evaluate = /\{\{-(.*?)\}\}/g; - -// precompile for speed -var indexFile = fs.readFileSync('src/template.index.html').toString(); -var indexTemplate = _.template(indexFile); - -/** - * This is SUPER jank but I can't get the underscore templating to evaluate - * correctly with custom regexes, so I'm just going to use interpolate - * and define the strings here. - */ - -var prodDependencies = [ - '', - '', - '' -]; - -var devDependencies = [ - '', - '', - '' -]; - -/*global module:false*/ -module.exports = function(grunt) { - // eventually have sound...? - grunt.registerTask('compliment', 'Stay motivated!', function() { - var compliments = grunt.config('compliment.compliments'); - var index = Math.floor(Math.random() * compliments.length); - - grunt.log.writeln(compliments[index]); - }); - - grunt.registerTask('lintStrings', 'Find if an INTL string doesn\'t exist', function() { - var child_process = require('child_process'); - child_process.exec('node src/js/intl/checkStrings', function(err, output) { - grunt.log.writeln(output); - }); - }); - - var buildIndex = function(config) { - grunt.log.writeln('Building index...'); - - // first find the one in here that we want - var buildFiles = fs.readdirSync('build'); - - var hashedMinFile; - if (buildFiles.length == 2) { - grunt.log.writeln('Assuming debug mode wanted'); - hashedMinFile = 'bundle.js'; - } - var jsRegex = /bundle\.min\.\w+\.js/; - buildFiles.forEach(function(jsFile) { - if (jsRegex.test(jsFile)) { - if (hashedMinFile) { - throw new Error('more than one hashed file: ' + jsFile + hashedMinFile); - } - hashedMinFile = jsFile; - } - }); - if (!hashedMinFile) { throw new Error('no hashed min file found!'); } - - grunt.log.writeln('Found hashed js file: ' + hashedMinFile); - - var styleRegex = /main\.\w+\.css/; - var hashedStyleFile; - buildFiles.forEach(function(styleFile) { - if (styleRegex.test(styleFile)) { - if (hashedStyleFile) { - throw new Error('more than one hashed style: ' + styleFile + hashedStyleFile); - } - hashedStyleFile = styleFile; - } - }); - if (!hashedStyleFile) { throw new Error('no style found'); } - - grunt.log.writeln('Found hashed style file: ' + hashedStyleFile); - - // output these filenames to our index template - var outputIndex = indexTemplate({ - jsFile: hashedMinFile, - styleFile: hashedStyleFile, - jsDependencies: config.isProd ? - prodDependencies.join("\n") : - devDependencies.join("\n") - }); - fs.writeFileSync('index.html', outputIndex); - }; - - grunt.registerTask('buildIndex', 'stick in hashed resources', buildIndex.bind(null, {isProd: true})); - grunt.registerTask('buildIndexDev', 'stick in hashed resources', buildIndex.bind(null, {isProd: false})); - - grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), - jshint: { - all: [ - 'Gruntfile.js', - '__tests__/*.spec.js', - 'src/js/**/*.js', - 'src/js/**/**/*.js', - 'src/levels/**/*.js' - ], - options: { - esversion: 6, - curly: true, - // sometimes triple equality is just redundant and unnecessary - eqeqeq: false, - // i know my regular expressions - regexp: false, - // i think it's super weird to not use new on a constructor - nonew: false, - // these latedefs are just annoying -- no pollution of global scope - latedef: false, - // use this in mocks - forin: false, - // This gets annoying - globalstrict: false, - // for use strict warnings - node: true, - /////////////////////////////// - // All others are true - ////////////////////////////// - immed: true, - newcap: true, - noarg: true, - bitwise: true, - sub: true, - undef: true, - unused: false, - trailing: true, - devel: true, - jquery: true, - nonstandard: true, - boss: true, - eqnull: true, - browser: true, - debug: true, - reporterOutput: '', - globals: { - casper: true, - Raphael: true, - require: true, - console: true, - describe: true, - expect: true, - it: true, - runs: true, - waitsFor: true, - exports: true, - module: true, - prompt: true, - process: true - } - }, - }, - compliment: { - compliments: [ - "Wow peter great work!", - "Such a professional dev environment", - "Can't stop the TRAIN", - "git raging" - ] - }, - hash: { - options: { - mapping: '' - }, - js: { - src: 'build/bundle.min.js', - dest: 'build/' - }, - css: { - src: 'src/style/main.css', - dest: 'build/' - } - }, - watch: { - files: '', - tasks: 'watching' - }, - uglify: { - build: { - src: ['build/bundle.js'], - dest: 'build/bundle.min.js' - } - }, - clean: ['build/*'], - shell: { - gitAdd: { - command: 'git add build/' - } - }, - jasmine_node: { - projectRoot: './__tests__/', - forceExit: true, - verbose: true, - requirejs: false - }, - env: { - prod: { - NODE_ENV: 'production', - }, - }, - browserify: { - options: { - transform: [babelify.configure({ - presets: ['@babel/preset-react'] - })] - }, - dist: { - files: { - 'build/bundle.js': [ - 'src/**/*.js', - 'src/**/*.jsx' - ] - } - } - } - }); - - // all my npm helpers - grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks('grunt-browserify'); - grunt.loadNpmTasks('grunt-hash'); - grunt.loadNpmTasks('grunt-contrib-clean'); - grunt.loadNpmTasks('grunt-shell-spawn'); - grunt.loadNpmTasks('grunt-jasmine-node'); - grunt.loadNpmTasks('grunt-contrib-uglify-es'); - grunt.loadNpmTasks('grunt-env'); - - grunt.registerTask('build', - ['clean', 'env', 'browserify', 'uglify', 'hash', 'buildIndex', 'shell:gitAdd', 'jasmine_node', 'jshint', 'lintStrings', 'compliment'] - ); - grunt.registerTask('lint', ['jshint', 'compliment']); - grunt.registerTask('fastBuild', ['clean', 'browserify', 'hash', 'buildIndexDev', 'jshint']); - grunt.registerTask('watching', ['fastBuild', 'jasmine_node', 'jshint', 'lintStrings']); - - grunt.registerTask('default', ['build']); - grunt.registerTask('test', ['jasmine_node']); - grunt.registerTask('casperTest', ['shell:casperTest']); -}; diff --git a/__tests__/base.js b/__tests__/base.js index ba3cf434..bde558f9 100644 --- a/__tests__/base.js +++ b/__tests__/base.js @@ -32,61 +32,21 @@ var expectLevelAsync = function(headless, levelBlob) { return; } - var hasWarned = false; - var start; - runs(function() { - start = Date.now(); - headless.sendCommand(command); + return headless.sendCommand(command).then(function() { + expect(compareLevelTree(headless, levelBlob)).toBeTruthy(); }); - waitsFor(function() { - var diff = (Date.now() - start); - if (diff > TIME - 10 && !hasWarned) { - hasWarned = true; - console.log('this goal tree', loadTree(levelBlob.goalTreeString)); - console.log('not going to match with command', command); - console.log(getHeadlessSummary(headless)); - } - var result = compareLevelTree(headless, levelBlob); - if (result) { - console.log('solved level ' + levelBlob.name.en_US); - } - return result; - }, 'trees should be equal', TIME); }; var expectTreeAsync = function(command, expectedJSON, startJSON) { var headless = new HeadlessGit(); - var start = Date.now(); - var haveReported = false; if (startJSON) { headless.gitEngine.loadTreeFromString(startJSON); } - runs(function() { - headless.sendCommand(command); + return headless.sendCommand(command).then(function() { + expect(compareAnswer(headless, expectedJSON)).toBeTruthy(); }); - waitsFor(function() { - var diff = (Date.now() - start); - if (diff > TIME - 40 && !haveReported) { - haveReported = true; - var expected = loadTree(expectedJSON); - console.log('not going to match', command); - console.log('expected\n>>>>>>>>\n', expected); - console.log('\n<<<<<<<<<<<\nactual', getHeadlessSummary(headless)); - console.log('\n<<<>>>>\n'); - if (expected.originTree) { - console.log('expected origin tree:'); - console.log(expected.originTree); - console.log('\n=========\n'); - console.log('actual origin tree'); - console.log(getHeadlessSummary(headless).originTree); - } - console.log(expectedJSON); - console.log(JSON.stringify(getHeadlessSummary(headless))); - } - return compareAnswer(headless, expectedJSON); - }, 'trees should be equal', 500); }; var expectLevelSolved = function(levelBlob) { @@ -102,20 +62,12 @@ var runCommand = function(command, resultHandler) { var deferred = Q.defer(); var msg = null; - deferred.promise.then(function(commands) { - msg = commands[commands.length - 1].get('error').get('msg'); + return headless.sendCommand(command, deferred).then(function() { + return deferred.promise.then(function(commands) { + msg = commands[commands.length - 1].get('error').get('msg'); + resultHandler(msg); + }); }); - - runs(function() { - headless.sendCommand(command, deferred); - }); - waitsFor(function() { - if(null == msg) { - return false; - } - resultHandler(msg); - return true; - }, 'commands should be finished', 500); }; var TIME = 150; @@ -131,4 +83,3 @@ module.exports = { ONE_COMMIT_TREE: ONE_COMMIT_TREE, runCommand: runCommand }; - diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js index 1f9a8a09..1fde8112 100644 --- a/__tests__/git.spec.js +++ b/__tests__/git.spec.js @@ -4,296 +4,296 @@ var runCommand = base.runCommand; describe('Git', function() { it('Commits', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit', base.ONE_COMMIT_TREE ); }); it('handles commit options', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit; git commit --amend;', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22master%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('throws with bad arg options', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit foo; git commit -am -m; git commit -am -a; git commit -am "hi" "ho"; git commit', base.ONE_COMMIT_TREE ); }); it('handles lower case branch options', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch banana c0; git commit; git checkout -b side banana; git branch -d banana;git branch -f another c1; git commit', '{"branches":{"master":{"target":"C2","id":"master"},"side":{"target":"C3","id":"side"},"another":{"target":"C1","id":"another"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C0"],"id":"C3"}},"HEAD":{"target":"side","id":"HEAD"}}' ); }); it('handles branch options', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch banana C0; git commit; git checkout -b side banana; git branch -d banana;git branch -f another C1; git commit', '{"branches":{"master":{"target":"C2","id":"master"},"side":{"target":"C3","id":"side"},"another":{"target":"C1","id":"another"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C0"],"id":"C3"}},"HEAD":{"target":"side","id":"HEAD"}}' ); }); it('does add', function() { - expectTreeAsync( + return expectTreeAsync( 'git add; git commit', base.ONE_COMMIT_TREE ); }); it('resets with all options', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit;git reset --soft HEAD~1;git reset --hard HEAD~1;gc;go C1;git reset --hard C3;', '{"branches":{"master":{"target":"C3","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"C1","id":"HEAD"}}' ); }); it('Checkouts', function() { - expectTreeAsync( + return expectTreeAsync( 'git checkout -b side', '{"branches":{"master":{"target":"C1","id":"master"},"side":{"target":"C1","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"side","id":"HEAD"}}' ); }); it('Rebases', function() { - expectTreeAsync( + return expectTreeAsync( 'gc; git checkout -b side C1; gc; git rebase master', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22master%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22side%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22side%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('Interactive rebase', function() { - expectTreeAsync( + return expectTreeAsync( 'gc; git checkout -b side C1; gc; git rebase -i master --interactive-test', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22master%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22side%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22side%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('Interactive rebases with commit re-ordering', function() { - expectTreeAsync( - 'gc;gc;git rebase -i C0 --interactive-test C3,C1', + return expectTreeAsync( + 'gc;gc;git rebase -i C0 --interactive-test C3,C1', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%27%22%2C%22id%22%3A%22master%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C1%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C1%27%22%7D%7D%2C%22tags%22%3A%7B%7D%2C%22HEAD%22%3A%7B%22id%22%3A%22HEAD%22%2C%22target%22%3A%22master%22%7D%7D' - ); - }); + ); + }); it('Switch branch and execute interactive rebase', function() { - expectTreeAsync( - 'git branch test;git rebase -i C0 test --interactive-test', + return expectTreeAsync( + 'git branch test;git rebase -i C0 test --interactive-test', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%7D%2C%22test%22%3A%7B%22target%22%3A%22C1%27%22%2C%22id%22%3A%22test%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C1%27%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%27%22%7D%7D%2C%22tags%22%3A%7B%7D%2C%22HEAD%22%3A%7B%22id%22%3A%22HEAD%22%2C%22target%22%3A%22test%22%7D%7D' - ); - }); + ); + }); it('Reverts', function() { - expectTreeAsync( + return expectTreeAsync( 'git revert HEAD', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%27%22%2C%22id%22%3A%22master%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C1%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C1%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('Merges', function() { - expectTreeAsync( + return expectTreeAsync( 'gc; git checkout -b side C1; gc; git merge master', '{"branches":{"master":{"target":"C2","id":"master"},"side":{"target":"C4","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2","C3"],"id":"C4"}},"HEAD":{"target":"side","id":"HEAD"}}' ); }); it('Resets', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit; git reset HEAD~1', '{"branches":{"master":{"target":"C1","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}' ); }); it('Branches', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch side C0', '{"branches":{"master":{"target":"C1","id":"master"},"side":{"target":"C0","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}' ); }); it('Branches lowercase', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch side c0', '{"branches":{"master":{"target":"C1","id":"master"},"side":{"target":"C0","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}' ); }); it('Deletes branches', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch side; git branch -d side', '{"branches":{"master":{"target":"C1","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}' ); }); it('Amends commits', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit --amend', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%27%22%2C%22id%22%3A%22master%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C1%27%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('Cherry picks', function() { - expectTreeAsync( + return expectTreeAsync( 'git checkout -b side C0; gc; git cherry-pick C11; git cherry-pick C1', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C1%27%22%2C%22id%22%3A%22side%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C1%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C1%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22side%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('Range operator is not supported', function() { - expectTreeAsync( + return expectTreeAsync( 'git checkout -b side C0; git cherry-pick C1..C0', '{"branches":{"master":{"target": "C1","id": "master"},"side":{"target":"C0","id": "side"}},"commits":{"C0":{"parents":[],"id": "C0","rootCommit": true},"C1":{"parents":["C0"],"id": "C1"}},"HEAD":{"id": "HEAD","target":"side"}}' ); }); it('Forces branches', function() { - expectTreeAsync( + return expectTreeAsync( 'git checkout -b side; git branch -f side C0', '{"branches":{"master":{"target":"C1","id":"master"},"side":{"target":"C0","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"side","id":"HEAD"}}' ); }); it('Rebases only new commits to destination', function() { - expectTreeAsync( + return expectTreeAsync( 'git checkout -b side C0; gc; gc;git cherry-pick C1;git rebase master', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22side%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C1%27%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C1%27%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22side%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('checks out after a rebase', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit; git checkout -b bugFix C1; git commit; git rebase master;git checkout master', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22master%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('checks out after an interactive rebase', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit; git checkout -b bugFix C1; git commit; git rebase -i master --interactive-test;git checkout master', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22master%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('solves merging level', function() { - expectTreeAsync( + return expectTreeAsync( 'git checkout -b bugFix;git commit;git checkout master;git commit;git merge bugFix', - '{"branches":{"master":{"target":"C1","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}' + '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C4%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22bugFix%22%2C%22remoteTrackingBranchID%22%3Anull%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C2%22%2C%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%7D%2C%22tags%22%3A%7B%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('solves rebase level', function() { - expectTreeAsync( + return expectTreeAsync( 'git checkout -b bugFix;git commit;git checkout master;git commit;git checkout bugFix;git rebase master', - '{"branches":{"master":{"target":"C1","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}' + '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22bugFix%22%2C%22remoteTrackingBranchID%22%3Anull%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22tags%22%3A%7B%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22bugFix%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('solves rebase level with interactive rebase', function() { - expectTreeAsync( + return expectTreeAsync( 'git checkout -b bugFix;git commit;git checkout master;git commit;git checkout bugFix;git rebase -i master --interactive-test', - '{"branches":{"master":{"target":"C1","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}' + '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22bugFix%22%2C%22remoteTrackingBranchID%22%3Anull%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22tags%22%3A%7B%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22bugFix%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('does a whole bunch of crazy merging', function() { - expectTreeAsync( + return expectTreeAsync( 'gc;go -b side C1;gc;git merge master;go -b bug master;gc;go -b wut C3;git rebase bug;go side;git rebase wut;gc;git rebase wut;git merge C4;go master;git rebase side;go C6;git merge C3\';gb -f wut C8;go bug;git rebase wut', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C7%22%2C%22id%22%3A%22master%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C7%22%2C%22id%22%3A%22side%22%7D%2C%22bug%22%3A%7B%22target%22%3A%22C8%22%2C%22id%22%3A%22bug%22%7D%2C%22wut%22%3A%7B%22target%22%3A%22C8%22%2C%22id%22%3A%22wut%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C2%22%2C%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C6%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C6%22%7D%2C%22C6%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C6%27%22%7D%2C%22C7%22%3A%7B%22parents%22%3A%5B%22C4%22%2C%22C6%27%22%5D%2C%22id%22%3A%22C7%22%7D%2C%22C8%22%3A%7B%22parents%22%3A%5B%22C3%27%22%2C%22C6%22%5D%2C%22id%22%3A%22C8%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22bug%22%2C%22id%22%3A%22HEAD%22%7D%7D' ); }); it('if no-ff is specified, will always make a merge commit', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit; go -b side HEAD~1; git commit; git merge master; go master; git merge side --no-ff', '{"branches":{"master":{"target":"C5","id":"master","remoteTrackingBranchID":null},"side":{"target":"C4","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2","C3"],"id":"C4"},"C5":{"parents":["C2","C4"],"id":"C5"}},"HEAD":{"target":"master","id":"HEAD"}}' ); }); - it('makes a tag', function() { - expectTreeAsync( - 'git tag v1', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{"v1":{"target":"C1","id":"v1","type":"tag"}},"HEAD":{"target":"master","id":"HEAD"}}' - ); - }); + it('makes a tag', function() { + return expectTreeAsync( + 'git tag v1', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{"v1":{"target":"C1","id":"v1","type":"tag"}},"HEAD":{"target":"master","id":"HEAD"}}' + ); + }); - it('makes a tag and removes a tag', function() { - expectTreeAsync( - 'git tag v1; git tag -d v1', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' - ); - }); + it('makes a tag and removes a tag', function() { + return expectTreeAsync( + 'git tag v1; git tag -d v1', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' + ); + }); - it('makes a tag on another ref', function() { - expectTreeAsync( - 'git tag v1 C0', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{"v1":{"target":"C0","id":"v1","type":"tag"}},"HEAD":{"target":"master","id":"HEAD"}}' - ); - }); + it('makes a tag on another ref', function() { + return expectTreeAsync( + 'git tag v1 C0', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{"v1":{"target":"C0","id":"v1","type":"tag"}},"HEAD":{"target":"master","id":"HEAD"}}' + ); + }); - it('doesn\'t make a tag if ref doesn\'t resolve', function() { - expectTreeAsync( - 'git tag v1 foo', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' - ); - }); + it('doesn\'t make a tag if ref doesn\'t resolve', function() { + return expectTreeAsync( + 'git tag v1 foo', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' + ); + }); - it('makes tag with relative ref and etc', function() { - expectTreeAsync( - 'git tag v1 HEAD~1', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{"v1":{"target":"C0","id":"v1","type":"tag"}},"HEAD":{"target":"master","id":"HEAD"}}' - ); - }); + it('makes tag with relative ref and etc', function() { + return expectTreeAsync( + 'git tag v1 HEAD~1', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{"v1":{"target":"C0","id":"v1","type":"tag"}},"HEAD":{"target":"master","id":"HEAD"}}' + ); + }); - it('makes tag with 3 letters', function() { - expectTreeAsync( - 'git tag foo', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{"foo":{"target":"C1","id":"foo","type":"tag"}},"HEAD":{"target":"master","id":"HEAD"}}' - ); - }); + it('makes tag with 3 letters', function() { + return expectTreeAsync( + 'git tag foo', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{"foo":{"target":"C1","id":"foo","type":"tag"}},"HEAD":{"target":"master","id":"HEAD"}}' + ); + }); - it('does not make tag if ref does not resolve', function() { - expectTreeAsync( - 'git tag foo banana', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' - ); - }); + it('does not make tag if ref does not resolve', function() { + return expectTreeAsync( + 'git tag foo banana', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' + ); + }); - it('should respect second command for -B option', function() { - expectTreeAsync( - 'git commit; git checkout -B side C1', - '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"side":{"target":"C1","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"side","id":"HEAD"}}' - ); - }); + it('should respect second command for -B option', function() { + return expectTreeAsync( + 'git commit; git checkout -B side C1', + '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"side":{"target":"C1","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"side","id":"HEAD"}}' + ); + }); - it('will throw error if bad commits given to interactive test', function() { - expectTreeAsync( - 'gc; git rebase HEAD~2 -i --interactive-test C2,C100; gc', - '{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' - ); - }); + it('will throw error if bad commits given to interactive test', function() { + return expectTreeAsync( + 'gc; git rebase HEAD~2 -i --interactive-test C2,C100; gc', + '{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' + ); + }); it('can handle slashes and dashes in branch names but doesn\'t allow o/', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch foo/bar; git commit; git checkout foo/bar; gc; go master; git merge foo/bar; go foo/bar; git checkout -b bar-baz; git commit; git branch o/foo', '{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":null},"foo/bar":{"target":"C3","id":"foo/bar","remoteTrackingBranchID":null},"bar-baz":{"target":"C5","id":"bar-baz","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2","C3"],"id":"C4"},"C5":{"parents":["C3"],"id":"C5"}},"tags":{},"HEAD":{"target":"bar-baz","id":"HEAD"}}' - ); + ); }); it('the regex allows for multiple dashes but not in a row', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch foo-bar-banana-baz; gc; git branch foo----bar//baz', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"foo-bar-b":{"target":"C1","id":"foo-bar-b","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}' - ); + ); }); describe('RevList', function() { it('requires at least 1 argument', function() { - runCommand('git rev-list', function(commandMsg) { + return runCommand('git rev-list', function(commandMsg) { expect(commandMsg).toContain('at least 1'); }); }); @@ -302,37 +302,37 @@ describe('Git', function() { var SETUP = 'git co -b left C0; gc; git merge master; git co -b right C0; gc; git merge master; git co -b all left; git merge right; '; it('single included revision', function() { - runCommand(SETUP + 'git rev-list all', function(commandMsg) { + return runCommand(SETUP + 'git rev-list all', function(commandMsg) { expect(commandMsg).toBe('C6\nC5\nC4\nC3\nC2\nC1\nC0\n'); }); }); it('single excluded revision', function() { - runCommand(SETUP + 'git rev-list all ^right', function(commandMsg) { + return runCommand(SETUP + 'git rev-list all ^right', function(commandMsg) { expect(commandMsg).toBe('C6\nC3\nC2\n'); }); }); it('multiple included revisions', function() { - runCommand(SETUP + 'git rev-list right left', function(commandMsg) { + return runCommand(SETUP + 'git rev-list right left', function(commandMsg) { expect(commandMsg).toBe('C5\nC4\nC3\nC2\nC1\nC0\n'); }); }); it('multiple excluded revisions', function() { - runCommand(SETUP + 'git rev-list all ^right ^left', function(commandMsg) { + return runCommand(SETUP + 'git rev-list all ^right ^left', function(commandMsg) { expect(commandMsg).toBe('C6\n'); }); }); it('range between branches', function() { - runCommand(SETUP + 'git rev-list left..right', function(commandMsg) { + return runCommand(SETUP + 'git rev-list left..right', function(commandMsg) { expect(commandMsg).toBe('C5\nC4\n'); }); }); it('range between commits', function() { - runCommand(SETUP + 'git rev-list C3..C5', function(commandMsg) { + return runCommand(SETUP + 'git rev-list C3..C5', function(commandMsg) { expect(commandMsg).toBe('C5\nC4\n'); }); }); @@ -343,7 +343,7 @@ describe('Git', function() { var SETUP = 'git co -b left C0; gc; git merge master; git co -b right C0; gc; git merge master; git co -b all left; git merge right; '; it('implied HEAD', function() { - runCommand(SETUP + '; git co right; git log', function(commandMsg) { + return runCommand(SETUP + '; git co right; git log', function(commandMsg) { expect(commandMsg).toContain('Commit: C0\n'); expect(commandMsg).toContain('Commit: C1\n'); expect(commandMsg).not.toContain('Commit: C2\n'); @@ -355,7 +355,7 @@ describe('Git', function() { }); it('single included revision', function() { - runCommand(SETUP + 'git log right', function(commandMsg) { + return runCommand(SETUP + 'git log right', function(commandMsg) { expect(commandMsg).toContain('Commit: C0\n'); expect(commandMsg).toContain('Commit: C1\n'); expect(commandMsg).not.toContain('Commit: C2\n'); @@ -367,7 +367,7 @@ describe('Git', function() { }); it('single excluded revision', function() { - runCommand(SETUP + 'git log all ^right', function(commandMsg) { + return runCommand(SETUP + 'git log all ^right', function(commandMsg) { expect(commandMsg).not.toContain('Commit: C0\n'); expect(commandMsg).not.toContain('Commit: C1\n'); expect(commandMsg).toContain('Commit: C2\n'); @@ -379,7 +379,7 @@ describe('Git', function() { }); it('multiple included revisions', function() { - runCommand(SETUP + 'git log right left', function(commandMsg) { + return runCommand(SETUP + 'git log right left', function(commandMsg) { expect(commandMsg).toContain('Commit: C0\n'); expect(commandMsg).toContain('Commit: C1\n'); expect(commandMsg).toContain('Commit: C2\n'); @@ -391,7 +391,7 @@ describe('Git', function() { }); it('multiple excluded revisions', function() { - runCommand(SETUP + 'git log all ^right ^left', function(commandMsg) { + return runCommand(SETUP + 'git log all ^right ^left', function(commandMsg) { expect(commandMsg).not.toContain('Commit: C0\n'); expect(commandMsg).not.toContain('Commit: C1\n'); expect(commandMsg).not.toContain('Commit: C2\n'); diff --git a/__tests__/levels.spec.js b/__tests__/levels.spec.js index 8ee2e6fb..e4e3fa91 100644 --- a/__tests__/levels.spec.js +++ b/__tests__/levels.spec.js @@ -7,10 +7,9 @@ describe('GitEngine Levels', function() { var levels = sequences[sequenceKey]; Object.keys(levels).forEach(function(index) { var levelBlob = levels[index]; - console.log('testing level', levelBlob.name.en_US); + // console.log('testing level', levelBlob.name.en_US); base.expectLevelSolved(levelBlob); }.bind(this)); }); }); }); - diff --git a/__tests__/mercurial.spec.js b/__tests__/mercurial.spec.js index d2f7eb4c..16b2e96e 100644 --- a/__tests__/mercurial.spec.js +++ b/__tests__/mercurial.spec.js @@ -4,7 +4,7 @@ var expectTreeAsync = base.expectTreeAsync; describe('Mercurial', function() { var assert = function(msg, command, tree) { it(msg, function() { - expectTreeAsync(command, tree); + return expectTreeAsync(command, tree); }); }; @@ -63,4 +63,3 @@ describe('Mercurial', function() { ); }); - diff --git a/__tests__/remote.spec.js b/__tests__/remote.spec.js index deff3562..04122703 100644 --- a/__tests__/remote.spec.js +++ b/__tests__/remote.spec.js @@ -3,280 +3,280 @@ var expectTreeAsync = base.expectTreeAsync; describe('Git Remotes', function() { it('clones', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('does fake teamwork', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git fakeTeamwork', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('does fake teamwork and then fetches', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git fakeTeamwork; git fetch', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pulls', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git commit; git fakeTeamwork; git pull', '{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C3","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2","C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pulls with rebase', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git commit; git fakeTeamwork; git pull --rebase', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3A%22o/master%22%2C%22localBranchesThatTrackThis%22%3Anull%7D%2C%22o/master%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22o/master%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3A%5B%22master%22%5D%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%2C%22originTree%22%3A%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3Anull%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D%7D' ); }); it('pushes', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git commit; git push', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pulls and then pushes', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git commit; git fakeTeamwork; git pull; git push', '{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C4","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2","C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C3":{"parents":["C1"],"id":"C3"},"C2":{"parents":["C1"],"id":"C2"},"C4":{"parents":["C2","C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pulls with rebase and then pushes', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git commit; git fakeTeamwork; git pull --rebase; git push', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3A%22o/master%22%2C%22localBranchesThatTrackThis%22%3Anull%7D%2C%22o/master%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22o/master%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3A%5B%22master%22%5D%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%2C%22originTree%22%3A%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3Anull%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D%7D' ); }); it('clones with many branches', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch bugFix; git clone', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"bugFix":{"target":"C1","id":"bugFix","remoteTrackingBranchID":"o/bugFix"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/bugFix":{"target":"C1","id":"o/bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"bugFix":{"target":"C1","id":"bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('clones with a merge commit, does teamwork, fetches', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch bugFix; git commit; git checkout bugFix; git commit; git merge master; git clone; git fakeTeamwork bugFix 2', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"bugFix":{"target":"C4","id":"bugFix","remoteTrackingBranchID":"o/bugFix"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null},"o/bugFix":{"target":"C4","id":"o/bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2","C3"],"id":"C4"}},"HEAD":{"target":"bugFix","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"bugFix":{"target":"C6","id":"bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2","C3"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"HEAD":{"target":"bugFix","id":"HEAD"}}}' ); }); it('only fetches one branch if specified', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch bugFix; git clone; git fakeTeamwork bugFix; git fakeTeamwork; git fetch origin bugFix', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"bugFix":{"target":"C1","id":"bugFix","remoteTrackingBranchID":"o/bugFix"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/bugFix":{"target":"C2","id":"o/bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":null},"bugFix":{"target":"C2","id":"bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('checks all branches for fetching', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch bugFix; git clone; git fakeTeamwork; git fetch', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"bugFix":{"target":"C1","id":"bugFix","remoteTrackingBranchID":"o/bugFix"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null},"o/bugFix":{"target":"C1","id":"o/bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"bugFix":{"target":"C1","id":"bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pulls with nothing and then commits', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git pull; git commit', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pulls from different remote tracking branches nad merges', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch side; git clone; git fakeTeamwork side;git commit; git pull origin side;git pull;git fakeTeamwork master;git pull', '{"branches":{"master":{"target":"C6","id":"master","remoteTrackingBranchID":"o/master"},"side":{"target":"C1","id":"side","remoteTrackingBranchID":"o/side"},"o/master":{"target":"C5","id":"o/master","remoteTrackingBranchID":null},"o/side":{"target":"C2","id":"o/side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C3":{"parents":["C1"],"id":"C3"},"C2":{"parents":["C1"],"id":"C2"},"C4":{"parents":["C2","C3"],"id":"C4"},"C5":{"parents":["C1"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C5","id":"master","remoteTrackingBranchID":null},"side":{"target":"C2","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C5":{"parents":["C1"],"id":"C5"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pulls with rebase from different remote tracking', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch side; git clone; git fakeTeamwork side;git commit; git pull origin side --rebase', '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3A%22o/master%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22side%22%2C%22remoteTrackingBranchID%22%3A%22o/side%22%7D%2C%22o/master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22o/master%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3A%5B%22master%22%5D%7D%2C%22o/side%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22o/side%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3A%5B%22side%22%5D%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%2C%22originTree%22%3A%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3Anull%7D%2C%22side%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22side%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3Anull%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22side%22%2C%22id%22%3A%22HEAD%22%7D%7D%7D' ); }); it('pushes to another remote', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch side; git clone;git commit; git push origin HEAD:side', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"side":{"target":"C1","id":"side","remoteTrackingBranchID":"o/side"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/side":{"target":"C2","id":"o/side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"side":{"target":"C2","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pushes to tracking remote', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch side; git clone;git commit;git push; go side; git commit; git push', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"side":{"target":"C3","id":"side","remoteTrackingBranchID":"o/side"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null},"o/side":{"target":"C3","id":"o/side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"side","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"side":{"target":"C3","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('sets tracking when checking out remote branch', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git checkout -b side o/master;git fakeTeamwork;git pull', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null,"localBranchesThatTrackThis":["master","side"]},"side":{"target":"C2","id":"side","remoteTrackingBranchID":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"side","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('also sets tracking when just branching', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; gb side o/master', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null,"localBranchesThatTrackThis":["master","side"]},"side":{"target":"C1","id":"side","remoteTrackingBranchID":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('can push with colon refspec', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; gc; git checkout -b foo HEAD~1; git push origin master:master', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"foo","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('can delete branches with colon refspec', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch foo; git clone; git push origin :foo', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":null},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pushes new branch onto server', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git commit; git push origin master:foo', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C2","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C2","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('does not push for HEAD', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git commit; git checkout C2; git push', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"C2","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('does push for HEAD as a source though to a new branch', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git commit; git checkout C2; git push origin HEAD:foo', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C2","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"C2","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C2","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('but it cant delete master on remote', function() { - expectTreeAsync( + return expectTreeAsync( 'git branch foo; git clone; git push origin :master', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":"o/foo"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('will prune the origin tree when deleting branches', function() { - expectTreeAsync( + return expectTreeAsync( 'git checkout -b foo; git commit; git clone; git push origin :foo', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"foo":{"target":"C2","id":"foo","remoteTrackingBranchID":null},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"foo","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('will not push to a remote if the local ref does not exist', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git push origin foo', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('will push to the remote branch IF IT has tracking', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git checkout -b foo o/master; git commit; git push', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null},"foo":{"target":"C2","id":"foo","remoteTrackingBranchID":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"foo","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('will push to a new remote branch if no tracking is set up', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git checkout -b foo; git commit; git push', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"foo":{"target":"C2","id":"foo","remoteTrackingBranchID":"o/foo"},"o/foo":{"target":"C2","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"foo","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C2","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('will push to the remote tracking branch WHILE NOT on branch if it is set up', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git checkout -b foo o/master; git commit; go master; git push origin foo', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null},"foo":{"target":"C2","id":"foo","remoteTrackingBranchID":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('will not fetch if ref does not exist on remote', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git fakeTeamwork; git fetch foo:master', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('does not fetch if ref does not exist on remote with one arg', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git fakeTeamwork; git fetch foo', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('validates branch names when fetching', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git fakeTeamwork; git fetch master:HEAD; git fetch master:f<>', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('fetches only one remote if specified', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone;gc;git push origin master:banana;git fakeTeamwork banana;git fakeTeamwork master;git fetch origin banana', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/banana":{"target":"C3","id":"o/banana","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":null},"banana":{"target":"C3","id":"banana","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C1"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('sets remote tracking', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git branch foo; git branch -u o/master foo', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('sets remote tracking on current branch if not specified', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git checkout -b foo; git branch -u o/master', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"foo","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('fetches with no args, explicit dest args, and with just one arg', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git fakeTeamwork; git fetch origin master:o/master;git fakeTeamwork;git fetch;git fakeTeamwork;git fetch origin master', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C4","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('doesn\'t fetch if out of sync, but will update explicit dest if specified', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git fakeTeamwork; go HEAD~1; git fetch origin master:master;go master; gc; go HEAD~1; git fakeTeamwork;git fetch origin master:master', '{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"C2","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C4":{"parents":["C2"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('pulls to the right branch and destination', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git checkout -b side o/master;git fakeTeamwork;git pull origin master:o/master', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null},"side":{"target":"C2","id":"side","remoteTrackingBranchID":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"side","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); it('correctly checks upstream when pushing to a remote where commits already exist but branch is not updated DAYAM dawg', function() { - expectTreeAsync( + return expectTreeAsync( 'git push origin master^:master', '{"branches":{"master":{"target":"C9","id":"master","remoteTrackingBranchID":"o/master"},"foo":{"target":"C8","id":"foo","remoteTrackingBranchID":"o/foo"},"o/master":{"target":"C5","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C5","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C1"],"id":"C4"},"C5":{"parents":["C2","C4"],"id":"C5"},"C6":{"parents":["C4"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"},"C8":{"parents":["C5","C7"],"id":"C8"},"C9":{"parents":["C5"],"id":"C9"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C5","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C5","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C4":{"parents":["C1"],"id":"C4"},"C5":{"parents":["C2","C4"],"id":"C5"}},"HEAD":{"target":"master","id":"HEAD"}}}', '{"branches":{"master":{"target":"C9","id":"master","remoteTrackingBranchID":"o/master"},"foo":{"target":"C8","id":"foo","remoteTrackingBranchID":"o/foo"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C5","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C1"],"id":"C4"},"C5":{"parents":["C2","C4"],"id":"C5"},"C6":{"parents":["C4"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"},"C8":{"parents":["C5","C7"],"id":"C8"},"C9":{"parents":["C5"],"id":"C9"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C5","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C4":{"parents":["C1"],"id":"C4"},"C5":{"parents":["C2","C4"],"id":"C5"}},"HEAD":{"target":"master","id":"HEAD"}}}' @@ -284,130 +284,130 @@ describe('Git Remotes', function() { }); it('correctly resolves source during git fetch with params', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git push origin master:foo; git fakeTeamwork foo 2; git fetch origin foo^:blah', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null},"blah":{"target":"C2","id":"blah","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C3","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"foo","id":"HEAD"}}}' ); }); it('correctly makes a new branch during fetch despite nothing to download', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone; git push origin master:foo', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); }); - it('correctly resolves existing commits and updates', function() { - expectTreeAsync( + it('correctly resolves existing commits and updates', function() { + return expectTreeAsync( 'git clone; git push origin master:foo; git fakeTeamwork foo 2; git fetch origin foo^:blah;go C0; git fetch origin foo^:master', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null},"blah":{"target":"C2","id":"blah","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"C0","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C3","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"foo","id":"HEAD"}}}' ); - }); + }); - it('doesn\'t let you fetch to master if you are checked out there', function() { - expectTreeAsync( - 'git clone; git push origin master:foo; git fakeTeamwork foo 2; git fetch origin foo^:blah; git fetch foo:master', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null},"blah":{"target":"C2","id":"blah","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C3","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"foo","id":"HEAD"}}}' - ); - }); + it('doesn\'t let you fetch to master if you are checked out there', function() { + return expectTreeAsync( + 'git clone; git push origin master:foo; git fakeTeamwork foo 2; git fetch origin foo^:blah; git fetch foo:master', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null},"blah":{"target":"C2","id":"blah","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C3","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"foo","id":"HEAD"}}}' + ); + }); - it('doesn\'t let you delete branches that don\'t exist', function() { - expectTreeAsync( - 'git clone; git push origin :foo', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + it('doesn\'t let you delete branches that don\'t exist', function() { + return expectTreeAsync( + 'git clone; git push origin :foo', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); - it('pulls to a new branch and then merges in that branch', function() { - expectTreeAsync( - 'git clone; git fakeTeamwork; git commit; git pull origin master:bar', - '{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"bar":{"target":"C2","id":"bar","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C3":{"parents":["C1"],"id":"C3"},"C2":{"parents":["C1"],"id":"C2"},"C4":{"parents":["C2","C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + it('pulls to a new branch and then merges in that branch', function() { + return expectTreeAsync( + 'git clone; git fakeTeamwork; git commit; git pull origin master:bar', + '{"branches":{"master":{"target":"C4","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"bar":{"target":"C2","id":"bar","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C3":{"parents":["C1"],"id":"C3"},"C2":{"parents":["C1"],"id":"C2"},"C4":{"parents":["C2","C3"],"id":"C4"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); - it('makes a new branch from pull and doesn\'t bork', function() { - expectTreeAsync( - 'git clone; git pull origin :bar', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"bar":{"target":"C1","id":"bar","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + it('makes a new branch from pull and doesn\'t bork', function() { + return expectTreeAsync( + 'git clone; git pull origin :bar', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"bar":{"target":"C1","id":"bar","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); - it('makes the new branch on push in the right place', function() { - expectTreeAsync( - 'git clone; git fakeTeamwork; git push origin master:foo', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + it('makes the new branch on push in the right place', function() { + return expectTreeAsync( + 'git clone; git fakeTeamwork; git push origin master:foo', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); - it('tracks remote with -u', function() { - expectTreeAsync( - 'git clone; git branch foo; git branch -u o/master foo', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + it('tracks remote with -u', function() { + return expectTreeAsync( + 'git clone; git branch foo; git branch -u o/master foo', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); - it('does not fetch if one arg is not branch ref', function() { - expectTreeAsync( - 'git clone; git fakeTeamwork 2; git fetch origin master~1', - '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + it('does not fetch if one arg is not branch ref', function() { + return expectTreeAsync( + 'git clone; git fakeTeamwork 2; git fetch origin master~1', + '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); - it('creates the branch on the fly', function() { - expectTreeAsync( - 'git clone; git commit; go -b side; git push origin side', - '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"side":{"target":"C2","id":"side","remoteTrackingBranchID":"o/side"},"o/side":{"target":"C2","id":"o/side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"side","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"side":{"target":"C2","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + it('creates the branch on the fly', function() { + return expectTreeAsync( + 'git clone; git commit; go -b side; git push origin side', + '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null},"side":{"target":"C2","id":"side","remoteTrackingBranchID":"o/side"},"o/side":{"target":"C2","id":"o/side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"side","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null},"side":{"target":"C2","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); - it('does not create the o/master branch on remote', function() { - expectTreeAsync( - 'git clone; git commit; git push origin o/master', - '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + it('does not create the o/master branch on remote', function() { + return expectTreeAsync( + 'git clone; git commit; git push origin o/master', + '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); - it('pulls with rebase correctly in weird situation with no rebase to do', function() { - expectTreeAsync( - 'git checkout -b side; git commit; git checkout master; git commit; git commit; git merge side; git commit; git clone; git checkout -b main master^^^; git rebase side; git rebase main master; git push;git pull --rebase', - '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C6%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3A%22o/master%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22side%22%2C%22remoteTrackingBranchID%22%3A%22o/side%22%7D%2C%22o/master%22%3A%7B%22target%22%3A%22C6%22%2C%22id%22%3A%22o/master%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22o/side%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22o/side%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22main%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22main%22%2C%22remoteTrackingBranchID%22%3Anull%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C2%22%2C%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C6%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C6%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C6%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C6%27%22%7D%7D%2C%22tags%22%3A%7B%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%2C%22originTree%22%3A%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C6%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22side%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22side%22%2C%22remoteTrackingBranchID%22%3Anull%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C2%22%2C%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C6%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C6%22%7D%7D%2C%22tags%22%3A%7B%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D%7D' - ); - }); + it('pulls with rebase correctly in weird situation with no rebase to do', function() { + return expectTreeAsync( + 'git checkout -b side; git commit; git checkout master; git commit; git commit; git merge side; git commit; git clone; git checkout -b main master^^^; git rebase side; git rebase main master; git push;git pull --rebase', + '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C6%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3A%22o/master%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22side%22%2C%22remoteTrackingBranchID%22%3A%22o/side%22%7D%2C%22o/master%22%3A%7B%22target%22%3A%22C6%22%2C%22id%22%3A%22o/master%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22o/side%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22o/side%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22main%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22main%22%2C%22remoteTrackingBranchID%22%3Anull%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C2%22%2C%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C6%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C6%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C6%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C6%27%22%7D%7D%2C%22tags%22%3A%7B%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%2C%22originTree%22%3A%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C6%22%2C%22id%22%3A%22master%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22side%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22side%22%2C%22remoteTrackingBranchID%22%3Anull%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C2%22%2C%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C6%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C6%22%7D%7D%2C%22tags%22%3A%7B%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D%7D' + ); + }); - it('pulls with rebase in other weird situation with just fast forward', function() { - expectTreeAsync( - 'git clone; git fakeTeamwork; git pull --rebase', + it('pulls with rebase in other weird situation with just fast forward', function() { + return expectTreeAsync( + 'git clone; git fakeTeamwork; git pull --rebase', '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C2","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + ); + }); /* TODO -- enable this back when we have better async tree compare, it takes too long right now - it('will correctly resolve the dependency order of commits when fetching or pushing', function() { - expectTreeAsync( - 'git clone; git commit; git commit; git commit; git checkout -b test C2; git commit; git checkout master; git push; git checkout master; git merge test; git commit; git push; git checkout test; git commit; git commit; git checkout -b feat1 master; git commit; git merge test; git checkout master; git merge test; git checkout feat1; git commit; git checkout master; git merge feat1; git push', - '{"branches":{"master":{"target":"C14","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C7","id":"o/master","remoteTrackingBranchID":null},"test":{"target":"C9","id":"test","remoteTrackingBranchID":null},"feat1":{"target":"C13","id":"feat1","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C2"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"},"C8":{"parents":["C5"],"id":"C8"},"C9":{"parents":["C8"],"id":"C9"},"C10":{"parents":["C7"],"id":"C10"},"C11":{"parents":["C10","C9"],"id":"C11"},"C12":{"parents":["C7","C9"],"id":"C12"},"C13":{"parents":["C11"],"id":"C13"},"C14":{"parents":["C12","C13"],"id":"C14"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C7","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C2"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' - ); + it('will correctly resolve the dependency order of commits when fetching or pushing', function() { + return expectTreeAsync( + 'git clone; git commit; git commit; git commit; git checkout -b test C2; git commit; git checkout master; git push; git checkout master; git merge test; git commit; git push; git checkout test; git commit; git commit; git checkout -b feat1 master; git commit; git merge test; git checkout master; git merge test; git checkout feat1; git commit; git checkout master; git merge feat1; git push', + '{"branches":{"master":{"target":"C14","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C7","id":"o/master","remoteTrackingBranchID":null},"test":{"target":"C9","id":"test","remoteTrackingBranchID":null},"feat1":{"target":"C13","id":"feat1","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C2"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"},"C8":{"parents":["C5"],"id":"C8"},"C9":{"parents":["C8"],"id":"C9"},"C10":{"parents":["C7"],"id":"C10"},"C11":{"parents":["C10","C9"],"id":"C11"},"C12":{"parents":["C7","C9"],"id":"C12"},"C13":{"parents":["C11"],"id":"C13"},"C14":{"parents":["C12","C13"],"id":"C14"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C7","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C2"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' + ); });*/ - it('uses git force to bypass upstream check', function() { - expectTreeAsync( - 'git clone; git commit; git push; go C1; git branch -f master C1; go master; git commit; git commit; go C1; git checkout -b side; git commit; go master; git merge side; git push --force', - '{"branches":{"master":{"target":"C6","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C6","id":"o/master","remoteTrackingBranchID":null},"side":{"target":"C5","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C1"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C6","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C5":{"parents":["C1"],"id":"C5"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C6":{"parents":["C4","C5"],"id":"C6"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' - ); - }); + it('uses git force to bypass upstream check', function() { + return expectTreeAsync( + 'git clone; git commit; git push; go C1; git branch -f master C1; go master; git commit; git commit; go C1; git checkout -b side; git commit; go master; git merge side; git push --force', + '{"branches":{"master":{"target":"C6","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C6","id":"o/master","remoteTrackingBranchID":null},"side":{"target":"C5","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C1"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C6","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C5":{"parents":["C1"],"id":"C5"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C6":{"parents":["C4","C5"],"id":"C6"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); it('uses --push to delete commits', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit; git clone;git reset HEAD~1;git push --force', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' - ); + ); }); it('uses --push to delete commits and can push again after', function() { - expectTreeAsync( + return expectTreeAsync( 'git commit; git clone;git reset HEAD~1;git push --force;git commit; git push ', '{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C3","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C3","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' - ); + ); }); diff --git a/__tests__/simpleRemote.spec.js b/__tests__/simpleRemote.spec.js index 247572b6..b93ed13e 100644 --- a/__tests__/simpleRemote.spec.js +++ b/__tests__/simpleRemote.spec.js @@ -3,7 +3,7 @@ var expectTreeAsync = base.expectTreeAsync; describe('Git Remote simple', function() { it('clones', function() { - expectTreeAsync( + return expectTreeAsync( 'git clone', '{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C1","id":"o/master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C1","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"}}}' ); diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 00000000..fc4fc214 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,190 @@ +var { execSync } = require('child_process'); +var { writeFileSync, readdirSync, readFileSync } = require('fs'); + +var glob = require('glob'); +var _ = require('underscore'); + +var { src, dest, series, watch } = require('gulp'); +var log = require('fancy-log'); +var gHash = require('gulp-hash'); +var gClean = require('gulp-clean'); +var gTerser = require('gulp-terser'); +var gJasmine = require('gulp-jasmine'); +var gJshint = require('gulp-jshint'); + +var source = require('vinyl-source-stream'); +var buffer = require('vinyl-buffer'); +var browserify = require('browserify'); +var babelify = require('babelify'); + +_.templateSettings.interpolate = /\{\{(.+?)\}\}/g; +_.templateSettings.escape = /\{\{\{(.*?)\}\}\}/g; +_.templateSettings.evaluate = /\{\{-(.*?)\}\}/g; + +var prodDependencies = [ + '', + '', + '' +]; + +var devDependencies = [ + '', + '', + '' +]; + +// precompile for speed +var indexFile = readFileSync('src/template.index.html').toString(); +var indexTemplate = _.template(indexFile); + +var compliments = [ + 'Wow peter great work!', + 'Such a professional dev environment', + 'Can\'t stop the TRAIN', + 'git raging' +]; +var compliment = (done) => { + var index = Math.floor(Math.random() * compliments.length); + + log(compliments[index]); + done(); +}; + +const lintStrings = (done) => { + execSync('node src/js/intl/checkStrings'); + done(); +}; + + +var destDir = './build/'; + +var buildIndex = function(config) { + log('Building index...'); + + // first find the one in here that we want + var buildFiles = readdirSync(destDir); + + var jsRegex = /bundle-[\.\w]+\.js/; + var jsFile = buildFiles.find(function(name) { + return jsRegex.exec(name); + }); + if (!jsFile) { + throw new Error('no hashed min file found!'); + } + log('Found hashed js file: ' + jsFile); + + var styleRegex = /main-[\.\w]+\.css/; + var styleFile = buildFiles.find(function(name) { + return styleRegex.exec(name); + }); + if (!styleFile) { + throw new Error('no hashed css file found!'); + } + log('Found hashed style file: ' + styleFile); + + // output these filenames to our index template + var outputIndex = indexTemplate({ + jsFile, + styleFile, + jsDependencies: config.isProd ? + prodDependencies.join('\n') : + devDependencies.join('\n') + }); + writeFileSync('index.html', outputIndex); +}; + +var buildIndexProd = function(done) { + buildIndex({ isProd: true }); + done(); +}; +var buildIndexDev = function(done) { + buildIndex({ isProd: false }); + done(); +}; + +var getBundle = function() { + return browserify({ + entries: [...glob.sync('src/**/*.js'), ...glob.sync('src/**/*.jsx')], + debug: true, + }) + .transform(babelify, { presets: ['@babel/preset-react'] }) + .bundle() + .pipe(source('bundle.js')) + .pipe(buffer()) + .pipe(gHash()); +}; + +var clean = function () { + return src(destDir, { read: false, allowEmpty: true }) + .pipe(gClean()); +}; + +var jshint = function() { + return src([ + 'gulpfile.js', + '__tests__/', + 'src/' + ]) + .pipe(gJshint()) + .pipe(gJshint.reporter('default')); +}; + +var ifyBuild = function() { + return getBundle() + .pipe(dest(destDir)); +}; + +var miniBuild = function() { + return getBundle() + .pipe(gTerser()) + .pipe(dest(destDir)); +}; + +var style = function() { + return src('src/style/main.css') + .pipe(gHash()) + .pipe(dest(destDir)); +}; + +var jasmine = function() { + return src('__tests__/*.spec.js') + .pipe(gJasmine({ config: { + random: false, + } + })); +}; + +var gitAdd = function(done) { + execSync('git add build/'); + done(); +}; + +var fastBuild = series(clean, ifyBuild, style, buildIndexDev, jshint); + +var build = series( + clean, + miniBuild, style, buildIndexProd, + gitAdd, jasmine, jshint, + lintStrings, compliment + ); + +var lint = series(jshint, compliment); + +var watching = function() { + return watch([ + 'gulpfile.js', + '__tests__/git.spec.js', + 'src/js/**/*.js', + 'src/js/**/**/*.js', + 'src/levels/**/*.js' + ], series([fastBuild , jasmine, jshint, lintStrings])); +}; + +module.exports = { + default: build, + lint, + fastBuild, + watching, + build, + test: jasmine, +}; diff --git a/package.json b/package.json index 316d6208..4ff7afe1 100644 --- a/package.json +++ b/package.json @@ -13,23 +13,24 @@ "url": "https://github.com/pcottle/learnGitBranching" }, "devDependencies": { - "@babel/core": "^7.4.4", + "@babel/core": "^7.4.8", "@babel/preset-react": "^7.0.0", "babelify": "^10.0.0", - "browserify": "^13.0.0", + "browserify": "^16.5.0", "contributor-faces": "^1.0.2", - "grunt": "^1.0.4", - "grunt-browserify": "^5.3.0", - "grunt-contrib-clean": "^2.0.0", - "grunt-contrib-jshint": "^2.1.0", - "grunt-contrib-uglify-es": "^3.3.0", - "grunt-env": "^0.4.4", - "grunt-hash": "~0.5.0", - "grunt-jasmine-node": "~0.1.0", - "grunt-jsxhint": "^0.5.0", - "grunt-shell-spawn": "~0.3.0", - "jasmine-node": "~1.12.0", - "prompt": "^1.0.0" + "fancy-log": "^1.3.3", + "glob": "^7.1.6", + "gulp": "^4.0.2", + "gulp-clean": "^0.4.0", + "gulp-hash": "^4.2.2", + "gulp-jasmine": "^4.0.0", + "gulp-jshint": "^2.1.0", + "gulp-terser": "^1.2.0", + "gulp-uglify": "^3.0.2", + "jshint": "^2.11.0", + "prompt": "^1.0.0", + "vinyl-buffer": "^1.0.1", + "vinyl-source-stream": "^2.0.0" }, "dependencies": { "backbone": "^1.4.0", @@ -39,8 +40,8 @@ "markdown": "^0.5.0", "prop-types": "^15.7.2", "q": "^1.5.1", - "react": "^16.8.6", - "react-dom": "^16.8.6", + "react": "^16.13.0", + "react-dom": "^16.13.0", "underscore": "~1.4.3" } } diff --git a/src/js/git/headless.js b/src/js/git/headless.js index f2b2c0bc..81472285 100644 --- a/src/js/git/headless.js +++ b/src/js/git/headless.js @@ -138,8 +138,8 @@ HeadlessGit.prototype.sendCommand = function(value, entireCommandPromise) { console.log('!!!!!!!!!!!!!!!!!!!!!!'); }); deferred.resolve(); + return chain; }; exports.HeadlessGit = HeadlessGit; exports.getTreeQuick = getTreeQuick; - diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js index 1f343372..1974558b 100644 --- a/src/levels/mixed/describe.js +++ b/src/levels/mixed/describe.js @@ -732,7 +732,7 @@ exports.level = { } ] }, - "ko": { + "ko": { "childViews": [ { "type": "ModalAlert", diff --git a/src/levels/rampup/cherryPick.js b/src/levels/rampup/cherryPick.js index 91fb8135..4c359792 100644 --- a/src/levels/rampup/cherryPick.js +++ b/src/levels/rampup/cherryPick.js @@ -665,7 +665,7 @@ exports.level = { } ] }, - "ko": { + "ko": { "childViews": [ { "type": "ModalAlert", diff --git a/src/levels/rampup/detachedHead.js b/src/levels/rampup/detachedHead.js index adf557a6..cd2f9e36 100644 --- a/src/levels/rampup/detachedHead.js +++ b/src/levels/rampup/detachedHead.js @@ -14,7 +14,7 @@ exports.level = { "de_DE": "Den Kopf abtrennen", "ja" : "HEADの分離", "ru_RU": "Теряем голову, или detached HEAD", - "ko" : "HEAD 분리하기", + "ko" : "HEAD 분리하기", "uk": "Втрачаємо голову чи detached HEAD", 'vi': "Tháo đầu cái nào" }, @@ -889,7 +889,7 @@ exports.level = { } ] }, - "ko": { + "ko": { "childViews": [ { "type": "ModalAlert", diff --git a/src/levels/rampup/interactiveRebase.js b/src/levels/rampup/interactiveRebase.js index 6d09eafe..10173fe8 100644 --- a/src/levels/rampup/interactiveRebase.js +++ b/src/levels/rampup/interactiveRebase.js @@ -754,7 +754,7 @@ exports.level = { } ] }, - "ko": { + "ko": { "childViews": [ { "type": "ModalAlert", diff --git a/src/levels/rampup/relativeRefs.js b/src/levels/rampup/relativeRefs.js index 458dea2d..3667b4bd 100644 --- a/src/levels/rampup/relativeRefs.js +++ b/src/levels/rampup/relativeRefs.js @@ -860,7 +860,7 @@ exports.level = { } ] }, - "ko": { + "ko": { "childViews": [ { "type": "ModalAlert", diff --git a/src/levels/rampup/relativeRefs2.js b/src/levels/rampup/relativeRefs2.js index 69bc40fd..9caf5b02 100644 --- a/src/levels/rampup/relativeRefs2.js +++ b/src/levels/rampup/relativeRefs2.js @@ -779,7 +779,7 @@ exports.level = { } ] }, - "ko": { + "ko": { "childViews": [ { "type": "ModalAlert", diff --git a/src/style/main.css b/src/style/main.css index 827b8fee..a4018d7d 100644 --- a/src/style/main.css +++ b/src/style/main.css @@ -125,7 +125,7 @@ body, -webkit-box-align: center; -moz-box-align: center; -ms-flex-align: center; - justify-content : center; + justify-content: center; } .startAlign { diff --git a/src/template.index.html b/src/template.index.html index a709829a..dffd7862 100644 --- a/src/template.index.html +++ b/src/template.index.html @@ -69,12 +69,12 @@

+ autocomplete="off" + autocorrect="off" + autocapitalize="off" + spellcheck="false" + id="commandTextField"> + diff --git a/yarn.lock b/yarn.lock index 5061ba7d..142877ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,18 +9,18 @@ dependencies: "@babel/highlight" "^7.8.3" -"@babel/core@^7.4.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.4.tgz#d496799e5c12195b3602d0fddd77294e3e38e80e" - integrity sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA== +"@babel/core@^7.4.8": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.7.tgz#b69017d221ccdeb203145ae9da269d72cf102f3b" + integrity sha512-rBlqF3Yko9cynC5CCFy6+K/w2N+Sq/ff2BPy+Krp7rHlABIr5epbA7OxVeKoMHB39LZOp1UY5SuLjy6uWi35yA== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.4" + "@babel/generator" "^7.8.7" "@babel/helpers" "^7.8.4" - "@babel/parser" "^7.8.4" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" + "@babel/parser" "^7.8.7" + "@babel/template" "^7.8.6" + "@babel/traverse" "^7.8.6" + "@babel/types" "^7.8.7" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" @@ -30,12 +30,12 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.4.tgz#35bbc74486956fe4251829f9f6c48330e8d0985e" - integrity sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA== +"@babel/generator@^7.8.6", "@babel/generator@^7.8.7": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.8.tgz#cdcd58caab730834cee9eeadb729e833b625da3e" + integrity sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.8.7" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" @@ -94,10 +94,10 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.8.3", "@babel/parser@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.4.tgz#d1dbe64691d60358a974295fa53da074dd2ce8e8" - integrity sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw== +"@babel/parser@^7.8.6", "@babel/parser@^7.8.7": + version "7.8.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.8.tgz#4c3b7ce36db37e0629be1f0d50a571d2f86f6cd4" + integrity sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA== "@babel/plugin-syntax-jsx@^7.8.3": version "7.8.3" @@ -149,34 +149,34 @@ "@babel/plugin-transform-react-jsx-self" "^7.8.3" "@babel/plugin-transform-react-jsx-source" "^7.8.3" -"@babel/template@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8" - integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ== +"@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" + integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/parser" "^7.8.6" + "@babel/types" "^7.8.6" -"@babel/traverse@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.4.tgz#f0845822365f9d5b0e312ed3959d3f827f869e3c" - integrity sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg== +"@babel/traverse@^7.8.4", "@babel/traverse@^7.8.6": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.6.tgz#acfe0c64e1cd991b3e32eae813a6eb564954b5ff" + integrity sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.4" + "@babel/generator" "^7.8.6" "@babel/helper-function-name" "^7.8.3" "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.8.4" - "@babel/types" "^7.8.3" + "@babel/parser" "^7.8.6" + "@babel/types" "^7.8.6" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" - integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== +"@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.8.7": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.7.tgz#1fc9729e1acbb2337d5b6977a63979b4819f5d1d" + integrity sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw== dependencies: esutils "^2.0.2" lodash "^4.17.13" @@ -194,14 +194,6 @@ dependencies: defer-to-connect "^1.0.1" -JSONStream@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.10.0.tgz#74349d0d89522b71f30f0a03ff9bd20ca6f12ac0" - integrity sha1-dDSdDYlSK3HzDwoD/5vSDKbxKsA= - dependencies: - jsonparse "0.0.5" - through ">=2.2.7 <3" - JSONStream@^1.0.3: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -225,19 +217,42 @@ acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.6.1: xtend "^4.0.2" acorn-walk@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.0.0.tgz#c8ba6f0f1aac4b0a9e32d1f0af12be769528f36b" - integrity sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg== - -acorn@^5.2.1: - version "5.7.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" - integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" + integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== acorn@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" - integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + version "7.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" + integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== + +ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== + dependencies: + ansi-wrap "^0.1.0" + +ansi-cyan@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" + integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM= + dependencies: + ansi-wrap "0.1.0" + +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= + dependencies: + ansi-wrap "0.1.0" + +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw= + dependencies: + ansi-wrap "0.1.0" ansi-regex@^2.0.0: version "2.1.1" @@ -249,11 +264,6 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -261,6 +271,11 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -269,12 +284,25 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== +append-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" + integrity sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE= dependencies: - sprintf-js "~1.0.2" + buffer-equal "^1.0.0" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= + +arr-diff@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" + integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo= + dependencies: + arr-flatten "^1.0.1" + array-slice "^0.2.3" arr-diff@^2.0.0: version "2.0.0" @@ -288,21 +316,79 @@ arr-diff@^4.0.0: resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= +arr-filter@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/arr-filter/-/arr-filter-1.1.2.tgz#43fdddd091e8ef11aa4c45d9cdc18e2dff1711ee" + integrity sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4= + dependencies: + make-iterator "^1.0.0" + arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== +arr-map@^2.0.0, arr-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/arr-map/-/arr-map-2.0.2.tgz#3a77345ffc1cf35e2a91825601f9e58f2e24cac4" + integrity sha1-Onc0X/wc814qkYJWAfnljy4kysQ= + dependencies: + make-iterator "^1.0.0" + +arr-union@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" + integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0= + arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-each@^1.0.0, array-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= + array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= +array-initial@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795" + integrity sha1-L6dLJnOTccOUe9enrcc74zSz15U= + dependencies: + array-slice "^1.0.0" + is-number "^4.0.0" + +array-last@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336" + integrity sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg== + dependencies: + is-number "^4.0.0" + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= + +array-slice@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" + integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== + +array-sort@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a" + integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg== + dependencies: + default-compare "^1.0.0" + get-value "^2.0.6" + kind-of "^5.0.2" + array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" @@ -313,6 +399,11 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -340,22 +431,27 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +async-done@^1.2.0, async-done@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/async-done/-/async-done-1.3.2.tgz#5e15aa729962a4b07414f528a88cdf18e0b290a2" + integrity sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.2" + process-nextick-args "^2.0.0" + stream-exhaust "^1.0.1" + async-each@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -async@^1.5.2, async@~1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= - -async@^2.5.0, async@^2.6.1: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== +async-settle@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b" + integrity sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs= dependencies: - lodash "^4.17.14" + async-done "^1.2.2" async@~0.9.0: version "0.9.2" @@ -377,6 +473,21 @@ babelify@^10.0.0: resolved "https://registry.yarnpkg.com/babelify/-/babelify-10.0.0.tgz#fe73b1a22583f06680d8d072e25a1e0d1d1d7fb5" integrity sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg== +bach@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/bach/-/bach-1.2.0.tgz#4b3ce96bf27134f79a1b414a51c14e34c3bd9880" + integrity sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA= + dependencies: + arr-filter "^1.1.1" + arr-flatten "^1.0.1" + arr-map "^2.0.0" + array-each "^1.0.0" + array-initial "^1.0.0" + array-last "^1.1.1" + async-done "^1.2.2" + async-settle "^1.0.0" + now-and-later "^2.0.0" + backbone@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.4.0.tgz#54db4de9df7c3811c3f032f34749a4cd27f3bd12" @@ -419,6 +530,14 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" +bl@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" + integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" @@ -493,15 +612,6 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4: inherits "^2.0.1" safe-buffer "^5.0.1" -browserify-cache-api@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/browserify-cache-api/-/browserify-cache-api-3.0.1.tgz#96247e853f068fd6e0d45cc73f0bb2cd9778ef02" - integrity sha1-liR+hT8Gj9bg1FzHPwuyzZd47wI= - dependencies: - async "^1.5.2" - through2 "^2.0.0" - xtend "^4.0.0" - browserify-cipher@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" @@ -521,16 +631,6 @@ browserify-des@^1.0.0: inherits "^2.0.1" safe-buffer "^5.1.2" -browserify-incremental@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/browserify-incremental/-/browserify-incremental-3.1.1.tgz#0713cb7587247a632a9f08cf1bd169b878b62a8a" - integrity sha1-BxPLdYckemMqnwjPG9FpuHi2Koo= - dependencies: - JSONStream "^0.10.0" - browserify-cache-api "^3.0.0" - through2 "^2.0.0" - xtend "^4.0.0" - browserify-rsa@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" @@ -552,13 +652,6 @@ browserify-sign@^4.0.0: inherits "^2.0.1" parse-asn1 "^5.0.0" -browserify-zlib@^0.1.4, browserify-zlib@~0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" - integrity sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0= - dependencies: - pako "~0.2.0" - browserify-zlib@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" @@ -566,60 +659,7 @@ browserify-zlib@~0.2.0: dependencies: pako "~1.0.5" -browserify@^13.0.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/browserify/-/browserify-13.3.0.tgz#b5a9c9020243f0c70e4675bec8223bc627e415ce" - integrity sha1-tanJAgJD8McORnW+yCI7xifkFc4= - dependencies: - JSONStream "^1.0.3" - assert "^1.4.0" - browser-pack "^6.0.1" - browser-resolve "^1.11.0" - browserify-zlib "~0.1.2" - buffer "^4.1.0" - cached-path-relative "^1.0.0" - concat-stream "~1.5.1" - console-browserify "^1.1.0" - constants-browserify "~1.0.0" - crypto-browserify "^3.0.0" - defined "^1.0.0" - deps-sort "^2.0.0" - domain-browser "~1.1.0" - duplexer2 "~0.1.2" - events "~1.1.0" - glob "^7.1.0" - has "^1.0.0" - htmlescape "^1.1.0" - https-browserify "~0.0.0" - inherits "~2.0.1" - insert-module-globals "^7.0.0" - labeled-stream-splicer "^2.0.0" - module-deps "^4.0.8" - os-browserify "~0.1.1" - parents "^1.0.1" - path-browserify "~0.0.0" - process "~0.11.0" - punycode "^1.3.2" - querystring-es3 "~0.2.0" - read-only-stream "^2.0.0" - readable-stream "^2.0.2" - resolve "^1.1.4" - shasum "^1.0.0" - shell-quote "^1.6.1" - stream-browserify "^2.0.0" - stream-http "^2.0.0" - string_decoder "~0.10.0" - subarg "^1.0.0" - syntax-error "^1.1.1" - through2 "^2.0.0" - timers-browserify "^1.0.1" - tty-browserify "~0.0.0" - url "~0.11.0" - util "~0.10.1" - vm-browserify "~0.0.1" - xtend "^4.0.0" - -browserify@^16.0.0, browserify@^16.1.0: +browserify@^16.5.0: version "16.5.0" resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.5.0.tgz#a1c2bc0431bec11fd29151941582e3f645ede881" integrity sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw== @@ -673,6 +713,11 @@ browserify@^16.0.0, browserify@^16.1.0: vm-browserify "^1.0.0" xtend "^4.0.0" +buffer-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -683,19 +728,10 @@ buffer-xor@^1.0.3: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= -buffer@^4.1.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - buffer@^5.0.2: - version "5.4.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115" - integrity sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A== + version "5.5.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.5.0.tgz#9c3caa3d623c33dd1c7ef584b89b88bf9c9bc1ce" + integrity sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -751,23 +787,17 @@ camelcase@^2.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -chalk@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2, chalk@~2.4.1: +chalk@^2.0.0, chalk@^2.1.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -776,7 +806,7 @@ chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2, chalk@~2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chokidar@^2.1.1: +chokidar@^2.0.0: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -813,14 +843,6 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -cli@0.6.x: - version "0.6.6" - resolved "https://registry.yarnpkg.com/cli/-/cli-0.6.6.tgz#02ad44a380abf27adac5e6f0cdd7b043d74c53e3" - integrity sha1-Aq1Eo4Cr8nraxebwzdewQ9dMU+M= - dependencies: - exit "0.1.2" - glob "~ 3.2.1" - cli@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14" @@ -838,6 +860,11 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= + clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" @@ -845,25 +872,38 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= + +clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +cloneable-readable@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" + integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== + dependencies: + inherits "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -coffee-script@>=1.0.1: - version "1.12.7" - resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53" - integrity sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw== - -coffeescript@~1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-1.10.0.tgz#e7aa8301917ef621b35d8a39f348dcdd1db7e33e" - integrity sha1-56qDAZF+9iGzXYo580jc3R234z4= - -coffeescript@~1.12.7: - version "1.12.7" - resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-1.12.7.tgz#e57ee4c4867cf7f606bfc4a0f2d550c0981ddd27" - integrity sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA== +collection-map@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c" + integrity sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw= + dependencies: + arr-map "^2.0.2" + for-own "^1.0.0" + make-iterator "^1.0.0" collection-visit@^1.0.0: version "1.0.0" @@ -885,6 +925,11 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + colors@1.0.x: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" @@ -895,11 +940,6 @@ colors@^1.1.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -colors@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= - combine-source-map@^0.8.0, combine-source-map@~0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" @@ -910,10 +950,10 @@ combine-source-map@^0.8.0, combine-source-map@~0.8.0: lodash.memoize "~3.0.3" source-map "~0.5.3" -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== +commander@^2.20.0, commander@~2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== component-emitter@^1.2.1: version "1.3.0" @@ -925,7 +965,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.4.1, concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: +concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -935,15 +975,6 @@ concat-stream@^1.4.1, concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@ readable-stream "^2.2.2" typedarray "^0.0.6" -concat-stream@~1.5.0, concat-stream@~1.5.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" - integrity sha1-cIl4Yk2FavQaWnQd790mHadSwmY= - dependencies: - inherits "~2.0.1" - readable-stream "~2.0.0" - typedarray "~0.0.5" - console-browserify@1.1.x: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" @@ -972,7 +1003,7 @@ contributor-faces@^1.0.2: readme-filename "^1.0.0" replace-in-file "^2.0.1" -convert-source-map@^1.7.0: +convert-source-map@^1.5.0, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== @@ -989,6 +1020,14 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +copy-props@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.4.tgz#93bb1cadfafd31da5bb8a9d4b41f471ec3a72dfe" + integrity sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A== + dependencies: + each-props "^1.3.0" + is-plain-object "^2.0.1" + core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" @@ -1073,6 +1112,14 @@ cycle@1.0.x: resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI= +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + dash-ast@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37" @@ -1083,14 +1130,6 @@ date-now@^0.1.4: resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -dateformat@~1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" - integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= - dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" - debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1127,11 +1166,30 @@ deep-equal@~0.2.1: resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d" integrity sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0= +default-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" + integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ== + dependencies: + kind-of "^5.0.2" + +default-resolution@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684" + integrity sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ= + defer-to-connect@^1.0.1: version "1.1.3" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== +define-properties@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -1177,13 +1235,10 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" -detective@^4.0.0: - version "4.7.1" - resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e" - integrity sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig== - dependencies: - acorn "^5.2.1" - defined "^1.0.0" +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= detective@^5.2.0: version "5.2.0" @@ -1216,11 +1271,6 @@ domain-browser@^1.2.0: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -domain-browser@~1.1.0: - version "1.1.7" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" - integrity sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw= - domelementtype@1: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" @@ -1258,6 +1308,24 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= +duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +each-props@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333" + integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA== + dependencies: + is-plain-object "^2.0.1" + object.defaults "^1.1.0" + elliptic@^6.0.0: version "6.5.2" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" @@ -1278,7 +1346,7 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" -end-of-stream@^1.1.0: +end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -1302,36 +1370,62 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-2.3.0.tgz#96edb9f2fdb01995822b263dd8aadab6748181bc" + integrity sha1-lu258v2wGZWCKyY92KratnSBgbw= + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +es6-weak-map@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - esutils@^2.0.0, esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -eventemitter2@~0.4.13: - version "0.4.14" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab" - integrity sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas= - events@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/events/-/events-2.1.0.tgz#2a9a1e18e6106e0e812aa9ebd4a819b3c29c0ba5" integrity sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg== -events@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= - evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -1353,7 +1447,7 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -exit@0.1.2, exit@0.1.x, exit@~0.1.1: +exit@0.1.2, exit@0.1.x: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= @@ -1385,6 +1479,27 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + +extend-shallow@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" + integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE= + dependencies: + kind-of "^1.1.0" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -1400,6 +1515,11 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" @@ -1426,6 +1546,16 @@ eyes@0.1.x: resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= +fancy-log@^1.3.2, fancy-log@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" + integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + parse-node-version "^1.0.0" + time-stamp "^1.0.0" + fast-safe-stringify@^2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" @@ -1470,14 +1600,6 @@ fbjs@^1.0.0: setimmediate "^1.0.5" ua-parser-js "^0.7.18" -figures@^1.0.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" @@ -1488,14 +1610,6 @@ filename-regex@^2.0.0: resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= -fileset@~0.1.5: - version "0.1.8" - resolved "https://registry.yarnpkg.com/fileset/-/fileset-0.1.8.tgz#506b91a9396eaa7e32fb42a84077c7a0c736b741" - integrity sha1-UGuRqTluqn4y+0KoQHfHoMc2t0E= - dependencies: - glob "3.x" - minimatch "0.x" - fill-range@^2.1.0: version "2.2.4" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" @@ -1532,12 +1646,49 @@ find-up@^2.0.0: dependencies: locate-path "^2.0.0" -findup-sync@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" - integrity sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY= +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= dependencies: - glob "~5.0.0" + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +findup-sync@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +fined@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b" + integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== + dependencies: + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" + parse-filepath "^1.0.1" + +flagged-respawn@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" + integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== + +flush-write-stream@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" flux@^3.1.3: version "3.1.3" @@ -1559,6 +1710,13 @@ for-own@^0.1.4: dependencies: for-in "^1.0.1" +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= + dependencies: + for-in "^1.0.1" + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -1566,6 +1724,14 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" +fs-mkdirp-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" + integrity sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes= + dependencies: + graceful-fs "^4.1.11" + through2 "^2.0.3" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1584,21 +1750,6 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -gaze@~0.3.2: - version "0.3.4" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.3.4.tgz#5f94bdda0afe53bc710969bcd6f282548d60c279" - integrity sha1-X5S92gr+U7xxCWm81vKCVI1gwnk= - dependencies: - fileset "~0.1.5" - minimatch "~0.2.9" - -gaze@~1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" - integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== - dependencies: - globule "^1.0.0" - gensync@^1.0.0-beta.1: version "1.0.0-beta.1" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" @@ -1643,11 +1794,6 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -getobject@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/getobject/-/getobject-0.1.0.tgz#047a449789fa160d018f5486ed91320b6ec7885c" - integrity sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw= - gh-got@^8.0.1: version "8.1.0" resolved "https://registry.yarnpkg.com/gh-got/-/gh-got-8.1.0.tgz#2378d07ac293f524549c75f8dc6f3604a885ab01" @@ -1678,15 +1824,35 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob@3.x, "glob@~ 3.2.1": - version "3.2.11" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" - integrity sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0= +glob-stream@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" + integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ= dependencies: - inherits "2" - minimatch "0.3" + extend "^3.0.0" + glob "^7.1.1" + glob-parent "^3.1.0" + is-negated-glob "^1.0.0" + ordered-read-streams "^1.0.0" + pumpify "^1.3.5" + readable-stream "^2.1.5" + remove-trailing-separator "^1.0.1" + to-absolute-glob "^2.0.0" + unique-stream "^2.0.2" -glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: +glob-watcher@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.3.tgz#88a8abf1c4d131eb93928994bc4a593c2e5dd626" + integrity sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg== + dependencies: + anymatch "^2.0.0" + async-done "^1.2.0" + chokidar "^2.0.0" + is-negated-glob "^1.0.0" + just-debounce "^1.0.0" + object.defaults "^1.1.0" + +glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -1698,42 +1864,37 @@ glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@~5.0.0: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" -glob@~7.0.0: - version "7.0.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" - integrity sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo= +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.2" - once "^1.3.0" - path-is-absolute "^1.0.0" + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globule@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.0.tgz#41d0e9fb44afd4b80d93a23263714f90b3dec904" - integrity sha512-YlD4kdMqRCQHrhVdonet4TdRtv1/sZKepvoxNT4Nrhrp5HI8XFfc8kFlGlBn2myBo80aGp8Eft259mbcUJhgSg== +glogg@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f" + integrity sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA== dependencies: - glob "~7.1.1" - lodash "~4.17.10" - minimatch "~3.0.2" + sparkles "^1.0.0" got@^9.5.0: version "9.6.0" @@ -1752,195 +1913,144 @@ got@^9.5.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2: +graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== -growl@^1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -growl@~1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.7.0.tgz#de2d66136d002e112ba70f3f10c31cf7c350b2da" - integrity sha1-3i1mE20ALhErpw8/EMMc98NQsto= - -grunt-browserify@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/grunt-browserify/-/grunt-browserify-5.3.0.tgz#47fd8cf8bac58fe2de683afdc57f7f3a80ca792d" - integrity sha1-R/2M+LrFj+LeaDr9xX9/OoDKeS0= +gulp-clean@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/gulp-clean/-/gulp-clean-0.4.0.tgz#3bc25e7084e641bbd7bde057cf90c01c50d95950" + integrity sha512-DARK8rNMo4lHOFLGTiHEJdf19GuoBDHqGUaypz+fOhrvOs3iFO7ntdYtdpNxv+AzSJBx/JfypF0yEj9ks1IStQ== dependencies: - async "^2.5.0" - browserify "^16.0.0" - browserify-incremental "^3.1.1" - glob "^7.1.2" - lodash "^4.17.4" - resolve "^1.1.6" - watchify "^3.6.1" - -grunt-cli@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.2.0.tgz#562b119ebb069ddb464ace2845501be97b35b6a8" - integrity sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg= - dependencies: - findup-sync "~0.3.0" - grunt-known-options "~1.1.0" - nopt "~3.0.6" - resolve "~1.1.0" - -grunt-contrib-clean@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/grunt-contrib-clean/-/grunt-contrib-clean-2.0.0.tgz#3be7ca480da4b740aa5e9d863e2f7e8b24f8a68b" - integrity sha512-g5ZD3ORk6gMa5ugZosLDQl3dZO7cI3R14U75hTM+dVLVxdMNJCPVmwf9OUt4v4eWgpKKWWoVK9DZc1amJp4nQw== - dependencies: - async "^2.6.1" + fancy-log "^1.3.2" + plugin-error "^0.1.2" rimraf "^2.6.2" + through2 "^2.0.3" + vinyl "^2.1.0" -grunt-contrib-jshint@0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/grunt-contrib-jshint/-/grunt-contrib-jshint-0.11.0.tgz#2ba17953d30471c3ba58792a5aa92e447059de45" - integrity sha1-K6F5U9MEccO6WHkqWqkuRHBZ3kU= +gulp-cli@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.2.0.tgz#5533126eeb7fe415a7e3e84a297d334d5cf70ebc" + integrity sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA== dependencies: - hooker "~0.2.3" - jshint "~2.6.0" + ansi-colors "^1.0.1" + archy "^1.0.0" + array-sort "^1.0.0" + color-support "^1.1.3" + concat-stream "^1.6.0" + copy-props "^2.0.1" + fancy-log "^1.3.2" + gulplog "^1.0.0" + interpret "^1.1.0" + isobject "^3.0.1" + liftoff "^3.1.0" + matchdep "^2.0.0" + mute-stdout "^1.0.0" + pretty-hrtime "^1.0.0" + replace-homedir "^1.0.0" + semver-greatest-satisfied-range "^1.1.0" + v8flags "^3.0.1" + yargs "^7.1.0" -grunt-contrib-jshint@^2.1.0: +gulp-hash-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gulp-hash-filename/-/gulp-hash-filename-3.0.0.tgz#e9820fb7a20f3cd16a720413be7485aaee1782b9" + integrity sha512-wAtigX+faOEl/cQJCJ/pcY6mKSS2cGkoCT1FopUqjakM6AKYe1WuYEht0wcWTNinJGxj6m1tKMEMZUWhO0MD5Q== + +gulp-hash@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/gulp-hash/-/gulp-hash-4.2.2.tgz#2cf4ad081ef7a65393a51e3df58f514f388f4523" + integrity sha512-uWCjiy7ZXCPu4aaTM454+ImCnrR+07MKdwpunDZU0I7oUd5+SfyDxxhYzgpzSRVSlCFWfBBqNY9vAL3m3F+3uw== + dependencies: + es6-promise "^2.1.1" + lodash.assign "^2.4.1" + lodash.template "^2.4.1" + through2 "^2.0.0" + vinyl "^2.1.0" + +gulp-jasmine@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/gulp-jasmine/-/gulp-jasmine-4.0.0.tgz#efe566b8350f41a14f63ffaecc6ccdf8646709a9" + integrity sha512-0UqY2fA6RCdUDJDsVym3zXYSWmt0AV7YY/6PAeKb+oGTKEgS7zZOH5w/4gcSKs+2FXiWrucQwLDvtEKIDbpF4A== + dependencies: + arrify "^1.0.1" + jasmine "^3.1.0" + jasmine-terminal-reporter "^1.0.3" + plugin-error "^1.0.1" + through2 "^2.0.3" + +gulp-jshint@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/grunt-contrib-jshint/-/grunt-contrib-jshint-2.1.0.tgz#3d789807579034299da1b41c4d70e1ba722973ed" - integrity sha512-65S2/C/6RfjY/umTxfwXXn+wVvaYmykHkHSsW6Q6rhkbv3oudTEgqnFFZvWzWCoHUb+3GMZLbP3oSrNyvshmIQ== + resolved "https://registry.yarnpkg.com/gulp-jshint/-/gulp-jshint-2.1.0.tgz#bfaf927f78eee263c5bbac5f63e314d44a7bd41e" + integrity sha512-sP3NK8Y/1e58O0PH9t6s7DAr/lKDSUbIY207oWSeufM6/VclB7jJrIBcPCsyhrFTCDUl9DauePbt6VqP2vPM5w== dependencies: - chalk "^2.4.2" - hooker "^0.2.3" - jshint "~2.10.2" + lodash "^4.12.0" + minimatch "^3.0.3" + plugin-error "^0.1.2" + rcloader "^0.2.2" + through2 "^2.0.0" -grunt-contrib-uglify-es@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/grunt-contrib-uglify-es/-/grunt-contrib-uglify-es-3.3.0.tgz#c15f7b11fd413203d4e0c9137f5d3faf55a8df80" - integrity sha1-wV97Ef1BMgPU4MkTf10/r1Wo34A= +gulp-terser@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gulp-terser/-/gulp-terser-1.2.0.tgz#41df2a1d0257d011ba8b05efb2568432ecd0495b" + integrity sha512-lf+jE2DALg2w32p0HRiYMlFYRYelKZPNunHp2pZccCYrrdCLOs0ItbZcN63yr2pbz116IyhUG9mD/QbtRO1FKA== dependencies: - chalk "^1.0.0" - maxmin "^1.1.0" - uglify-es "~3.3.0" - uri-path "^1.0.0" + plugin-error "^1.0.1" + terser "^4.0.0" + through2 "^3.0.1" + vinyl-sourcemaps-apply "^0.2.1" -grunt-env@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/grunt-env/-/grunt-env-0.4.4.tgz#3b38843a8d737177ddc9f893879fb69ce1a0bc2f" - integrity sha1-OziEOo1zcXfdyfiTh5+2nOGgvC8= +gulp-uglify@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.2.tgz#5f5b2e8337f879ca9dec971feb1b82a5a87850b0" + integrity sha512-gk1dhB74AkV2kzqPMQBLA3jPoIAPd/nlNzP2XMDSG8XZrqnlCiDGAqC+rZOumzFvB5zOphlFh6yr3lgcAb/OOg== dependencies: - ini "~1.3.0" - lodash "~2.4.1" + array-each "^1.0.1" + extend-shallow "^3.0.2" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + isobject "^3.0.1" + make-error-cause "^1.1.1" + safe-buffer "^5.1.2" + through2 "^2.0.0" + uglify-js "^3.0.5" + vinyl-sourcemaps-apply "^0.2.0" -grunt-hash@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/grunt-hash/-/grunt-hash-0.5.0.tgz#98781d799f74b29538692f58c61d50648c1bd29e" - integrity sha1-mHgdeZ90spU4aS9Yxh1QZIwb0p4= - -grunt-jasmine-node@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/grunt-jasmine-node/-/grunt-jasmine-node-0.1.0.tgz#063b80c5d73ae4e9640d4ad47263f94d98092eaa" - integrity sha1-BjuAxdc65OlkDUrUcmP5TZgJLqo= +gulp@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-4.0.2.tgz#543651070fd0f6ab0a0650c6a3e6ff5a7cb09caa" + integrity sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA== dependencies: - jasmine-node ">=1.4.0" + glob-watcher "^5.0.3" + gulp-cli "^2.2.0" + undertaker "^1.2.1" + vinyl-fs "^3.0.0" -grunt-jsxhint@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/grunt-jsxhint/-/grunt-jsxhint-0.5.0.tgz#f2c701b0cafc7b34d37d1f46f1e374e8114926b6" - integrity sha1-8scBsMr8ezTTfR9G8eN06BFJJrY= - dependencies: - grunt-contrib-jshint "0.11.0" - jshint "~2.6.0" - proxyquire "~1.3.1" - rewire "~2.1.5" - -grunt-known-options@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-1.1.1.tgz#6cc088107bd0219dc5d3e57d91923f469059804d" - integrity sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ== - -grunt-legacy-log-utils@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz#d2f442c7c0150065d9004b08fd7410d37519194e" - integrity sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA== - dependencies: - chalk "~2.4.1" - lodash "~4.17.10" - -grunt-legacy-log@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz#c8cd2c6c81a4465b9bbf2d874d963fef7a59ffb9" - integrity sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw== - dependencies: - colors "~1.1.2" - grunt-legacy-log-utils "~2.0.0" - hooker "~0.2.3" - lodash "~4.17.5" - -grunt-legacy-util@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz#e10624e7c86034e5b870c8a8616743f0a0845e42" - integrity sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A== - dependencies: - async "~1.5.2" - exit "~0.1.1" - getobject "~0.1.0" - hooker "~0.2.3" - lodash "~4.17.10" - underscore.string "~3.3.4" - which "~1.3.0" - -grunt-shell-spawn@~0.3.0: - version "0.3.12" - resolved "https://registry.yarnpkg.com/grunt-shell-spawn/-/grunt-shell-spawn-0.3.12.tgz#1cc5acd429ae08311d77f691e91eaa2645e1d391" - integrity sha512-TprZct92sQ4M2Q92piaeLsCrx4+gq/ageuxjZsRG6cglKt7x7rGA3YHt8D30+G789v+/pw4l0tDjEyrkMXx2tA== - dependencies: - grunt ">=0.4.x" - -grunt@>=0.4.x, grunt@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.0.4.tgz#c799883945a53a3d07622e0737c8f70bfe19eb38" - integrity sha512-PYsMOrOC+MsdGEkFVwMaMyc6Ob7pKmq+deg1Sjr+vvMWp35sztfwKE7qoN51V+UEtHsyNuMcGdgMLFkBHvMxHQ== - dependencies: - coffeescript "~1.10.0" - dateformat "~1.0.12" - eventemitter2 "~0.4.13" - exit "~0.1.1" - findup-sync "~0.3.0" - glob "~7.0.0" - grunt-cli "~1.2.0" - grunt-known-options "~1.1.0" - grunt-legacy-log "~2.0.0" - grunt-legacy-util "~1.1.1" - iconv-lite "~0.4.13" - js-yaml "~3.13.0" - minimatch "~3.0.2" - mkdirp "~0.5.1" - nopt "~3.0.6" - path-is-absolute "~1.0.0" - rimraf "~2.6.2" - -gzip-size@^1.0.0: +gulplog@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-1.0.0.tgz#66cf8b101047227b95bace6ea1da0c177ed5c22f" - integrity sha1-Zs+LEBBHInuVus5uodoMF37Vwi8= + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + integrity sha1-4oxNRdBey77YGDY86PnFkmIp/+U= dependencies: - browserify-zlib "^0.1.4" - concat-stream "^1.4.1" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" + glogg "^1.0.0" has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + integrity sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4= + dependencies: + sparkles "^1.0.0" + +has-symbols@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -2004,15 +2114,17 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hooker@^0.2.3, hooker@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/hooker/-/hooker-0.2.3.tgz#b834f723cc4a242aa65963459df6d984c5d3d959" - integrity sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk= +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" hosted-git-info@^2.1.4: - version "2.8.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" - integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== htmlescape@^1.1.0: version "1.1.1" @@ -2031,20 +2143,15 @@ htmlparser2@3.8.x: readable-stream "1.1" http-cache-semantics@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#495704773277eeef6e43f9ab2c2c7d259dda25c5" - integrity sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew== + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -https-browserify@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" - integrity sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI= - i@0.3.x: version "0.3.6" resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d" @@ -2069,11 +2176,6 @@ indent-string@^2.1.0: dependencies: repeating "^2.0.0" -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -2097,7 +2199,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@~1.3.0: +ini@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -2125,11 +2227,24 @@ insert-module-globals@^7.0.0: undeclared-identifiers "^1.1.2" xtend "^4.0.0" +interpret@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -2228,11 +2343,9 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= - dependencies: - number-is-nan "^1.0.0" + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== is-fullwidth-code-point@^1.0.0: version "1.0.0" @@ -2267,6 +2380,11 @@ is-glob@^4.0.0: dependencies: is-extglob "^2.1.1" +is-negated-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" + integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= + is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" @@ -2286,7 +2404,7 @@ is-number@^4.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== -is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -2303,17 +2421,36 @@ is-primitive@^2.0.0: resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" + is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= -is-utf8@^0.2.0: +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" + +is-utf8@^0.2.0, is-utf8@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-windows@^1.0.2: +is-valid-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" + integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao= + +is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -2323,7 +2460,7 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: +isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -2358,62 +2495,26 @@ isstream@0.1.x: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -jasmine-growl-reporter@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/jasmine-growl-reporter/-/jasmine-growl-reporter-0.0.3.tgz#b87ae551e359d28ad5217765eaef6c07b763f6c8" - integrity sha1-uHrlUeNZ0orVIXdl6u9sB7dj9sg= - dependencies: - growl "~1.7.0" +jasmine-core@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.5.0.tgz#132c23e645af96d85c8bca13c8758b18429fc1e4" + integrity sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA== -jasmine-growl-reporter@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/jasmine-growl-reporter/-/jasmine-growl-reporter-2.0.0.tgz#4943a2481193d66a8a68ee2f38b6c360fb037859" - integrity sha512-RYwVfPaGgxQQSHDOt6jQ99/KAkFQ/Fiwg/AzBS+uO9A4UhGhxb7hwXaUUSU/Zs0MxBoFNqmIRC+7P4/+5O3lXg== +jasmine-terminal-reporter@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/jasmine-terminal-reporter/-/jasmine-terminal-reporter-1.0.3.tgz#896f1ec8fdf4bf6aecdd41c503eda7347f61526b" + integrity sha1-iW8eyP30v2rs3UHFA+2nNH9hUms= dependencies: - growl "^1.10.5" + indent-string "^2.1.0" + pluralize "^1.2.1" -jasmine-node@>=1.4.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jasmine-node/-/jasmine-node-3.0.0.tgz#f12b6fdd24633402ec23e8ea6fef6ffbcb464f90" - integrity sha512-vUa5Q7bQYwHHqi6FlJYndiKqZp+d+c3MKe0QUMwwrC4JRmoRV3zkg0buxB/uQ6qLh0NO34TNstpAnvaZ6xGlAA== +jasmine@^3.1.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-3.5.0.tgz#7101eabfd043a1fc82ac24e0ab6ec56081357f9e" + integrity sha512-DYypSryORqzsGoMazemIHUfMkXM7I7easFaxAvNM3Mr6Xz3Fy36TupTrAOxZWN8MVKEU5xECv22J4tUQf3uBzQ== dependencies: - coffeescript "~1.12.7" - gaze "~1.1.2" - jasmine-growl-reporter "~2.0.0" - jasmine-reporters "~1.0.0" - mkdirp "~0.3.5" - requirejs "~2.3.6" - underscore "~1.9.1" - walkdir "~0.0.12" - -jasmine-node@~1.12.0: - version "1.12.1" - resolved "https://registry.yarnpkg.com/jasmine-node/-/jasmine-node-1.12.1.tgz#a7ddd86bb0b4cca06ffa48de28abb4e9192ba47b" - integrity sha1-p93Ya7C0zKBv+kjeKKu06RkrpHs= - dependencies: - coffee-script ">=1.0.1" - gaze "~0.3.2" - jasmine-growl-reporter "~0.0.2" - jasmine-reporters ">=0.2.0" - mkdirp "~0.3.5" - requirejs ">=0.27.1" - underscore ">= 1.3.1" - walkdir ">= 0.0.1" - -jasmine-reporters@>=0.2.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/jasmine-reporters/-/jasmine-reporters-2.3.2.tgz#898818ffc234eb8b3f635d693de4586f95548d43" - integrity sha512-u/7AT9SkuZsUfFBLLzbErohTGNsEUCKaQbsVYnLFW1gEuL2DzmBL4n8v90uZsqIqlWvWUgian8J6yOt5Fyk/+A== - dependencies: - mkdirp "^0.5.1" - xmldom "^0.1.22" - -jasmine-reporters@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jasmine-reporters/-/jasmine-reporters-1.0.2.tgz#ab613ed5977dc7487e85b3c12f6a8ea8db2ade31" - integrity sha1-q2E+1Zd9x0h+hbPBL2qOqNsq3jE= - dependencies: - mkdirp "~0.3.5" + glob "^7.1.4" + jasmine-core "~3.5.0" jquery@^3.4.0: version "3.4.1" @@ -2425,23 +2526,15 @@ jquery@^3.4.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@~3.13.0: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -jshint@~2.10.2: - version "2.10.3" - resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.10.3.tgz#98dc765bf6920b41bc2719f76b8739d6f6e93a9c" - integrity sha512-d8AoXcNNYzmm7cdmulQ3dQApbrPYArtVBO6n4xOICe4QsXGNHCAKDcFORzqP52LhK61KX0VhY39yYzCsNq+bxQ== +jshint@^2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.11.0.tgz#7f3d99820b8b653eaaec7015a563b2d8101cbbc8" + integrity sha512-ooaD/hrBPhu35xXW4gn+o3SOuzht73gdBuffgJzrZBJZPGgGiiTvJEgTyxFvBO2nz0+X1G6etF8SzUODTlLY6Q== dependencies: cli "~1.0.0" console-browserify "1.1.x" @@ -2452,25 +2545,16 @@ jshint@~2.10.2: shelljs "0.3.x" strip-json-comments "1.0.x" -jshint@~2.6.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.6.3.tgz#84b470b8e5d5cd7adf0a3bd4975250443c9d311a" - integrity sha1-hLRwuOXVzXrfCjvUl1JQRDydMRo= - dependencies: - cli "0.6.x" - console-browserify "1.1.x" - exit "0.1.x" - htmlparser2 "3.8.x" - minimatch "1.0.x" - shelljs "0.3.x" - strip-json-comments "1.0.x" - underscore "1.6.x" - json-buffer@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + json-stable-stringify@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" @@ -2490,16 +2574,16 @@ jsonify@~0.0.0: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= -jsonparse@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-0.0.5.tgz#330542ad3f0a654665b778f3eb2d9a9fa507ac64" - integrity sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ= - jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= +just-debounce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.0.0.tgz#87fccfaeffc0b68cd19d55f6722943f929ea35ea" + integrity sha1-h/zPrv/AtozRnVX2cilD+SnqNeo= + keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -2507,6 +2591,11 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" +kind-of@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" + integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ= + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -2521,7 +2610,7 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" -kind-of@^5.0.0: +kind-of@^5.0.0, kind-of@^5.0.2: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== @@ -2539,6 +2628,21 @@ labeled-stream-splicer@^2.0.0: inherits "^2.0.1" stream-splicer "^2.0.0" +last-run@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b" + integrity sha1-RblpQsF7HHnHchmCWbqUO+v4yls= + dependencies: + default-resolution "^2.0.0" + es6-weak-map "^2.0.1" + +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= + dependencies: + readable-stream "^2.0.5" + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -2546,6 +2650,27 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +lead@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" + integrity sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI= + dependencies: + flush-write-stream "^1.0.2" + +liftoff@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3" + integrity sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog== + dependencies: + extend "^3.0.0" + findup-sync "^3.0.0" + fined "^1.0.1" + flagged-respawn "^1.0.0" + is-plain-object "^2.0.4" + object.map "^1.0.0" + rechoir "^0.6.2" + resolve "^1.1.7" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -2575,21 +2700,245 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +lodash._basebind@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._basebind/-/lodash._basebind-2.4.1.tgz#e940b9ebdd27c327e0a8dab1b55916c5341e9575" + integrity sha1-6UC5690nwyfgqNqxtVkWxTQelXU= + dependencies: + lodash._basecreate "~2.4.1" + lodash._setbinddata "~2.4.1" + lodash._slice "~2.4.1" + lodash.isobject "~2.4.1" + +lodash._basecreate@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz#f8e6f5b578a9e34e541179b56b8eeebf4a287e08" + integrity sha1-+Ob1tXip405UEXm1a47uv0oofgg= + dependencies: + lodash._isnative "~2.4.1" + lodash.isobject "~2.4.1" + lodash.noop "~2.4.1" + +lodash._basecreatecallback@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz#7d0b267649cb29e7a139d0103b7c11fae84e4851" + integrity sha1-fQsmdknLKeehOdAQO3wR+uhOSFE= + dependencies: + lodash._setbinddata "~2.4.1" + lodash.bind "~2.4.1" + lodash.identity "~2.4.1" + lodash.support "~2.4.1" + +lodash._basecreatewrapper@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz#4d31f2e7de7e134fbf2803762b8150b32519666f" + integrity sha1-TTHy595+E0+/KAN2K4FQsyUZZm8= + dependencies: + lodash._basecreate "~2.4.1" + lodash._setbinddata "~2.4.1" + lodash._slice "~2.4.1" + lodash.isobject "~2.4.1" + +lodash._createwrapper@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz#51d6957973da4ed556e37290d8c1a18c53de1607" + integrity sha1-UdaVeXPaTtVW43KQ2MGhjFPeFgc= + dependencies: + lodash._basebind "~2.4.1" + lodash._basecreatewrapper "~2.4.1" + lodash._slice "~2.4.1" + lodash.isfunction "~2.4.1" + +lodash._escapehtmlchar@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" + integrity sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0= + dependencies: + lodash._htmlescapes "~2.4.1" + +lodash._escapestringchar@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" + integrity sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I= + +lodash._htmlescapes@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" + integrity sha1-MtFL8IRLbeb4tioFG09nwii2JMs= + +lodash._isnative@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" + integrity sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw= + +lodash._objecttypes@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" + integrity sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE= + +lodash._reinterpolate@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" + integrity sha1-TxInqlqHEfxjL1sHofRgequLMiI= + +lodash._reunescapedhtml@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" + integrity sha1-dHxPxAED6zu4oJduVx96JlnpO6c= + dependencies: + lodash._htmlescapes "~2.4.1" + lodash.keys "~2.4.1" + +lodash._setbinddata@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz#f7c200cd1b92ef236b399eecf73c648d17aa94d2" + integrity sha1-98IAzRuS7yNrOZ7s9zxkjReqlNI= + dependencies: + lodash._isnative "~2.4.1" + lodash.noop "~2.4.1" + +lodash._shimkeys@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" + integrity sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM= + dependencies: + lodash._objecttypes "~2.4.1" + +lodash._slice@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._slice/-/lodash._slice-2.4.1.tgz#745cf41a53597b18f688898544405efa2b06d90f" + integrity sha1-dFz0GlNZexj2iImFREBe+isG2Q8= + +lodash.assign@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-2.4.1.tgz#84c39596dd71181a97b0652913a7c9675e49b1aa" + integrity sha1-hMOVlt1xGBqXsGUpE6fJZ15Jsao= + dependencies: + lodash._basecreatecallback "~2.4.1" + lodash._objecttypes "~2.4.1" + lodash.keys "~2.4.1" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= + +lodash.bind@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-2.4.1.tgz#5d19fa005c8c4d236faf4742c7b7a1fcabe29267" + integrity sha1-XRn6AFyMTSNvr0dCx7eh/Kvikmc= + dependencies: + lodash._createwrapper "~2.4.1" + lodash._slice "~2.4.1" + +lodash.clonedeep@^4.3.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.defaults@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" + integrity sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ= + dependencies: + lodash._objecttypes "~2.4.1" + lodash.keys "~2.4.1" + +lodash.escape@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" + integrity sha1-LOEsXghNsKV92l5dHu659dF1o7Q= + dependencies: + lodash._escapehtmlchar "~2.4.1" + lodash._reunescapedhtml "~2.4.1" + lodash.keys "~2.4.1" + +lodash.identity@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.identity/-/lodash.identity-2.4.1.tgz#6694cffa65fef931f7c31ce86c74597cf560f4f1" + integrity sha1-ZpTP+mX++TH3wxzobHRZfPVg9PE= + +lodash.isfunction@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz#2cfd575c73e498ab57e319b77fa02adef13a94d1" + integrity sha1-LP1XXHPkmKtX4xm3f6Aq3vE6lNE= + +lodash.isobject@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" + integrity sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0= + +lodash.isobject@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" + integrity sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU= + dependencies: + lodash._objecttypes "~2.4.1" + +lodash.keys@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" + integrity sha1-SN6kbfj/djKxDXBrissmWR4rNyc= + dependencies: + lodash._isnative "~2.4.1" + lodash._shimkeys "~2.4.1" + lodash.isobject "~2.4.1" + lodash.memoize@~3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8= -lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.4, lodash@~4.17.10, lodash@~4.17.11, lodash@~4.17.5: +lodash.merge@^4.6.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.noop@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-2.4.1.tgz#4fb54f816652e5ae10e8f72f717a388c7326538a" + integrity sha1-T7VPgWZS5a4Q6PcvcXo4jHMmU4o= + +lodash.support@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.support/-/lodash.support-2.4.1.tgz#320e0b67031673c28d7a2bb5d9e0331a45240515" + integrity sha1-Mg4LZwMWc8KNeiu12eAzGkUkBRU= + dependencies: + lodash._isnative "~2.4.1" + +lodash.template@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" + integrity sha1-nmEQB+32KRKal0qzxIuBez4c8g0= + dependencies: + lodash._escapestringchar "~2.4.1" + lodash._reinterpolate "~2.4.1" + lodash.defaults "~2.4.1" + lodash.escape "~2.4.1" + lodash.keys "~2.4.1" + lodash.templatesettings "~2.4.1" + lodash.values "~2.4.1" + +lodash.templatesettings@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" + integrity sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk= + dependencies: + lodash._reinterpolate "~2.4.1" + lodash.escape "~2.4.1" + +lodash.values@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" + integrity sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ= + dependencies: + lodash.keys "~2.4.1" + +lodash@^4.12.0, lodash@^4.17.13, lodash@~4.17.11: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lodash@~2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" - integrity sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4= - loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -2615,11 +2964,6 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -lru-cache@2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI= - lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -2628,7 +2972,26 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" -map-cache@^0.2.2: +make-error-cause@^1.1.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d" + integrity sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0= + dependencies: + make-error "^1.2.0" + +make-error@^1.2.0: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +make-iterator@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" + integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== + dependencies: + kind-of "^6.0.2" + +map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= @@ -2652,21 +3015,21 @@ markdown@^0.5.0: dependencies: nopt "~2.1.1" +matchdep@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e" + integrity sha1-xvNINKDY28OzfCfui7yyfHd1WC4= + dependencies: + findup-sync "^2.0.0" + micromatch "^3.0.4" + resolve "^1.4.0" + stack-trace "0.0.10" + math-random@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== -maxmin@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/maxmin/-/maxmin-1.1.0.tgz#71365e84a99dd8f8b3f7d5fde2f00d1e7f73be61" - integrity sha1-cTZehKmd2Piz99X94vANHn9zvmE= - dependencies: - chalk "^1.0.0" - figures "^1.0.1" - gzip-size "^1.0.0" - pretty-bytes "^1.0.0" - md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -2683,7 +3046,7 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" -meow@^3.1.0, meow@^3.3.0, meow@^3.7.0: +meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= @@ -2718,7 +3081,7 @@ micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.1.10, micromatch@^3.1.4: +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -2765,54 +3128,22 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@0.3: - version "0.3.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" - integrity sha1-J12O2qxPG7MyZHIInnlJyDlGmd0= - dependencies: - lru-cache "2" - sigmund "~1.0.0" - -minimatch@0.x: - version "0.4.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.4.0.tgz#bd2c7d060d2c8c8fd7cde7f1f2ed2d5b270fdb1b" - integrity sha1-vSx9Bg0sjI/Xzefx8u0tWycP2xs= - dependencies: - lru-cache "2" - sigmund "~1.0.0" - -minimatch@1.0.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-1.0.0.tgz#e0dd2120b49e1b724ce8d714c520822a9438576d" - integrity sha1-4N0hILSeG3JM6NcUxSCCKpQ4V20= - dependencies: - lru-cache "2" - sigmund "~1.0.0" - -"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -minimatch@~0.2.9: - version "0.2.14" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" - integrity sha1-x054BXT2PG+aCQ6Q775u9TpqdWo= - dependencies: - lru-cache "2" - sigmund "~1.0.0" - minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== mixin-deep@^1.2.0: version "1.3.2" @@ -2822,39 +3153,13 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.x.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: +mkdirp@0.x.x, mkdirp@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" -mkdirp@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" - integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= - -module-deps@^4.0.8: - version "4.1.1" - resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.1.1.tgz#23215833f1da13fd606ccb8087b44852dcb821fd" - integrity sha1-IyFYM/HaE/1gbMuAh7RIUty4If0= - dependencies: - JSONStream "^1.0.3" - browser-resolve "^1.7.0" - cached-path-relative "^1.0.0" - concat-stream "~1.5.0" - defined "^1.0.0" - detective "^4.0.0" - duplexer2 "^0.1.2" - inherits "^2.0.1" - parents "^1.0.0" - readable-stream "^2.0.2" - resolve "^1.1.3" - stream-combiner2 "^1.1.1" - subarg "^1.0.0" - through2 "^2.0.0" - xtend "^4.0.0" - module-deps@^6.0.0: version "6.2.2" resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.2.tgz#d8a15c2265dfc119153c29bb47386987d0ee423b" @@ -2886,6 +3191,11 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +mute-stdout@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" + integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== + mute-stream@~0.0.4: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -2918,6 +3228,11 @@ ncp@1.0.x: resolved "https://registry.yarnpkg.com/ncp/-/ncp-1.0.1.tgz#d15367e5cb87432ba117d2bf80fdf45aecfb4246" integrity sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY= +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -2933,13 +3248,6 @@ nopt@~2.1.1: dependencies: abbrev "1" -nopt@~3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" - normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -2967,6 +3275,13 @@ normalize-url@^4.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== +now-and-later@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c" + integrity sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ== + dependencies: + once "^1.3.2" + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -2993,6 +3308,11 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-keys@^1.0.11, object-keys@^1.0.12: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -3000,6 +3320,34 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" +object.assign@^4.0.4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.defaults@^1.0.0, object.defaults@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + +object.map@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" + integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -3008,30 +3356,47 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -object.pick@^1.3.0: +object.pick@^1.2.0, object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" -once@^1.3.0, once@^1.3.1, once@^1.4.0: +object.reduce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.reduce/-/object.reduce-1.0.1.tgz#6fe348f2ac7fa0f95ca621226599096825bb03ad" + integrity sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60= + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + +once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" -os-browserify@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a617d8fe54" - integrity sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ= +ordered-read-streams@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" + integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4= + dependencies: + readable-stream "^2.0.1" os-browserify@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + os-locale@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" @@ -3041,13 +3406,6 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" -outpipe@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2" - integrity sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I= - dependencies: - shell-quote "^1.4.2" - p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" @@ -3077,11 +3435,6 @@ p-try@^1.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= -pako@~0.2.0: - version "0.2.9" - resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" - integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= - pako@~1.0.5: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" @@ -3106,6 +3459,15 @@ parse-asn1@^5.0.0: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" +parse-filepath@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -3123,6 +3485,16 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" +parse-node-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -3150,7 +3522,7 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1, path-is-absolute@~1.0.0: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -3170,6 +3542,18 @@ path-platform@~0.11.15: resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I= +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + dependencies: + path-root-regex "^0.1.0" + path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -3224,6 +3608,32 @@ pkginfo@0.x.x: resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8= +plugin-error@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" + integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4= + dependencies: + ansi-cyan "^0.1.1" + ansi-red "^0.1.1" + arr-diff "^1.0.1" + arr-union "^2.0.1" + extend-shallow "^1.1.2" + +plugin-error@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" + integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA== + dependencies: + ansi-colors "^1.0.1" + arr-diff "^4.0.0" + arr-union "^3.1.0" + extend-shallow "^3.0.2" + +pluralize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + integrity sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU= + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -3239,20 +3649,12 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= -pretty-bytes@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84" - integrity sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ= - dependencies: - get-stdin "^4.0.1" - meow "^3.1.0" +pretty-hrtime@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= - -process-nextick-args@~2.0.0: +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== @@ -3290,11 +3692,6 @@ prop-types@^15.6.2, prop-types@^15.7.2: object-assign "^4.1.1" react-is "^16.8.1" -proxyquire@~1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-1.3.2.tgz#d6e801ac00b0c05efb20947ba34738b5aa02f48d" - integrity sha1-1ugBrACwwF77IJR7o0c4taoC9I0= - pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -3312,6 +3709,14 @@ public-encrypt@^4.0.0: randombytes "^2.0.1" safe-buffer "^5.1.2" +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -3320,6 +3725,15 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" +pumpify@^1.3.5: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -3369,25 +3783,42 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -react-dom@^16.8.6: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.12.0.tgz#0da4b714b8d13c2038c9396b54a92baea633fe11" - integrity sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw== +rcfinder@^0.1.6: + version "0.1.9" + resolved "https://registry.yarnpkg.com/rcfinder/-/rcfinder-0.1.9.tgz#f3e80f387ddf9ae80ae30a4100329642eae81115" + integrity sha1-8+gPOH3fmugK4wpBADKWQuroERU= + dependencies: + lodash.clonedeep "^4.3.2" + +rcloader@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/rcloader/-/rcloader-0.2.2.tgz#58d2298b462d0b9bfd2133d2a1ec74fbd705c717" + integrity sha1-WNIpi0YtC5v9ITPSoex0+9cFxxc= + dependencies: + lodash.assign "^4.2.0" + lodash.isobject "^3.0.2" + lodash.merge "^4.6.0" + rcfinder "^0.1.6" + +react-dom@^16.13.0: + version "16.13.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.0.tgz#cdde54b48eb9e8a0ca1b3dc9943d9bb409b81866" + integrity sha512-y09d2c4cG220DzdlFkPTnVvGTszVvNpC73v+AaLGLHbkpy3SSgvYq8x0rNwPJ/Rk/CicTNgk0hbHNw1gMEZAXg== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.18.0" + scheduler "^0.19.0" react-is@^16.8.1: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" - integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== + version "16.13.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.0.tgz#0f37c3613c34fe6b37cd7f763a0d6293ab15c527" + integrity sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA== -react@^16.8.6: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83" - integrity sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA== +react@^16.13.0: + version "16.13.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.13.0.tgz#d046eabcdf64e457bbeed1e792e235e1b9934cf7" + integrity sha512-TSavZz2iSLkq5/oiE7gnFzmURKZMltmi193rm5HEoUDAXpzT9Kzw6oNZnGoai/4+fUnm7FqS5dwgUL34TujcWQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -3451,7 +3882,16 @@ readable-stream@1.1: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@2 || 3", readable-stream@^3.0.6: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -3464,27 +3904,6 @@ readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@^2.3.6, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.5.0.tgz#465d70e6d1087f6162d079cd0b5db7fbebfd1606" - integrity sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@~2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" - integrity sha1-j5A0HmilPMySh4jaz80Rs265t44= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -3499,6 +3918,13 @@ readme-filename@^1.0.0: resolved "https://registry.yarnpkg.com/readme-filename/-/readme-filename-1.0.0.tgz#08ec2dda26520cd16f3e836d01553f8a108efe5e" integrity sha1-COwt2iZSDNFvPoNtAVU/ihCO/l4= +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -3522,7 +3948,24 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -remove-trailing-separator@^1.0.1: +remove-bom-buffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" + integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ== + dependencies: + is-buffer "^1.1.5" + is-utf8 "^0.2.1" + +remove-bom-stream@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523" + integrity sha1-BfGlk/FuQuH7kOv1nejlaVJflSM= + dependencies: + remove-bom-buffer "^3.0.0" + safe-buffer "^5.1.0" + through2 "^2.0.3" + +remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= @@ -3544,6 +3987,20 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" +replace-ext@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= + +replace-homedir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c" + integrity sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw= + dependencies: + homedir-polyfill "^1.0.1" + is-absolute "^1.0.0" + remove-trailing-separator "^1.1.0" + replace-in-file@^2.0.1: version "2.6.4" resolved "https://registry.yarnpkg.com/replace-in-file/-/replace-in-file-2.6.4.tgz#a80e25c5c0e0efe9d04afe01a4a57ff98e8b6461" @@ -3563,25 +4020,35 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= -requirejs@>=0.27.1, requirejs@~2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.6.tgz#e5093d9601c2829251258c0b9445d4d19fa9e7c9" - integrity sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg== +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-options@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" + integrity sha1-MrueOcBtZzONyTeMDW1gdFZq0TE= + dependencies: + value-or-function "^3.0.0" resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.1.7, resolve@~1.1.0: +resolve@1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.4.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5" - integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw== +resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.4.0: + version "1.15.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" + integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== dependencies: path-parse "^1.0.6" @@ -3602,11 +4069,6 @@ revalidator@0.1.x: resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" integrity sha1-/s5hv6DBtSoga9axgZgYS91SOjs= -rewire@~2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/rewire/-/rewire-2.1.5.tgz#764599179cae5e393839bf3ad6e0be371ee49d81" - integrity sha1-dkWZF5yuXjk4Ob861uC+Nx7knYE= - rimraf@2.x.x, rimraf@^2.6.2: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -3614,13 +4076,6 @@ rimraf@2.x.x, rimraf@^2.6.2: dependencies: glob "^7.1.3" -rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -3651,14 +4106,21 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -scheduler@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.18.0.tgz#5901ad6659bc1d8f3fdaf36eb7a67b0d6746b1c4" - integrity sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ== +scheduler@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.0.tgz#a715d56302de403df742f4a9be11975b32f5698d" + integrity sha512-xowbVaTPe9r7y7RUejcK73/j8tt2jfiyTednOvHbA8JoClvMYCp+r8QegLwK/n8zWQAtZb1fFnER4XLBZXrCxA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" +semver-greatest-satisfied-range@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b" + integrity sha1-E+jCZYq5aRywzXEJMkAoDTb3els= + dependencies: + sver-compat "^1.5.0" + "semver@2 || 3 || 4 || 5", semver@^5.4.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -3719,7 +4181,7 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -shell-quote@^1.4.2, shell-quote@^1.6.1: +shell-quote@^1.6.1: version "1.7.2" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== @@ -3729,11 +4191,6 @@ shelljs@0.3.x: resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1" integrity sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E= -sigmund@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= - signal-exit@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -3785,21 +4242,34 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.5.0, source-map@^0.5.6, source-map@~0.5.3: +source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.6, source-map@~0.5.3: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@~0.6.1: +source-map@^0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +sparkles@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" + integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw== + spdx-correct@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" @@ -3833,17 +4303,7 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -sprintf-js@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" - integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -stack-trace@0.0.x: +stack-trace@0.0.10, stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= @@ -3872,16 +4332,10 @@ stream-combiner2@^1.1.1: duplexer2 "~0.1.0" readable-stream "^2.0.2" -stream-http@^2.0.0: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" +stream-exhaust@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d" + integrity sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw== stream-http@^3.0.0: version "3.1.0" @@ -3893,6 +4347,11 @@ stream-http@^3.0.0: readable-stream "^3.0.6" xtend "^4.0.0" +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + stream-splicer@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd" @@ -3901,7 +4360,7 @@ stream-splicer@^2.0.0: inherits "^2.0.1" readable-stream "^2.0.2" -string-width@^1.0.1: +string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= @@ -3925,7 +4384,7 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -string_decoder@~0.10.0, string_decoder@~0.10.x: +string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= @@ -3987,11 +4446,6 @@ subarg@^1.0.0: dependencies: minimist "^1.1.0" -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -3999,6 +4453,14 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" +sver-compat@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8" + integrity sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg= + dependencies: + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + syntax-error@^1.1.1: version "1.4.0" resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" @@ -4006,7 +4468,24 @@ syntax-error@^1.1.1: dependencies: acorn-node "^1.2.0" -through2@^2.0.0: +terser@^4.0.0: + version "4.6.6" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.6.tgz#da2382e6cafbdf86205e82fb9a115bd664d54863" + integrity sha512-4lYPyeNmstjIIESr/ysHg2vUPRGf2tzF9z2yYwnowXVuVzLEamPN1Gfrz7f8I9uEPuHcbFlW4PLIAsJoxXyJ1g== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +through2-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" + integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -4014,11 +4493,23 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" +through2@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" + integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + dependencies: + readable-stream "2 || 3" + "through@>=2.2.7 <3": version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= + timers-browserify@^1.0.1: version "1.4.2" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" @@ -4026,10 +4517,13 @@ timers-browserify@^1.0.1: dependencies: process "~0.11.0" -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= +to-absolute-glob@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" + integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs= + dependencies: + is-absolute "^1.0.0" + is-negated-glob "^1.0.0" to-fast-properties@^2.0.0: version "2.0.0" @@ -4066,17 +4560,34 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +to-through@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" + integrity sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY= + dependencies: + through2 "^2.0.3" + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= -tty-browserify@0.0.1, tty-browserify@~0.0.0: +tty-browserify@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== -typedarray@^0.0.6, typedarray@~0.0.5: +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" + integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== + +typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= @@ -4086,12 +4597,12 @@ ua-parser-js@^0.7.18: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== -uglify-es@~3.3.0: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== +uglify-js@^3.0.5: + version "3.8.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.8.0.tgz#f3541ae97b2f048d7e7e3aa4f39fd8a1f5d7a805" + integrity sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ== dependencies: - commander "~2.13.0" + commander "~2.20.3" source-map "~0.6.1" umd@^3.0.0: @@ -4099,6 +4610,11 @@ umd@^3.0.0: resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= + undeclared-identifiers@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f" @@ -4110,20 +4626,7 @@ undeclared-identifiers@^1.1.2: simple-concat "^1.0.0" xtend "^4.0.1" -underscore.string@~3.3.4: - version "3.3.5" - resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023" - integrity sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg== - dependencies: - sprintf-js "^1.0.3" - util-deprecate "^1.0.2" - -underscore@1.6.x: - version "1.6.0" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" - integrity sha1-izixDKze9jM3uLJOT/htRa6lKag= - -"underscore@>= 1.3.1", underscore@>=1.8.3, underscore@~1.9.1: +underscore@>=1.8.3: version "1.9.2" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.2.tgz#0c8d6f536d6f378a5af264a72f7bec50feb7cf2f" integrity sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ== @@ -4133,6 +4636,26 @@ underscore@~1.4.3: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" integrity sha1-YaajIBBiKvoHljvzJSA88SI51gQ= +undertaker-registry@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50" + integrity sha1-XkvaMI5KiirlhPm5pDWaSZglzFA= + +undertaker@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.2.1.tgz#701662ff8ce358715324dfd492a4f036055dfe4b" + integrity sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA== + dependencies: + arr-flatten "^1.0.1" + arr-map "^2.0.0" + bach "^1.0.0" + collection-map "^1.0.0" + es6-weak-map "^2.0.1" + last-run "^1.1.0" + object.defaults "^1.0.0" + object.reduce "^1.0.0" + undertaker-registry "^1.0.0" + union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" @@ -4143,6 +4666,14 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" +unique-stream@^2.0.2: + version "2.3.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" + integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== + dependencies: + json-stable-stringify-without-jsonify "^1.0.1" + through2-filter "^3.0.0" + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -4156,11 +4687,6 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -uri-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/uri-path/-/uri-path-1.0.0.tgz#9747f018358933c31de0fccfd82d138e67262e32" - integrity sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI= - urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -4186,7 +4712,7 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -4217,6 +4743,13 @@ utile@0.3.x: ncp "1.0.x" rimraf "2.x.x" +v8flags@^3.0.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8" + integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w== + dependencies: + homedir-polyfill "^1.0.1" + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -4225,52 +4758,103 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +value-or-function@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" + integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM= + +vinyl-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vinyl-buffer/-/vinyl-buffer-1.0.1.tgz#96c1a3479b8c5392542c612029013b5b27f88bbf" + integrity sha1-lsGjR5uMU5JULGEgKQE7Wyf4i78= + dependencies: + bl "^1.2.1" + through2 "^2.0.3" + +vinyl-fs@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" + integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng== + dependencies: + fs-mkdirp-stream "^1.0.0" + glob-stream "^6.1.0" + graceful-fs "^4.0.0" + is-valid-glob "^1.0.0" + lazystream "^1.0.0" + lead "^1.0.0" + object.assign "^4.0.4" + pumpify "^1.3.5" + readable-stream "^2.3.3" + remove-bom-buffer "^3.0.0" + remove-bom-stream "^1.2.0" + resolve-options "^1.1.0" + through2 "^2.0.0" + to-through "^2.0.0" + value-or-function "^3.0.0" + vinyl "^2.0.0" + vinyl-sourcemap "^1.1.0" + +vinyl-source-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/vinyl-source-stream/-/vinyl-source-stream-2.0.0.tgz#f38a5afb9dd1e93b65d550469ac6182ac4f54b8e" + integrity sha1-84pa+53R6Ttl1VBGmsYYKsT1S44= + dependencies: + through2 "^2.0.3" + vinyl "^2.1.0" + +vinyl-sourcemap@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" + integrity sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY= + dependencies: + append-buffer "^1.0.2" + convert-source-map "^1.5.0" + graceful-fs "^4.1.6" + normalize-path "^2.1.1" + now-and-later "^2.0.0" + remove-bom-buffer "^3.0.0" + vinyl "^2.0.0" + +vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" + integrity sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU= + dependencies: + source-map "^0.5.1" + +vinyl@^2.0.0, vinyl@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" + integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + vm-browserify@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -vm-browserify@~0.0.1: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= - dependencies: - indexof "0.0.1" - -"walkdir@>= 0.0.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.4.1.tgz#dc119f83f4421df52e3061e514228a2db20afa39" - integrity sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ== - -walkdir@~0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.12.tgz#2f24f1ade64aab1e458591d4442c8868356e9281" - integrity sha512-HFhaD4mMWPzFSqhpyDG48KDdrjfn409YQuVW7ckZYhW4sE87mYtWifdB/+73RA7+p4s4K18n5Jfx1kHthE1gBw== - -watchify@^3.6.1: - version "3.11.1" - resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.11.1.tgz#8e4665871fff1ef64c0430d1a2c9d084d9721881" - integrity sha512-WwnUClyFNRMB2NIiHgJU9RQPQNqVeFk7OmZaWf5dC5EnNa0Mgr7imBydbaJ7tGTuPM2hz1Cb4uiBvK9NVxMfog== - dependencies: - anymatch "^2.0.0" - browserify "^16.1.0" - chokidar "^2.1.1" - defined "^1.0.0" - outpipe "^1.1.0" - through2 "^2.0.0" - xtend "^4.0.0" - whatwg-fetch@>=0.10.0: version "3.0.0" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.9, which@~1.3.0: +which@^1.2.14, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -4303,12 +4887,7 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -xmldom@^0.1.22: - version "0.1.31" - resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" - integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== - -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -4323,6 +4902,13 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= + dependencies: + camelcase "^3.0.0" + yargs-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" @@ -4330,6 +4916,25 @@ yargs-parser@^7.0.0: dependencies: camelcase "^4.1.0" +yargs@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + yargs@^8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" From e00b5b640b75684b0142291a050489532d192783 Mon Sep 17 00:00:00 2001 From: Hongarc Date: Fri, 6 Mar 2020 11:52:59 +0700 Subject: [PATCH 173/359] feat: update url if user change locale --- src/js/stores/LocaleStore.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/js/stores/LocaleStore.js b/src/js/stores/LocaleStore.js index 1d024576..cb0d4ce6 100644 --- a/src/js/stores/LocaleStore.js +++ b/src/js/stores/LocaleStore.js @@ -2,6 +2,7 @@ var AppConstants = require('../constants/AppConstants'); var AppDispatcher = require('../dispatcher/AppDispatcher'); +var util = require('../util'); var EventEmitter = require('events').EventEmitter; var ActionTypes = AppConstants.ActionTypes; @@ -84,6 +85,7 @@ AppConstants.StoreSubscribePrototype, dispatchToken: AppDispatcher.register(function(payload) { var action = payload.action; var shouldInform = false; + var oldLocale = _locale; switch (action.type) { case ActionTypes.CHANGE_LOCALE: @@ -99,6 +101,12 @@ AppConstants.StoreSubscribePrototype, break; } + if (util.isBrowser() && oldLocale !== _locale) { + var url = new URL(document.location.href); + url.searchParams.set('locale', _locale); + window.history.replaceState({}, '', url.href); + } + if (shouldInform) { LocaleStore.emit(AppConstants.CHANGE_EVENT); } From 25246b402424ac72b7898e481451d1071626116c Mon Sep 17 00:00:00 2001 From: hongarc Date: Sun, 15 Mar 2020 10:55:42 +0700 Subject: [PATCH 174/359] chore(jasmine): add reporter --- gulpfile.js | 10 +++++++--- package.json | 1 + yarn.lock | 17 ++++++++++++----- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index fc4fc214..87fb0fcb 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -10,6 +10,7 @@ var gHash = require('gulp-hash'); var gClean = require('gulp-clean'); var gTerser = require('gulp-terser'); var gJasmine = require('gulp-jasmine'); +var { SpecReporter } = require('jasmine-spec-reporter'); var gJshint = require('gulp-jshint'); var source = require('vinyl-source-stream'); @@ -148,9 +149,12 @@ var style = function() { var jasmine = function() { return src('__tests__/*.spec.js') - .pipe(gJasmine({ config: { - random: false, - } + .pipe(gJasmine({ + config: { + verbose: true, + random: false, + }, + reporter: new SpecReporter(), })); }; diff --git a/package.json b/package.json index 4ff7afe1..da880db2 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "gulp-jshint": "^2.1.0", "gulp-terser": "^1.2.0", "gulp-uglify": "^3.0.2", + "jasmine-spec-reporter": "^4.2.1", "jshint": "^2.11.0", "prompt": "^1.0.0", "vinyl-buffer": "^1.0.1", diff --git a/yarn.lock b/yarn.lock index 142877ce..0016b815 100644 --- a/yarn.lock +++ b/yarn.lock @@ -935,6 +935,11 @@ colors@1.0.x: resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= +colors@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= + colors@^1.1.2: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -1953,11 +1958,6 @@ gulp-cli@^2.2.0: v8flags "^3.0.1" yargs "^7.1.0" -gulp-hash-filename@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/gulp-hash-filename/-/gulp-hash-filename-3.0.0.tgz#e9820fb7a20f3cd16a720413be7485aaee1782b9" - integrity sha512-wAtigX+faOEl/cQJCJ/pcY6mKSS2cGkoCT1FopUqjakM6AKYe1WuYEht0wcWTNinJGxj6m1tKMEMZUWhO0MD5Q== - gulp-hash@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/gulp-hash/-/gulp-hash-4.2.2.tgz#2cf4ad081ef7a65393a51e3df58f514f388f4523" @@ -2500,6 +2500,13 @@ jasmine-core@~3.5.0: resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.5.0.tgz#132c23e645af96d85c8bca13c8758b18429fc1e4" integrity sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA== +jasmine-spec-reporter@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz#1d632aec0341670ad324f92ba84b4b32b35e9e22" + integrity sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg== + dependencies: + colors "1.1.2" + jasmine-terminal-reporter@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/jasmine-terminal-reporter/-/jasmine-terminal-reporter-1.0.3.tgz#896f1ec8fdf4bf6aecdd41c503eda7347f61526b" From 17e4f195e59e52c7be3d9a986ce618ec12f0ab42 Mon Sep 17 00:00:00 2001 From: hongarc Date: Sun, 15 Mar 2020 11:06:03 +0700 Subject: [PATCH 175/359] chore(jasmine): fix test in travis-ci auto detect language --- __tests__/git.spec.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js index 1fde8112..05e72932 100644 --- a/__tests__/git.spec.js +++ b/__tests__/git.spec.js @@ -1,3 +1,4 @@ +var intl = require('../src/js/intl') var base = require('./base'); var expectTreeAsync = base.expectTreeAsync; var runCommand = base.runCommand; @@ -294,7 +295,13 @@ describe('Git', function() { it('requires at least 1 argument', function() { return runCommand('git rev-list', function(commandMsg) { - expect(commandMsg).toContain('at least 1'); + expect(commandMsg).toEqual(intl.str( + 'git-error-args-few', + { + lower: 1, + what: 'with git rev-list' + } + )); }); }); From 98050c4cbd11972f8451b6f4f4844aec08f3fda5 Mon Sep 17 00:00:00 2001 From: Hongarc Date: Sun, 15 Mar 2020 20:37:12 +0700 Subject: [PATCH 176/359] fix(typo): remove unnecessary `.` --- src/js/dialogs/nextLevel.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/dialogs/nextLevel.js b/src/js/dialogs/nextLevel.js index 0a617699..65737044 100644 --- a/src/js/dialogs/nextLevel.js +++ b/src/js/dialogs/nextLevel.js @@ -139,7 +139,7 @@ exports.dialog = { markdowns: [ '## 훌륭합니다!!', '', - '*{numCommands}*개의 명렁으로 레벨을 통과했습니다.; ', + '*{numCommands}*개의 명렁으로 레벨을 통과했습니다; ', '모범 답안은 {best}개를 사용합니다.' ] } @@ -150,7 +150,7 @@ exports.dialog = { markdowns: [ '## Làm tốt lắm!!', '', - 'Bạn hoàn thành cấp độ này với *{numCommands}* câu lệnh.; ', + 'Bạn hoàn thành cấp độ này với *{numCommands}* câu lệnh; ', 'Đáp án của chúng tôi sử dụng {best}.' ] } From fe0ebd635e4eba61c2f60a769259d4c748a19171 Mon Sep 17 00:00:00 2001 From: hongarc Date: Sun, 15 Mar 2020 22:36:18 +0700 Subject: [PATCH 177/359] chore(doc): update reference `grunt` to `gulp` --- .gitpod.yml | 4 ++-- README.md | 8 ++++---- package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitpod.yml b/.gitpod.yml index fedcbcb2..7e9d9b83 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -4,6 +4,6 @@ ports: tasks: - init: yarn install command: > - yarn grunt fastBuild && - printf "\nWelcome to Learn Git Branching\nTo rebuild the app, simply run 'yarn grunt fastBuild' and reload index.html.\n\n" && + yarn gulp fastBuild && + printf "\nWelcome to Learn Git Branching\nTo rebuild the app, simply run 'yarn gulp fastBuild' and reload index.html.\n\n" && python3 -m http.server 8000 2>/dev/null diff --git a/README.md b/README.md index efb33dc3..c8e66bed 100644 --- a/README.md +++ b/README.md @@ -70,9 +70,9 @@ Thus, if you build the app locally, all you have to do in order to run the app i ## Building yourself / Contributing Functionality For contributing core functionality in the app, you'll probably want to test your changes -at least once before submitting a pull request. That means you'll need the "Grunt.js" build tool to build the app: +at least once before submitting a pull request. That means you'll need the "gulp.js" build tool to build the app: -https://gruntjs.com/getting-started +https://gulpjs.com/docs/en/getting-started/quick-start You'll also need `yarn` to download all the dependencies of the project. @@ -85,13 +85,13 @@ yarn install git checkout -b newAwesomeFeature vim ./src/js/git/index.js # some changes -yarn grunt fastBuild # skips tests and linting, faster build +yarn gulp fastBuild # skips tests and linting, faster build # after building you can open up your browser to the index.html # file generated and see your changes vim ./src/js/git/index.js # more changes -yarn grunt build # runs tests and lint +yarn gulp build # runs tests and lint git commit -am "My new sweet feature!" git push diff --git a/package.json b/package.json index da880db2..d05f0d67 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "author": "Peter Cottle ", "license": "MIT", "scripts": { - "test": "grunt test" + "test": "gulp test" }, "repository": { "type": "git", From b73c4ad23d645b08624dd5244d9550d3f8c2b4a0 Mon Sep 17 00:00:00 2001 From: Anh Hong Date: Wed, 25 Mar 2020 01:55:13 +0700 Subject: [PATCH 178/359] chore(test): mock `localStorage` --- src/js/stores/LevelStore.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/js/stores/LevelStore.js b/src/js/stores/LevelStore.js index e486dac8..82fd01ac 100644 --- a/src/js/stores/LevelStore.js +++ b/src/js/stores/LevelStore.js @@ -5,6 +5,7 @@ var AppDispatcher = require('../dispatcher/AppDispatcher'); var EventEmitter = require('events').EventEmitter; var levelSequences = require('../../levels').levelSequences; var sequenceInfo = require('../../levels').sequenceInfo; +var util = require('../util'); var ActionTypes = AppConstants.ActionTypes; var SOLVED_MAP_STORAGE_KEY = 'solvedMap'; @@ -13,6 +14,29 @@ var _levelMap = {}; var _solvedMap = {}; var _sequences = []; +if (!util.isBrowser()) { + // https://stackoverflow.com/a/26177872/6250402 + var storage = {}; + var localStorage = { + setItem: function(key, value) { + storage[key] = value || ''; + }, + getItem: function(key) { + return key in storage ? storage[key] : null; + }, + removeItem: function(key) { + delete storage[key]; + }, + get length() { + return Object.keys(storage).length; + }, + key: function(i) { + const keys = Object.keys(storage); + return keys[i] || null; + } + }; +} + try { _solvedMap = JSON.parse( localStorage.getItem(SOLVED_MAP_STORAGE_KEY) || '{}' From 90c86fce1939649111f512f78c87e1914b349adc Mon Sep 17 00:00:00 2001 From: Stefan Niedermayr Date: Wed, 25 Mar 2020 20:44:58 +0100 Subject: [PATCH 179/359] Implemented german translation of lockedMaster level. --- src/levels/remote/lockedMaster.js | 44 ++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/levels/remote/lockedMaster.js b/src/levels/remote/lockedMaster.js index 1e82655e..ea4a2e4e 100644 --- a/src/levels/remote/lockedMaster.js +++ b/src/levels/remote/lockedMaster.js @@ -4,6 +4,7 @@ exports.level = { "startTree": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\",\"remoteTrackingBranchID\":\"o/master\"},\"o/master\":{\"target\":\"C1\",\"id\":\"o/master\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"}},\"tags\":{},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"},\"originTree\":{\"branches\":{\"master\":{\"target\":\"C1\",\"id\":\"master\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"}},\"tags\":{},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}}", "hint": { "en_US": "Make the feature branch from the local master before resetting it back to be the same as origin's master", + "de_DE": "Erstelle einen Feature-Branch ausgehend vom lokalen Master-Branch, bevor du den Master-Branch auf den origin/master zurücksetzt.", "ru_RU": "Создайте новую feature ветвь от master перед тем, как откатить изменения в master до состояния o/master.", "zh_CN": "从本地的master创建一个feature分支, 然后重置master和origin master保持一致。", "es_ES": "Crea la rama feature desde la rama master en local antes de restablecerlo para que sea el mismo que la rama master de origen", @@ -11,6 +12,7 @@ exports.level = { }, "name": { "en_US": "Locked Master", + "de_DE": "Gesperrter Master-Branch", "ru_RU": "Заблокированная ветвь master", "zh_CN": "锁定的Master(Locked Master)", "es_ES": "Master bloqueado", @@ -57,6 +59,46 @@ exports.level = { } ] }, + "de_DE": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Gesperrter Master-Branch", + "", + "Wenn du in einem großen Team zusammen arbeitest, ist der Master-Branch mit hoher Wahrscheinlichkeit für direkte Änderungen gesperrt. Um Änderungen am Remote-Branch einpflegen zu können, ist ein Pull-Request-Prozess notwendig. Wenn du lokal in deinem Master-Branch einen Commit durchführst und diesen versuchst auf den serverseitigen Master-Branch zu pushen, wirst du folgende Fehlermeldung bekommen:", + "", + "```", + " ! [remote rejected] master -> master (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)", + "```" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Wieso wurde diese Aktion zurückgewiesen?", + "", + "Auf Grund der serverseitig voreingestellten Richtlinien sind direkte Änderungen am Master-Branch nicht erlaubt, und erfordert einen Pull-Request.", + "", + "Um die eigenen lokalen Änderungen in den Master-Branch einbringen zu können, ist es erforderlich einen lokalen Feature-Branch zu erstellen. Dieser Feature-Branch muss dann auf den Server hochgeladen werden, damit dann ein Pull-Request eingeleitet werden kann. Dies wurde vorher durch den direkten Push des Master-Branch nicht berücksichtigt, weswegen man die Änderungen nicht hochladen konnte." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Die Lösung", + "", + "Erstelle einen Branch der feature heißt und pushe diesen auf den Server. Setze den lokalen Master-Branch zurück, dass er mit dem Origin-Master-Branch synchron ist. Dies könnte sonst später zu weiteren Komplikationen führen, wenn weiter pulls durchgeführt und Commits von anderen mit deinen in Konflikt stehen." + ] + } + } + ] + }, "zh_CN": { "childViews": [ { @@ -223,4 +265,4 @@ exports.level = { ] }, } -}; +}; \ No newline at end of file From 91397615ae1badcad3a234db3083467578797a68 Mon Sep 17 00:00:00 2001 From: cbobinec Date: Fri, 27 Mar 2020 08:57:55 +0100 Subject: [PATCH 180/359] Fix missing french translation --- src/levels/intro/rebasing.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/levels/intro/rebasing.js b/src/levels/intro/rebasing.js index 49dccfb9..980d67bf 100644 --- a/src/levels/intro/rebasing.js +++ b/src/levels/intro/rebasing.js @@ -550,6 +550,11 @@ exports.level = { "Nous sommes désormais positionnés sur la branche `master`. Continuons en faisant le rebase sur `bugFix`…", "Et voilà ! Puisque `master` était un ascendant de `bugFix`, git a simplement déplacé la référence de la branche `master` en avant dans le temps." ], + "afterMarkdowns": [ + "Voilà vous avez vu comment cela fonctionne", + "", + "Continuons et essayons ce niveau !" + ], "command": "git rebase bugFix", "beforeCommand": "git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master" } From 549d9bb721a0b6db4c2c7cd42c69a5b8d8277d48 Mon Sep 17 00:00:00 2001 From: cbobinec Date: Fri, 27 Mar 2020 16:56:23 +0100 Subject: [PATCH 181/359] add french translation to lockedMaster --- src/levels/remote/lockedMaster.js | 42 +++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/levels/remote/lockedMaster.js b/src/levels/remote/lockedMaster.js index 1e82655e..8c091ece 100644 --- a/src/levels/remote/lockedMaster.js +++ b/src/levels/remote/lockedMaster.js @@ -7,6 +7,7 @@ exports.level = { "ru_RU": "Создайте новую feature ветвь от master перед тем, как откатить изменения в master до состояния o/master.", "zh_CN": "从本地的master创建一个feature分支, 然后重置master和origin master保持一致。", "es_ES": "Crea la rama feature desde la rama master en local antes de restablecerlo para que sea el mismo que la rama master de origen", + "fr_FR": "Créer la branche feature à partir du master local, avant de la restaurer dans le même état que o/master", "ko" : "로컬 저장소의 master 브랜치로부터 feature 브랜치를 만드세요. 그리고 o/master와 같아질 수 있도록 로컬 저장소의 master 브랜치를 reset 하세요." }, "name": { @@ -14,6 +15,7 @@ exports.level = { "ru_RU": "Заблокированная ветвь master", "zh_CN": "锁定的Master(Locked Master)", "es_ES": "Master bloqueado", + "fr_FR": "Master verrouillé", "ko" : "잠겨버린 Master" }, "startDialog": { @@ -182,6 +184,46 @@ exports.level = { } ] }, + "fr_FR": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Remote Rejected!", + "", + "Si vous travaillez dans une équipe de grande taille, il est probable que `master` soit verrouillée, et que le mécanisme de `Pull Request` soit nécessaire pour `merge` des changements. Si vous faites un `commit` directement sur le master local, et essayez de `push`, vous serez reçu avec un message de la sorte :", + "", + "```", + " ! [remote rejected] master -> master (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)", + "```" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Pourquoi est-ce rejeté?", + "", + "Le dépôt distant a rejeté le `push` de `commit` directement sur `master`, à cause de la stratégie mise en place sur `master`, imposant plutôt l'usage des `pull requests`.", + "", + "Vous étiez censé suivre le processus suivant : créer une branche, `push`, et faire une `pull request`. Mais vous avez oublié et avez fait un `commit` directement sur `master`. Maintenant vous êtes coincé et ne pouvez pas faire un `push` de vos modifications." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## La solution", + "", + "Créer une autre branche appelée feature, et poussez la sur le serveur distant. Réinitialisez (`reset`) également votre `master` pour être en cohérence avec l'état du serveur distant, sinon vous pourriez avoir des problèmes la prochaine fois que vous faites un `pull`, et que quelqu'un d'autre `commit` des choses en conflit avec vos modifications." + ] + } + } + ] + }, "ko": { "childViews": [ { From 21cc5e7382a352414cdcb7eb37ffd6733eda5383 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Sun, 29 Mar 2020 15:57:55 -0700 Subject: [PATCH 182/359] Quick followups to PR #657 --- __tests__/levels.spec.js | 1 - gulpfile.js | 6 ++---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/__tests__/levels.spec.js b/__tests__/levels.spec.js index e4e3fa91..5a6f3720 100644 --- a/__tests__/levels.spec.js +++ b/__tests__/levels.spec.js @@ -7,7 +7,6 @@ describe('GitEngine Levels', function() { var levels = sequences[sequenceKey]; Object.keys(levels).forEach(function(index) { var levelBlob = levels[index]; - // console.log('testing level', levelBlob.name.en_US); base.expectLevelSolved(levelBlob); }.bind(this)); }); diff --git a/gulpfile.js b/gulpfile.js index 87fb0fcb..76d68861 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -39,10 +39,8 @@ var indexFile = readFileSync('src/template.index.html').toString(); var indexTemplate = _.template(indexFile); var compliments = [ - 'Wow peter great work!', - 'Such a professional dev environment', - 'Can\'t stop the TRAIN', - 'git raging' + 'Thanks to Hongarc for the modern and amazing gulp workflow!', + 'I hope you all have a great day :)' ]; var compliment = (done) => { var index = Math.floor(Math.random() * compliments.length); From 8c25dae8da27c6008502d3c425053f465a4a7636 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Sun, 29 Mar 2020 16:25:20 -0700 Subject: [PATCH 183/359] Try to add deploy command to gulp --- gulpfile.js | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/gulpfile.js b/gulpfile.js index 76d68861..b5bff1b2 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -161,6 +161,20 @@ var gitAdd = function(done) { done(); }; +var gitDeployMergeMaster = function(done) { + execSync('git checkout gh-pages && git merge master -m "merge master"'); + done(); +}; + +var gitDeployPushOrigin = function(done) { + execSync('git commit -am "rebuild for prod" && ' + + 'git push origin gh-pages && ' + + 'git branch -f trunk gh-pages && ' + + 'git checkout master' + ); + done(); +} + var fastBuild = series(clean, ifyBuild, style, buildIndexDev, jshint); var build = series( @@ -168,7 +182,17 @@ var build = series( miniBuild, style, buildIndexProd, gitAdd, jasmine, jshint, lintStrings, compliment - ); +); + +var deploy = series( + clean, + jasmine, + jshint, + gitDeployMergeMaster, + build, + gitDeployPushOrigin, + compliment, +); var lint = series(jshint, compliment); @@ -189,4 +213,5 @@ module.exports = { watching, build, test: jasmine, + deploy, }; From 278004f95783bc5ef8f5f93f10f853324c4b8729 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Sun, 29 Mar 2020 17:05:57 -0700 Subject: [PATCH 184/359] Issue #660 -- fix non-deterministic ordering of commits --- src/js/git/index.js | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/js/git/index.js b/src/js/git/index.js index ff7d4f88..b8f95ef8 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -2026,21 +2026,19 @@ GitEngine.prototype.idSortFunc = function(cA, cB) { throw new Error('Could not parse commit ID ' + id); }; + // We usually want to sort by reverse chronological order, aka the + // "latest" commits have the highest values. When we did this + // with date sorting, that means the commit C1 at t=0 should have + // a lower value than the commit C2 at t=1. We do this by doing + // t0 - t1 and get a negative number. Same goes for ID sorting, + // which means C1 - C2 = -1 return getNumToSort(cA.get('id')) - getNumToSort(cB.get('id')); }; GitEngine.prototype.dateSortFunc = function(cA, cB) { - var dateA = new Date(cA.get('createTime')); - var dateB = new Date(cB.get('createTime')); - if (dateA - dateB === 0) { - // hmmmmm this still needs fixing. we need to know basically just WHEN a commit was created, but since - // we strip off the date creation field, when loading a tree from string this fails :-/ - // there's actually no way to determine it... - //c.warn('WUT it is equal'); - //c.log(cA, cB); - return GitEngine.prototype.idSortFunc(cA, cB); - } - return dateA - dateB; + // We used to use date sorting, but its hacky so lets switch to ID sorting + // to eliminate non-determinism + return GitEngine.prototype.idSortFunc(cA, cB); }; GitEngine.prototype.hgRebase = function(destination, base) { From a34a522ba9356393ad5c32068cd256d3dac63b28 Mon Sep 17 00:00:00 2001 From: hongarc Date: Mon, 30 Mar 2020 07:28:03 +0700 Subject: [PATCH 185/359] refactor: use existing `keyMirror` --- package.json | 1 - src/js/react_views/CommandView.jsx | 2 +- yarn.lock | 24 ------------------------ 3 files changed, 1 insertion(+), 26 deletions(-) diff --git a/package.json b/package.json index d05f0d67..4b49458f 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,6 @@ }, "dependencies": { "backbone": "^1.4.0", - "fbjs": "^1.0.0", "flux": "^3.1.3", "jquery": "^3.4.0", "markdown": "^0.5.0", diff --git a/src/js/react_views/CommandView.jsx b/src/js/react_views/CommandView.jsx index d887af3c..82488f2f 100644 --- a/src/js/react_views/CommandView.jsx +++ b/src/js/react_views/CommandView.jsx @@ -3,7 +3,7 @@ var ReactDOM = require('react-dom'); var PropTypes = require('prop-types'); var reactUtil = require('../util/reactUtil'); -var keyMirror = require('fbjs/lib/keyMirror'); +var keyMirror = require('../util/keyMirror'); var STATUSES = keyMirror({ inqueue: null, diff --git a/yarn.lock b/yarn.lock index 0016b815..d6c98e35 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1038,11 +1038,6 @@ core-js@^1.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= -core-js@^2.4.1: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== - core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -1573,11 +1568,6 @@ fbemitter@^2.0.0: dependencies: fbjs "^0.8.4" -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - fbjs@^0.8.0, fbjs@^0.8.4: version "0.8.17" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" @@ -1591,20 +1581,6 @@ fbjs@^0.8.0, fbjs@^0.8.4: setimmediate "^1.0.5" ua-parser-js "^0.7.18" -fbjs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-1.0.0.tgz#52c215e0883a3c86af2a7a776ed51525ae8e0a5a" - integrity sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA== - dependencies: - core-js "^2.4.1" - fbjs-css-vars "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.18" - file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" From 09dc54c76a63e9c693cd2b3fa44b35e3b680af9e Mon Sep 17 00:00:00 2001 From: hongarc Date: Mon, 30 Mar 2020 07:35:59 +0700 Subject: [PATCH 186/359] fix: keep `localStorage` --- gulpfile.js | 4 ++-- src/js/stores/LevelStore.js | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index b5bff1b2..51ed04ce 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -173,7 +173,7 @@ var gitDeployPushOrigin = function(done) { 'git checkout master' ); done(); -} +}; var fastBuild = series(clean, ifyBuild, style, buildIndexDev, jshint); @@ -191,7 +191,7 @@ var deploy = series( gitDeployMergeMaster, build, gitDeployPushOrigin, - compliment, + compliment ); var lint = series(jshint, compliment); diff --git a/src/js/stores/LevelStore.js b/src/js/stores/LevelStore.js index 82fd01ac..eee82444 100644 --- a/src/js/stores/LevelStore.js +++ b/src/js/stores/LevelStore.js @@ -35,6 +35,8 @@ if (!util.isBrowser()) { return keys[i] || null; } }; +} else { + var localStorage = window.localStorage; } try { From 562843fa2e92f5c2ab6efe2a14c350442faa9b9c Mon Sep 17 00:00:00 2001 From: hongarc Date: Mon, 30 Mar 2020 10:25:49 +0700 Subject: [PATCH 187/359] fix: `CommandView` don't need to unmount itself --- src/js/react_views/CommandView.jsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/js/react_views/CommandView.jsx b/src/js/react_views/CommandView.jsx index d887af3c..6a7e4b85 100644 --- a/src/js/react_views/CommandView.jsx +++ b/src/js/react_views/CommandView.jsx @@ -15,17 +15,11 @@ class CommandView extends React.Component{ componentDidMount() { this.props.command.on('change', this.updateStateFromModel, this); - this.props.command.on('destroy', this.onModelDestroy, this); this.updateStateFromModel(); } componentWillUnmount() { this.props.command.off('change', this.updateStateFromModel, this); - this.props.command.off('destroy', this.onModelDestroy, this); - } - - onModelDestroy() { - ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(this).parentNode); } updateStateFromModel() { From 753c4dbc7116921a649388f8448c4f45a9314db0 Mon Sep 17 00:00:00 2001 From: Anh Hong Date: Tue, 31 Mar 2020 12:31:15 +0700 Subject: [PATCH 188/359] chore: using the production build of React --- gulpfile.js | 1 + 1 file changed, 1 insertion(+) diff --git a/gulpfile.js b/gulpfile.js index 51ed04ce..61070c79 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -134,6 +134,7 @@ var ifyBuild = function() { }; var miniBuild = function() { + process.env.NODE_ENV = 'production'; return getBundle() .pipe(gTerser()) .pipe(dest(destDir)); From 8fafa9e0f9c7f173e91a473164ebf56e02def586 Mon Sep 17 00:00:00 2001 From: Maxim Esin Date: Sat, 4 Apr 2020 23:24:41 +0300 Subject: [PATCH 189/359] Russian translation is supplemented for level intro2. --- src/levels/intro/branching.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/levels/intro/branching.js b/src/levels/intro/branching.js index 039559d8..09beba89 100644 --- a/src/levels/intro/branching.js +++ b/src/levels/intro/branching.js @@ -972,7 +972,10 @@ exports.level = { "options": { "markdowns": [ "Ну что ж, теперь ты готов к работе с ветками. Как только это окно закроется,", - "создай ветку с именем bugFix и переключись на неё" + "создай ветку с именем bugFix и переключись на неё.", + "", + "Кстати вот тебе совет, ты можешь создать новую ветку и переключиться на неё", + "с помощью одной команды: ```git checkout -b [yourbranchname]```.", ] } } From 4346f3f5b62b457afa6a00640d2be013a6ca5e15 Mon Sep 17 00:00:00 2001 From: Hyeon Jeon Date: Tue, 7 Apr 2020 17:27:28 +0900 Subject: [PATCH 190/359] korean translation typo revised & some improvement for polite speech --- src/js/intl/strings.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js index c808ba08..5e97cc93 100755 --- a/src/js/intl/strings.js +++ b/src/js/intl/strings.js @@ -270,7 +270,7 @@ exports.strings = { 'fr_FR': 'Le dépôt distant a divergé de votre référentiel local, donc l\'envoi de vos modifications n\'est pas en simple avance rapide (et donc votre envoi a été rejeté). Veuillez récupérer les nouveaux changements depuis le dépôt distant, les intégrer dans cette branche, et essayez à nouveau. Vous pouvez le faire avec git pull ou git pull --rebase', 'ru_RU': 'Удаленный репозиторий разошелся с вашим локальным репозиторием, поэтому выгрузка ваших изменений не может быть в режиме fast forward (и следовательно ваш push будет отклонён). Пожалуйста, удалите изменения в удаленном репозитории которые, объедините их в эту ветку и попробуйте еще раз. Вы можете сделать это с помощью git pull или git pull --rebase', 'uk': 'Віддалений репозиторій розбігся з твоїм локальним репозиторієм, тому відвантаження твоїх змін не є простим fast forward (і тому твій push був відхилений). Будь-ласка, витягни зміни з віддаленого репозиторію, включи їх в цю гілку, й спробуй ще. Ти можеш зробити це за допомогою git pull чи git pull --rebase', - 'ko': '원격 레포지토리가 당신의 로컬 레포지토리에서 분기하므로, 변경 사항을 업데이트 하는것은 간단한 fast forward가 아닙니다(따라서 push가 거절될 것입니다.). 원격 레포지토리에서의 변경 사항을 내려 받아 이 브랜치에 합쳐라. 그리고 이걸 반복하라. 당신은 git pull 또는 git pull --rebase를 사용해 이를 수행할 수 있다.', + 'ko': '원격 레포지토리가 당신의 로컬 레포지토리에서 분기하므로, 변경 사항을 업데이트 하는것은 간단한 fast forward가 아닙니다(따라서 push가 거절될 것입니다.). 원격 레포지토리에서의 변경 사항을 내려 받아 이 브랜치에 합치고, 이를 반복하세요. 당신은 git pull 또는 git pull --rebase를 사용해 이를 수행할 수 있습니다.', 'vi': 'Kho chứa từ xa có sự khác biệt với kho chứa cục bộ của bạn, nên không thể tự động (fast forward) cập nhật thay đổi của bạn (và vì thế hoạt động push của bạn bị từ chối). Vui lòng kéo về thay đổi từ kho chứa từ xa, kết nạp vào nhánh hiện tại, và thử lại lần nữa. Bạn có thể dùng lệnh `git pull` hoặc `git pull --rebase`' }, 'git-error-remote-branch': { @@ -286,7 +286,7 @@ exports.strings = { 'fr_FR': 'Vous ne pouvez exécuter cette commande sur une branche distante', 'ru_RU': 'Вы не можете выполнить эту команду на удаленной ветке', 'uk': 'Ти не можеш виконати цю команду на віддаленій гілці', - 'ko': '당신은 원격 브랜치에서 그 명령어를 실행시킬 수 없다.', + 'ko': '당신은 원격 브랜치에서 그 명령어를 실행시킬 수 없습니다.', 'vi': 'Bạn không thể thực thi lệnh đó lên nhánh từ xa.' }, 'git-error-origin-required': { @@ -302,7 +302,7 @@ exports.strings = { 'fr_FR': 'Une origine est requise pour cette commande', 'ru_RU': 'Origin требуется для этой команды', 'uk': 'Для цієї команди потрібний origin', - 'ko': '그 명령어를 위한 오리진이 필요하다.', + 'ko': '그 명령어를 위한 오리진이 필요합니다.', 'vi': 'Lệnh đó yêu cầu có origin.' }, 'git-error-origin-exists': { @@ -1420,7 +1420,7 @@ exports.strings = { 'ja': 'Note: masterブランチだけをこのlevelではチェックします。その他のブランチ(以下では、破線で示されています)に関しては、参照のためにあります。また、いつでもこのウィンドウは"hide goal"と打つかクリックで閉じれます', 'ru_RU': 'Важно: В этом уровне проверяется только ветка master. Остальные ветки просто для наглядности. Как обычно, можно скрыть это сообщение при помощи "hide goal"', 'uk': 'Важливо: В цьому рівні буде перевірятися тільки гілка master. Решта гілок тільки для наглядності (показані пунктиром нижче). Як завжди, можна сховати цей діалог за допомогою "hide goal"', - 'ko': 'Note: 이 레벨에선 오직 마스터 브랜치만이 검사될 것입니다.. 다른 브랜치들은 단순히 참고용입니다. (아래에 대시 라벨로 보여집니다.). "hide goal"을 사용하여 언제든지 창을 숨킬 수 있습니다.', + 'ko': 'Note: 이 레벨에선 오직 마스터 브랜치만이 검사될 것입니다.. 다른 브랜치들은 단순히 참고용입니다. (아래에 대시 라벨로 보여집니다.). "hide goal"을 사용하여 언제든지 창을 숨길 수 있습니다.', 'vi': 'Chú ý: Ở cấp độ này chỉ nhánh master bị kiểm tra. Các nhánh khác chỉ dùng để tham chiếu(có dấu - ở nhãn). Như thường lệ, bạn có thể ẩn mục tiêu bằng "hide goal".' }, /////////////////////////////////////////////////////////////////////////// From d17d9c80c82a077851ca1c49d7b7cd769cf447ae Mon Sep 17 00:00:00 2001 From: ZepmanBC Date: Sun, 12 Apr 2020 11:28:35 +0200 Subject: [PATCH 191/359] fetchRebase.js French translation correction --- src/levels/remote/fetchRebase.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/remote/fetchRebase.js b/src/levels/remote/fetchRebase.js index 9c7af23d..b7528bcf 100644 --- a/src/levels/remote/fetchRebase.js +++ b/src/levels/remote/fetchRebase.js @@ -308,7 +308,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Cette succession de fetch, rebase/merge, et push est assez commune. Dans les leçons suivantes, nous explorerons cette façon de d'enchaîner les commandes dans des conditions plus complexes, mais pour le moment appliquons ce principe de façon classique.", + "Cette succession de fetch, rebase/merge, et push est assez commune. Dans les leçons suivantes, nous explorerons cette façon d'enchaîner les commandes dans des conditions plus complexes, mais pour le moment appliquons ce principe de façon classique.", "", "Pour finir ce niveau, réalisez les étapes suivantes :", "", From 9d31f02d6b7e370c933f62d2359d8242fa7acbcf Mon Sep 17 00:00:00 2001 From: CuFa Date: Tue, 14 Apr 2020 02:22:25 +0000 Subject: [PATCH 192/359] es_AR translation & es_ES corrections --- src/levels/remote/lockedMaster.js | 55 +++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/src/levels/remote/lockedMaster.js b/src/levels/remote/lockedMaster.js index 143e90a6..ea7746d9 100644 --- a/src/levels/remote/lockedMaster.js +++ b/src/levels/remote/lockedMaster.js @@ -9,7 +9,8 @@ exports.level = { "zh_CN": "从本地的master创建一个feature分支, 然后重置master和origin master保持一致。", "es_ES": "Crea la rama feature desde la rama master en local antes de restablecerlo para que sea el mismo que la rama master de origen", "fr_FR": "Créer la branche feature à partir du master local, avant de la restaurer dans le même état que o/master", - "ko" : "로컬 저장소의 master 브랜치로부터 feature 브랜치를 만드세요. 그리고 o/master와 같아질 수 있도록 로컬 저장소의 master 브랜치를 reset 하세요." + "ko" : "로컬 저장소의 master 브랜치로부터 feature 브랜치를 만드세요. 그리고 o/master와 같아질 수 있도록 로컬 저장소의 master 브랜치를 reset 하세요.", + "es_AR": "Crea la rama feature desde la rama master en local antes de restablecerlo para que sea el mismo que la rama master de origen" }, "name": { "en_US": "Locked Master", @@ -18,7 +19,8 @@ exports.level = { "zh_CN": "锁定的Master(Locked Master)", "es_ES": "Master bloqueado", "fr_FR": "Master verrouillé", - "ko" : "잠겨버린 Master" + "ko" : "잠겨버린 Master", + "es_AR": "Master bloqueado" }, "startDialog": { "en_US": { @@ -193,7 +195,7 @@ exports.level = { "markdowns": [ "## Remote Rejected!", "", - "Si trabajas en un equipo colaborativo, es probable que la rama `master` esté bloqueada y requiera algún proceso de `Pull Request` para poder `mergear` los cambios. Si haces `commit` directamente a `master e intentas realizar `push`, recibirás un mensaje similar a este:", + "Si trabajas en un equipo colaborativo, es probable que la rama `master` esté bloqueada y requiera algún proceso de `Pull Request` para poder `mergear` los cambios. Si haces `commit` directamente a `master` e intentas realizar `push`, recibirás un mensaje similar a este:", "", "```", " ! [remote rejected] master -> master (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)", @@ -207,9 +209,9 @@ exports.level = { "markdowns": [ "## ¿Por qué fue rechazado?", "", - + "Se rechazó el `push` del `commit` a la rama `master` debido a la política en la rama `master` que requiere el uso de `Pull Requests`.", + "Se rechazó el `push` del `commit` a la rama `master` debido a la política en la rama `master` que requiere el uso de `Pull Requests`.", "", - "Trataste de crear una rama y luego hacer `pushs` creando una `Pull Request`, pero te olvidaste e hiciste `commit` directamente a `master`. Ahora estás atascado y no puedes hacer `push` de tus cambios." + "Trataste de crear una rama y luego hacer `pushs` creando un `Pull Request`, pero te olvidaste e hiciste `commit` directamente a `master`. Ahora estás atascado y no puedes hacer `push` de tus cambios." ] } @@ -218,7 +220,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "## The solution", + "## La solución", "", "Crea otra rama llamada `feature` y haz `push` a remoto. También restablece su rama `master` nuevamente para que esté sincronizado con el repositorio remoto; de lo contrario, puedes tener problemas la próxima vez que realices un `pull` y el `commit` de otra persona entre en conflicto con el tuyo." ] @@ -306,5 +308,46 @@ exports.level = { } ] }, + "es_AR": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Remote Rejected!", + "", + "Si trabajas en un equipo colaborativo, es probable que la rama `master` esté bloqueada y requiera algún proceso de `Pull Request` para poder `mergear` los cambios. Si haces `commit` directamente a `master` e intentas realizar `push`, recibirás un mensaje similar a este:", + "", + "```", + " ! [remote rejected] master -> master (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)", + "```" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## ¿Por qué fue rechazado?", + "", + "Se rechazó el `push` del `commit` a la rama `master` debido a la política en la rama `master` que requiere el uso de `Pull Requests`.", + "", + "Trataste de crear una rama y luego hacer `pushs` creando un `Pull Request`, pero te olvidaste e hiciste `commit` directamente a `master`. Ahora estás atascado y no puedes hacer `push` de tus cambios." + + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## La solución", + "", + "Crea otra rama llamada `feature` y haz `push` a remoto. También restablece su rama `master` nuevamente para que esté sincronizado con el repositorio remoto; de lo contrario, puedes tener problemas la próxima vez que realices un `pull` y el `commit` de otra persona entre en conflicto con el tuyo." + ] + } + } + ] + } } }; \ No newline at end of file From 592759ef24bd6cdab01e2ae8bce18737e4454fd2 Mon Sep 17 00:00:00 2001 From: MrMcKracken <42273441+MrMcKracken@users.noreply.github.com> Date: Thu, 16 Apr 2020 07:26:35 +0200 Subject: [PATCH 193/359] Fixed typo in german translation (_ohne_ ihne vorher ...) --> (_ohne_ ihn vorher ...) --- src/levels/rampup/relativeRefs2.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/rampup/relativeRefs2.js b/src/levels/rampup/relativeRefs2.js index 9caf5b02..4c639e77 100644 --- a/src/levels/rampup/relativeRefs2.js +++ b/src/levels/rampup/relativeRefs2.js @@ -485,7 +485,7 @@ exports.level = { "", "Du bist jetzt Experte in Sachen relative Referenzen, also lass sie uns mal richtig einsetzen.", "", - "Das Verschieben von Branches ist einer der häufigsten Anwendungsfälle dafür. Du kannst einen Branchnamen direkt auf einen bestimmten Commit setzen (_ohne_ ihne vorher ausgecheckt haben zu müssen!) indem du den Parameter `-f` benutzt. So in etwa:", + "Das Verschieben von Branches ist einer der häufigsten Anwendungsfälle dafür. Du kannst einen Branchnamen direkt auf einen bestimmten Commit setzen (_ohne_ ihn vorher ausgecheckt haben zu müssen!) indem du den Parameter `-f` benutzt. So in etwa:", "", "`git branch -f master HEAD~3`", "", From fbe331239833d2ac24f9137d0adb9cc5aa933e2c Mon Sep 17 00:00:00 2001 From: hongarc Date: Tue, 21 Apr 2020 19:12:29 +0700 Subject: [PATCH 194/359] defer parsing of JavaScript --- assets/forkme_right_darkblue_121621.png | Bin 7791 -> 5333 bytes gulpfile.js | 29 +--- lib/es5-shim.min.js | 7 - lib/jquery-1.8.0.min.js | 2 - lib/raphael-min.js | 10 -- package.json | 3 +- src/js/app/index.js | 11 ++ src/template.index.html | 210 +++++++++++------------- yarn.lock | 20 ++- 9 files changed, 131 insertions(+), 161 deletions(-) delete mode 100644 lib/es5-shim.min.js delete mode 100644 lib/jquery-1.8.0.min.js delete mode 100644 lib/raphael-min.js diff --git a/assets/forkme_right_darkblue_121621.png b/assets/forkme_right_darkblue_121621.png index 146ef8a800602169cf78c686fc5a6d138a76bc0a..100aad0f6af4fe9c6334391365b41bf1bd9eac5c 100644 GIT binary patch literal 5333 zcmYj#cRZVY)V>uXB$R|!sl6gri`Ht*YV8rEX0*1}h*d4Mw;F9x6cI(liaz$A_)WR^&{6~6 zhWJ{2GBVh^`|2vFr|&kizIs`XUFz1LmAxEV^(@)pHS$4fNtbM9vRJ>Ywf)!04^lId z-OBMiDazNlQ36W>;jnN75gkjW&r`&o7|!c2(0b$jE^BJ|9q!&14{WoS`|Mi7=c)7? z8P6RH+{et=zeckAzt|cnY#8*be`922_;3(X<~Djr~E$;KAxC z^v{%M&>j5KuJgP0gdLs${o=yHmK_&QJFP6a1Cl)U-*|*uh90Nz7XwctF>xi_)^wo3 z9>bev%c^Ie#s6gAbcMJsSB}%8uY`lo7f!|*TdEhgKt5~puIob!*mX%yU7guH@jF(rt{h?0iBsPHh$ zwOLe*0J)AM^4q=pYhw2E1{N6C_~<(6wpB&hTG6nP`4I3 ztmLl-}7P80~f#zrv$f~oViz6blG);bO@Q)+7+vp zIH=jvk56`T3aVshx-a3lX!;@uT!>nmKOUf5)z0=?jK0O1KGI_?5|@g<8hj0vQLO$v z8aEVOy$z?fMG)M~^cDBwpDmX9eRie1tO6%z4abJ9!CmG~ZpMEsBLNn{5!O85~mPgNf{bZFSW~9d<$qSW47G)>y|K1s2f#$gLhrtQeE{ae zqsR!1w@>5Dzbn|GE@z{*&$ki_=GOX45y~1(?evUFWl&BfflHzg!s9mfoW>E3g4QYH zy`?No5gJ6c+VHD`U$y8ZVKQnwv5E zJe+*5k|jl2-5)Yu7nk_9eDG|^@oq$NuX3dp)YRF#TOE1jw>BN(DoJuW*m}OhtUOcE z6|-1ClpFKmEJ_NeysXaOm!GgMy!W}Kc@NjIVMQN>Z;N$a_Q>^kzP5Xy+xcoq33QQl zEG3+`L-&UVC@T#{HeRMgql9D1AJ`y7YzGyy_|gz}jL=2;wDWr@qN==!aKUDc-_Z|Fe64(BgdG_`*MJW});Qr^r-N5wl^hE(BY zAz!3oPtU5wfX0$IA~j!!VdR1X=I;t1pHsn_2h*wva(>R8(BT+!y(Lx7jWEV@;tE>= ze=Ir-WR7Pn(tDy>2u^{Zf4~>sKwsIxcwfWR{3JN`1=h%%+|Gh8o%^WYc*D(9MPLXK z^kyb-$Ll;YwtW_nDPL~(Rvsmb8OCw>hF>OhY`B1i7e1OAJKPHTNqn%ovd^(2u-$UF zEK1F9JwePr(rM>md<0%luT6+Wrw0QF5$gEetve+4CWchMuqZ{G&hE?&r|{(=O0883 z2a%FIWtV`40c+pD26>@}_S6Uql4PPr#7F)Z1zy%Fw|CQX2K)xm4#wYoGq7r3uJLTc zUy0C8IminGDBw${0c`(_0}E}``g5nJ{+;h4hm!+-8a9^=)urBmDWBtg9# z0DxSxTmJ;6UD5x_b{!NWl29*$)DdGc_zl+>b`07L?QJ77vFlReK|i%In|^R=>5MOJ z>*EK^43{}6eLOPT$RqhNwhWP}jchi@RsKpc4I>lY`>Q4?jC$(5hrU^gj(w2LMwkOD z5LB(g&*Qd=L#ugZxgOPWCMF)ElnoPq8+suI(D_mZ;lv(H#Xh*pb_?gtSkqy6#E7;li4V zC#UrAR$_Kz9-ndn_hzN&<10W}@7A#-?yN=5RUAHay6?@4x+08xS*g}JFhq@H;7pZZ za!Sl6<>Nk($LXki%({i>iH$XH%jS9c8JDkish<`3Hng>bYPgb9N5vcp6e3eat%B!M zvyUu?uWDdeoKDNo6J@oW1`~gYigLc5_DP17PE7eIw18WTE=3GY?zaH;Pc;tIEFu^3 zGVos=$y*h-lzPHRtUqBi8qIE8Y-(kK8ncxKFxT7XegMTau$Wnc`$1p279INxH{{ue zu8s}o+t(bQ(QL5DOaGWy2mC?+zf)Pa0?H((MAbVN{NXtr?Hfg38?wG0Xq!D6U=iGg ze_@`EWqB{g2vmd}Saqv21rOh(O0J|yYjd3la)NP?dF$PoU@g5jRZ~26TJennz@=!M z^g+QBPTD=DoL#e^PPVwD)ADo;exodY;$z49OVgp17zL%-GE=RY?-w*a-RfMdz!;|d zsav)2U?f8Q6_nM5S|gW}KiydeLWOxZ_!#y2$zmGHORT z0DY(v=^HhZEOA@coDaS9J;lU0sXD5Ux&$W@J^Mtko_sS*J4{WPXHd0>e6jCv#xtX+ z{Mb!LrCP4p>VY(9jTRu_!d7R*Jk_Hc;%M|btuX&jLVI4B28~&Tm-hJB@*we45(S5OdiWm6ug(Qst-^d?j*E^KZHm*5TB} z+m)hJimR3qNFl91qc>=Orryo^F<~LRtnJO3F~ms&a9~uF-*15s4S%dk^V<7DP%-TX zRNsH^KVPKJhsRHFZ+%bMzjTri-bamO|1H|U(sKYl621=2*ZVxPNC_6g53l5k7!^)2 z1yUhnin+iwx3aSKK@^Qte_&o z$@*9I6qy^9xrxWtdJ9EN^|jvJ4aecL$6bz9b8r7eM)dNs9{IMx>;$}!AubWEfZyTG zlpTH%-)EKodg2HLU2XEdr}1fC8dibKG_0vk(mhfd^+rG#W8lzbFCm~eg;?{PF^B~& zsm11D9Pp?hfsdcYu4_MCY>Y1>*-aw~I_QP_(MBm4i-a{pO`9V90FopqX~ zePrWn`9md^u1{4$hCQ325>YQ^%ewc$AR?SP&W1ZUU(ycD?1@R~=oG7?6Gr;iqR2)V z(TJBaenXj+TG}+3w80>P@6Ab=I?ja|P^-(;$(~}I>u@9IkO9`?;EX$SGP%x`-Ah(( zU&%oxUL)#D*dK}L+p}fV8psf048{{EZ>KK3wYPlx?60^Dj=t1VZyC=jn$GC1IPWm} zzdir*(}{ElqS)DVQSW3X7?H(I#q>9||L8STM+Tc%??R8=-nU+cD01w;YfN@B+X8Az z1uvV(He2;@Nj|!|7}C5+eRdXxx-_O;&LhU&wNFZc7{;r)4-a;n<( zbs(Cx|N5mX`V32%s#?GF>J^qE=6SLaFIQk@;PQxkH*6_kx|_)@Na=!a#}_HWiQI#s z8-MD^h?;{FIV|?4DOQ%uq@qkkQPV|c(N0x!hrR-X0ONkQ0e#6&NbgHP0ncr%xnwnv zHiYZ+i0>bU3|7YS`X2eg@OfZLZy1BrgjHy+aDBuI+>6>D&u&WvBFDc=wm{5gg}zH(u+q-j)EJ<#&^oh-N@#4Hrq!* z0}9l|V=#^tnlwor$W3IkFwwl0dF61^v z$VqW#=nh4Z+(1`s-ZJf8(d?7Rk~-J$SlZtro{Ji$@! z6K#Bjh_g8gle-t)N5weF1vBpeZvL%d?PJ7;QuObMRK>Zdkm5yXy@d4GD?%f=x|<0t z&HPGwZ{3&(<}jeW(cX1hXxr6K=9NEU79!bao)6LCR_)G3}AFR><~9GSPcIE z=M_QHb^gE!@mbq{oMR=ZL&*Cb!4IcmZqlRh-NC>N`R9U@J^j?cRw4~z*e{Sn8IS2u zoTdNQC=Ri`q}TXLE>(Ff6d2|jSfWaJLBxSn2p~Ub9J34q5Rc~)hyrj$v?fW)c1*{B z5Qb{4*wc!)3Z7xSfSn)!??njN)ZZKU{_cK2|6P}C@(E|&qX zwb|CW%46Mt(IasC|1;XvQ30fZB84D@Ihu~?0iN*aLcf6vwigxaQs_-Zgc>(t+F;=g zEC9gB;N`cWZ~hmf;6s4!m$T_mycQ$}@6Kmw4JbSeC{h&ZvboVJwX~9&7sokQ>lfyC zwQ;WsBUdBKBrV@xRiZ=fj{cO>+M%?x9Q-Aclg+SU{aR>iZ-V5ENM}s?g?o3TCz>p076pgIvo9@XSFn67!Z(L}aTexp zAcOn{GYF{63{x3Y|KXge7Rgs|WVGqumV|_UKRatZba(eaMP)S%4i5UolZ=m#gN&6H zmI^z-ZZEFv>uz~$@a{kh`_f(c8kBDZWBCYFpnBH^sV@HRRs-u`N=owgva>frJ9_~y z=NB-xxa}8DG&D36Hs@wTUtd2CdUUM)X%#d;KqN)YP2# z_^;<-cz77hCZpdx(Ob7}LG_JVh>MGXRhb#7OC#dmSQNY@PELi3`5Qx|LfHxOUyn#Cxw_JmE!)7C}zd2I%VPfy&CNs?N3sbt=3g7;AQ! zieJO>w_x=xDdui%V$*mbN0Lu~sdb3uD_gP4P(_*Zq z#wHuqu7V6fVDh7K!<{>KprN4&EU77wlbw|o9cL2a-N#JjF=K^CL@>sZ$_=F@<#g*0 z5wnaX3v>g(;b-KeR9gt$0Zy*d+o_XgKjL$uM`*AKXdnQlpi zT|4tENoI=>?>=TKj~Q!8NT@Y?<9g_38mqjbimLE410?Cj>F$B+wm9*5FHcB-j0_93 zw6sEzv{xt?%a@?SpI5yzrwlB!*=*gkDGNGT%E`ZS75e*cc^6O`Fu8@53S7!_4hdNT zn4)npQC?9|-Q=jY3SiBA`cngI+NrRvuFm$i^Pe%68Ud5hI75JPDpciks$X)t+`Z~p zq^+&1hs4C?ux9n@)Ue2SQEu=hQ>lJt+Kjax#sH;0M#J}4|I@o=xu2~MXv^(nyF z^T0P@?V8na=-DIuRi}sPj;(mPA#1}r=<3E4T~XED(Im(TS9Kynu zf+cN**8t_@fMU0M?*AqnJ^Ty->*(P_3R#W8R=nI$?`R;6wR6Yzv_xZ?5bwTZDsM0r z?iJ=_Z-5@AWf(Egi#pwuCp|Xl6Av&TJ$K|;`bvGhgX&~w-~BaXtfTUCHK>?tbi~HS zP@^CAi4~WW3i0kMrt$`3(OzLgBe7L(ZWg7Vsju~%08VAqrv}uIpZO_#?duOfQBg5t ztZ%`AeUIqa%KdBJ+S*1fJV{B3khg8C*emoks5}MMjp`e=4?g@DhKGhBCD}A3mePQW zJp?tN&R_Tp&Yt}>?fE^lcR!pv_b0|yzZnxq`snZPr%sFTh;T@^q=~&kU#35ArNV@S z1Zyseca{nZt`$xo-c?%4De(?zs3Xs4Qr9j26r zpU1R?fWkERAk$MAXaD;*(9_+kVk_w(8r+l@^bsB&25VQZg7%IM(daiDpz;J*k_rcU6DNNu@sIpCw=+<^_R32T!2pIq`s$JW zU@s~e4J>Wp-7UzXqn82J*LwT<;Cf+EwWGFT-dEmz3My}u8+akIth_?^xAhft(3BLM zGK0PK<|zWy3&(y=I_v0>|0L#m;s*y^#ZQB*x6~jqi~%luI*Ex1bcnXCwVkaH3+Fv! z`5aW90?TMJT61%|EjKSMh7ezOdx~n%$p}E{h`J}!H)6Khkt+w#%S5OI}~m* zxD)JSSKTp|EV&1;7auzv%F8RNnj3G-Tk#$=8-LUj@$RU1*gpOI5{!(Du+?0W9(U~lm(N@A9yD8j*b`vgY-+Myy;cOvS=!mUc@u5zj1Me{buiuGzTbVjzeIq-l^|-W z7mmHm0JR$4I(?EZiQPsBP^in^{N?K;$j1W~KAqayI{4H39}wWvEta(Tx(OXLn}6IB zVDJenFJwla$pQz*zA0NxWo=&S( zdvVFU67PNiDo=rxl9EEe>gec#OZit+2UhjMUFlemR)Z2NA)rXSzaxov{P^uNZ%BYT zi-0=J9!=1cK!t%l?@}-REhs51MN^P@QEmwGmj~iWDy*rgvHj)a^Ds0tq%#E>od&sZ zkBo?b*Is#10hBD>^?<^!8R>UAVX}LKJo;}9K-G;}h>eYg%#4hAvsdUhOyv#6ii?Yr z_6qy^;QDntrNr?{4Oq9r>m66cJ&aNz0*V(#5oCD#@FNGnZZDazsn1;m2L}T(X*V_c zRR+8%h~I(A6JSNfm>)NpOxDcIm2#^}(Zt13xrT*W3R58h3I#mgVyOY|V@(VJRm84Q z757O3%b1i1n{qbN@vqDISE`yDYXTNnehDgXRNiwpWl?uSd1V#cVrgh1V7+?$80_Bt zC8;%rf#|^gN8t;9e;?F49I9FusC1PArpbaUDk>6It;&Fo_73z$4OsE+x1jPASgC1g zR_;!G>0&+%4h^|q70S;6SB2QL_xed2{QkFR>GNOv#vWCbT@50G4nKw|0SkS*a8tan z$R3b;g+cy|cu&N8bybyO3X+;Ks*a^zy&-l{f1NmWnhAXqr9P~@8`J<%fe=qIQ|~)J znKMDPT^*>aii^w0w<}OhLHrt2o&u|{x5viaiSON&H>&ckN?w}%z9M@uocqI{rIcsT z$}$x8SP;d76TCFRb=hQqh1GWK#ro?f7s!Wn!-jR1xaG+KwWZ_N>CaoKFfl2~%H4^J zi%a!SVANq#lQ9YE>K&TzA%TnDXf z9q{?ZO98Vg^n0fA24gigG}!X5T!Z+ySSm(hQBqUNGH4_>F^R#TNq#IPDuBWsElgui z|L9+(?Hg55Rbi}&UuQh5`u+zW!7$T%X{jsH0wopB8Blp66}sGs*$Pa9Dt(bul@cXD zt!61tsk}db>}A^G!T2s)C3*rZ6ztVE&=f@4D+~lvkU5k7yp;;?SrTI9?!;9%KtQu9 zRId!B`~>ig{Ugj5Sg4rhWQYVb&n$t|>DPwiC*3uFCk3TsNA)z6(%Dd;D#TvHK zw#@()M$KlU3Q#{KJ@wqtpU}s+&GYyZKcwHa`zv3ZGF$OzXl#P>=Rc>TXvQStoT|Jp zga8RoG!}pn-HEMP8`jdvnoF0j$Q`7TKvMLT^xLtHb@J3N>8KcXh5qHkb1rsz@PTi` z3-v#zk2!0BT3gBYC&O5{Z#ifmgxuV0SQZs&v6qzCRC|SftFZzi{dsFu7#SI94dySln;+?{ymj%}*FLW4%Tb2ATqq8S0SPHyZ&HyLEC7he1YZRKbRp*l-Q zr}EF(bTcvnb#)H-=;QNrwva6rEdK7@5OARK6j(QJ-n11Ipee{gx2?(Q&IS%FEPCRJ zoZtWMT`)1dg)KAhl0^|{x)_|G?QEDzcY|wy00aD{ob0ric>f(B5OC?wTd6QCJltgp zf_1EZ*GXviexfMKab-wVbvJ~dN`FitYe|41ePtbvNl?lC#Cw0#+nzP@)TG& zK;Xis7ir9i))d5D+l+FUv+zO6I5gLM4hrXVI` zBCKDx)^AKf7Q#FV&kCgUB3id>&Vi`NNGP8OcLa@`}ze^UI_Cz zJkeM+K&`}9G(*Dy0!pKwtHV!Wd}`VQI(dT|)+bKk!3hLZ1POJM+>T7!Ix-EZJ5RO5 z#2>D~wNb5RE9`l%s;YrCt1@8a%JfvG>rSZ{%O@IZ-ljiqrNX%Qcq?}&Mt46&yz2_2 z8vjx3UxFhzfs}(uULDFWJpPgWOq`DgC`^m596u%x5>Ns`h2P&p z;2pc223vO=jz$7jO!Ts}%lQl6P?>_vC}Rnx@)Bd=00EUd@ffBcssfaJpo03}K`WBf zEY>aeY+-XCt|Ad+_%kocCwE)`R#oxU5g8c)t1~m8qqEazrXT`TUIG>$AV8)dOfY{= z0|bUO!ynKY+3qMOch{uSAjYz&C|XdUJ-9DS zLFVo1&)ciQuJ(E|1yS6IQ+01lWo78r!$A%_n2Ml5(T*!b67LGR!MStq!?9z>RjWjR ziCSp7y1T(%TnhIrxrZ$(l4pFcP%zaDq{1Ylk^Hgn(8HB0S1Bdxi=<->5y-#v39;2f z5AT~z52gZqa6{J{OLRpO7IJ*@R6 z)o)7cr-HFh#KpxzW=1-+;s60Jnt}+X@&RKF-0HX0*EcX`NP}(LHj_1@TegycaO|by zkdwPp0*gEZQv;}nAA=p+w-Iaco-On&0;d74;Q1$ioG_;8a0*fC5J9_w8 zDw4i>`~{k?Gb$bGQsKbB0Jwa+GQBfEK%_q(r^1-nSSxoYzINR%?-h<1HBwLpb&g^mOA;k6!!PzX%#Xv zj#0--N?J}+?4SBYW|X1h&ec(b{(&ddvkz z4k!}!3}`eKg*}o;YOOg%t4DO8u@{$2SRjqYQFjdR9qqVRIK4(cp{Zs`W8of zQ<5P&Ya^u}F4pxP?|fCqXYJt0=^e7!nwp`=-1gv8lo}&wEXpaDkXLZ(9QRBG9#Xa2 zOX+XqUBD5KOV5~ zcK`lIr~t}qRz-!y^gY{|-ul&BvdOJWUzNC8o85OdxKD++SD2Ht5qfDrXH`|}&Du$6 zERp{FAQhr1NPfXpVhFt{h+&L*g=heR+Dc&|X?y42pMKKy)3`Fk)gm6eaH^~Bprk=< z)m=*vWD4SFgtXKYoMfLC9XB~s5W!S_#8_ww!rh5WODm}VX`+>(gcT<>_Nl$GUXZ=s z-#%j_p^g?u%DlpdO0K9k>>X^yjCk&}=qaxjQk=)lvMh)B;{Ruh3{pq5>&DoO=HJrwma0 z=zFm2fE9OSt*?E34|PPKmjfAy*o$HB-hYAa-X569&ItD{X+Wpci(l2$;BrmABfmlJ z3Q+kmu;Swr=#)--dk1P6{r~)^BletqKKkH2(otDC+liq#p!iA=g+1;iVmU&x<~|@> zb5C4uz^7w2n_&Gq$+zqCi zv-#1%ySJJ}Nns9%_wKGP8#*P2g)gOJ_B!5Bl^a~`0%Q@1F}Mf#f~sSx)Hv5TOmXM9r-b%FHEnRjg28gxVE+qC@Cqc=!&sdvWQnMEaXUsj#}b z+V;VRf2BjJ$;l>78gw`E1RMPjP-w8mQ{MB(enBh02nI}KDh$nN-?0~dV+O8FvC{$# zN75~67Qs|=P`p=GR$I}X7~6mqQ;@M4i{?CoWNM4x!a)K&^`ZWfrczAbJqQoa;^^L{ zo6WE(d!y*5nu{6>?YNCbqifi>VhS>`#!?%8&@|PTj)TifYl?cxU6@(A6`-2K;$3YD zQc+P!Ez0hJrOcebE>dJD6zW_@P1VPJ!sjGFHFtraQimx z6^4h0qwTe-HQ9GlZ$6Pzd$F6z?umkRIt=;o#t)U@8%w zn}VP_@k&c7Y}=ZvH3gaB5Sl80HC7E^e|eu3-HFi@q_nI;fJ%gS#CvI35SfC+#6+u1 zK}7l!!15p!c67AcxI1y`iew?wMR-rVW96N@6IWDJlQ)%MDiK~7-7C2hXKh?ZGnfTa ziSP*d*U63 zjjIO;3~9#738oT^<-xFVJWPRxwILzX-zyZFN@y$!1Xdlpy*+T-itfZ_lgW)KhyaxU z)-?ADhlWRJ*!Z&OC@3r}p7LIyNPi*~x-kXmw3U{X!P3xBNE>AeB80jS@1B~1DDK4M znIM=-gvWb@DtBTC4h|MfCBi$56&V?6KdxN$H&L%1_+4s zCsN@wQ(;SUvyHnGCr_|fDAJ!ug;O*I3Ab{0VmxB6n1TqV5{%`6c(1K<&}=~Txx&#W zf~iD!%2>hjxx&ZLow%!~hZ_CR_)IXB2u~R6_`pE_Deg|ZbH_F+l#11#i0Q5h@%u)) z+Z{j0+o7SM1L#hShP9=#DTn}-h^Ye0DKptH1J+9hFbv9DK4{#ajc&uiSB82jD@Q;C==V{xV$ku`ZxdrQsp!y_ZZO*fl=fbPVCsYH0fST5%3 zYODL%o!bL1I~p21FDZmaCC;&Rw036RsOM?`ji', - '', - '' -]; - -var devDependencies = [ - '', - '', - '' -]; - // precompile for speed var indexFile = readFileSync('src/template.index.html').toString(); var indexTemplate = _.template(indexFile); @@ -57,7 +45,7 @@ const lintStrings = (done) => { var destDir = './build/'; -var buildIndex = function(config) { +var buildIndex = function(done) { log('Building index...'); // first find the one in here that we want @@ -85,19 +73,8 @@ var buildIndex = function(config) { var outputIndex = indexTemplate({ jsFile, styleFile, - jsDependencies: config.isProd ? - prodDependencies.join('\n') : - devDependencies.join('\n') }); writeFileSync('index.html', outputIndex); -}; - -var buildIndexProd = function(done) { - buildIndex({ isProd: true }); - done(); -}; -var buildIndexDev = function(done) { - buildIndex({ isProd: false }); done(); }; @@ -176,11 +153,11 @@ var gitDeployPushOrigin = function(done) { done(); }; -var fastBuild = series(clean, ifyBuild, style, buildIndexDev, jshint); +var fastBuild = series(clean, ifyBuild, style, buildIndex, jshint); var build = series( clean, - miniBuild, style, buildIndexProd, + miniBuild, style, buildIndex, gitAdd, jasmine, jshint, lintStrings, compliment ); diff --git a/lib/es5-shim.min.js b/lib/es5-shim.min.js deleted file mode 100644 index de26bb58..00000000 --- a/lib/es5-shim.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * https://github.com/es-shims/es5-shim - * @license es5-shim Copyright 2009-2015 by contributors, MIT License - * see https://github.com/es-shims/es5-shim/blob/v4.1.1/LICENSE - */ -(function(t,e){"use strict";if(typeof define==="function"&&define.amd){define(e)}else if(typeof exports==="object"){module.exports=e()}else{t.returnExports=e()}})(this,function(){var t=Array.prototype;var e=Object.prototype;var r=Function.prototype;var n=String.prototype;var i=Number.prototype;var a=t.slice;var o=t.splice;var u=t.push;var l=t.unshift;var f=r.call;var s=e.toString;var c=Array.isArray||function gt(t){return s.call(t)==="[object Array]"};var p=typeof Symbol==="function"&&typeof Symbol.toStringTag==="symbol";var h;var v=Function.prototype.toString,g=function yt(t){try{v.call(t);return true}catch(e){return false}},y="[object Function]",d="[object GeneratorFunction]";h=function dt(t){if(typeof t!=="function"){return false}if(p){return g(t)}var e=s.call(t);return e===y||e===d};var m;var b=RegExp.prototype.exec,w=function mt(t){try{b.call(t);return true}catch(e){return false}},T="[object RegExp]";m=function bt(t){if(typeof t!=="object"){return false}return p?w(t):s.call(t)===T};var x;var O=String.prototype.valueOf,j=function wt(t){try{O.call(t);return true}catch(e){return false}},S="[object String]";x=function Tt(t){if(typeof t==="string"){return true}if(typeof t!=="object"){return false}return p?j(t):s.call(t)===S};var E=function xt(t){var e=s.call(t);var r=e==="[object Arguments]";if(!r){r=!c(t)&&t!==null&&typeof t==="object"&&typeof t.length==="number"&&t.length>=0&&h(t.callee)}return r};var N=function(t){var e=Object.defineProperty&&function(){try{Object.defineProperty({},"x",{});return true}catch(t){return false}}();var r;if(e){r=function(t,e,r,n){if(!n&&e in t){return}Object.defineProperty(t,e,{configurable:true,enumerable:false,writable:true,value:r})}}else{r=function(t,e,r,n){if(!n&&e in t){return}t[e]=r}}return function n(e,i,a){for(var o in i){if(t.call(i,o)){r(e,o,i[o],a)}}}}(e.hasOwnProperty);function I(t){var e=typeof t;return t===null||e==="undefined"||e==="boolean"||e==="number"||e==="string"}var D={ToInteger:function Ot(t){var e=+t;if(e!==e){e=0}else if(e!==0&&e!==1/0&&e!==-(1/0)){e=(e>0||-1)*Math.floor(Math.abs(e))}return e},ToPrimitive:function jt(t){var e,r,n;if(I(t)){return t}r=t.valueOf;if(h(r)){e=r.call(t);if(I(e)){return e}}n=t.toString;if(h(n)){e=n.call(t);if(I(e)){return e}}throw new TypeError},ToObject:function(t){if(t==null){throw new TypeError("can't convert "+t+" to object")}return Object(t)},ToUint32:function St(t){return t>>>0}};var M=function Et(){};N(r,{bind:function Nt(t){var e=this;if(!h(e)){throw new TypeError("Function.prototype.bind called on incompatible "+e)}var r=a.call(arguments,1);var n;var i=function(){if(this instanceof n){var i=e.apply(this,r.concat(a.call(arguments)));if(Object(i)===i){return i}return this}else{return e.apply(t,r.concat(a.call(arguments)))}};var o=Math.max(0,e.length-r.length);var u=[];for(var l=0;l0&&typeof e!=="number"){r=a.call(arguments);if(r.length<2){r.push(this.length-t)}else{r[1]=D.ToInteger(e)}}return o.apply(this,r)}},!U);var k=[].unshift(0)!==1;N(t,{unshift:function(){l.apply(this,arguments);return this.length}},k);N(Array,{isArray:c});var A=Object("a");var C=A[0]!=="a"||!(0 in A);var P=function Mt(t){var e=true;var r=true;if(t){t.call("foo",function(t,r,n){if(typeof n!=="object"){e=false}});t.call([1],function(){"use strict";r=typeof this==="string"},"x")}return!!t&&e&&r};N(t,{forEach:function Ft(t){var e=D.ToObject(this),r=C&&x(this)?this.split(""):e,n=arguments[1],i=-1,a=r.length>>>0;if(!h(t)){throw new TypeError}while(++i>>0,i=Array(n),a=arguments[1];if(!h(t)){throw new TypeError(t+" is not a function")}for(var o=0;o>>0,i=[],a,o=arguments[1];if(!h(t)){throw new TypeError(t+" is not a function")}for(var u=0;u>>0,i=arguments[1];if(!h(t)){throw new TypeError(t+" is not a function")}for(var a=0;a>>0,i=arguments[1];if(!h(t)){throw new TypeError(t+" is not a function")}for(var a=0;a>>0;if(!h(t)){throw new TypeError(t+" is not a function")}if(!n&&arguments.length===1){throw new TypeError("reduce of empty array with no initial value")}var i=0;var a;if(arguments.length>=2){a=arguments[1]}else{do{if(i in r){a=r[i++];break}if(++i>=n){throw new TypeError("reduce of empty array with no initial value")}}while(true)}for(;i>>0;if(!h(t)){throw new TypeError(t+" is not a function")}if(!n&&arguments.length===1){throw new TypeError("reduceRight of empty array with no initial value")}var i,a=n-1;if(arguments.length>=2){i=arguments[1]}else{do{if(a in r){i=r[a--];break}if(--a<0){throw new TypeError("reduceRight of empty array with no initial value")}}while(true)}if(a<0){return i}do{if(a in r){i=t.call(void 0,i,r[a],a,e)}}while(a--);return i}},!J);var z=Array.prototype.indexOf&&[0,1].indexOf(1,2)!==-1;N(t,{indexOf:function Zt(t){var e=C&&x(this)?this.split(""):D.ToObject(this),r=e.length>>>0;if(!r){return-1}var n=0;if(arguments.length>1){n=D.ToInteger(arguments[1])}n=n>=0?n:Math.max(0,r+n);for(;n>>0;if(!r){return-1}var n=r-1;if(arguments.length>1){n=Math.min(n,D.ToInteger(arguments[1]))}n=n>=0?n:r-Math.abs(n);for(;n>=0;n--){if(n in e&&t===e[n]){return n}}return-1}},$);var B=!{toString:null}.propertyIsEnumerable("toString"),G=function(){}.propertyIsEnumerable("prototype"),H=!F("x","0"),L=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],X=L.length;N(Object,{keys:function zt(t){var e=h(t),r=E(t),n=t!==null&&typeof t==="object",i=n&&x(t);if(!n&&!e&&!r){throw new TypeError("Object.keys called on a non-object")}var a=[];var o=G&&e;if(i&&H||r){for(var u=0;u9999?"+":"")+("00000"+Math.abs(n)).slice(0<=n&&n<=9999?-4:-6);e=t.length;while(e--){r=t[e];if(r<10){t[e]="0"+r}}return n+"-"+t.slice(0,2).join("-")+"T"+t.slice(2).join(":")+"."+("000"+this.getUTCMilliseconds()).slice(-3)+"Z"}},V);var W=function(){try{return Date.prototype.toJSON&&new Date(NaN).toJSON()===null&&new Date(K).toJSON().indexOf(Q)!==-1&&Date.prototype.toJSON.call({toISOString:function(){return true}})}catch(t){return false}}();if(!W){Date.prototype.toJSON=function Gt(t){var e=Object(this);var r=D.ToPrimitive(e);if(typeof r==="number"&&!isFinite(r)){return null}var n=e.toISOString;if(!h(n)){throw new TypeError("toISOString property is not callable")}return n.call(e)}}var _=Date.parse("+033658-09-27T01:46:40.000Z")===1e15;var tt=!isNaN(Date.parse("2012-04-04T24:00:00.500Z"))||!isNaN(Date.parse("2012-11-31T23:59:59.000Z"));var et=isNaN(Date.parse("2000-01-01T00:00:00.000Z"));if(!Date.parse||et||tt||!_){Date=function(t){function e(r,n,i,a,o,u,l){var f=arguments.length;if(this instanceof t){var s=f===1&&String(r)===r?new t(e.parse(r)):f>=7?new t(r,n,i,a,o,u,l):f>=6?new t(r,n,i,a,o,u):f>=5?new t(r,n,i,a,o):f>=4?new t(r,n,i,a):f>=3?new t(r,n,i):f>=2?new t(r,n):f>=1?new t(r):new t;N(s,{constructor:e},true);return s}return t.apply(this,arguments)}var r=new RegExp("^"+"(\\d{4}|[+-]\\d{6})"+"(?:-(\\d{2})"+"(?:-(\\d{2})"+"(?:"+"T(\\d{2})"+":(\\d{2})"+"(?:"+":(\\d{2})"+"(?:(\\.\\d{1,}))?"+")?"+"("+"Z|"+"(?:"+"([-+])"+"(\\d{2})"+":(\\d{2})"+")"+")?)?)?)?"+"$");var n=[0,31,59,90,120,151,181,212,243,273,304,334,365];function i(t,e){var r=e>1?1:0;return n[e]+Math.floor((t-1969+r)/4)-Math.floor((t-1901+r)/100)+Math.floor((t-1601+r)/400)+365*(t-1970)}function a(e){return Number(new t(1970,0,1,0,0,0,e))}for(var o in t){e[o]=t[o]}e.now=t.now;e.UTC=t.UTC;e.prototype=t.prototype;e.prototype.constructor=e;e.parse=function u(e){var n=r.exec(e);if(n){var o=Number(n[1]),u=Number(n[2]||1)-1,l=Number(n[3]||1)-1,f=Number(n[4]||0),s=Number(n[5]||0),c=Number(n[6]||0),p=Math.floor(Number(n[7]||0)*1e3),h=Boolean(n[4]&&!n[8]),v=n[9]==="-"?1:-1,g=Number(n[10]||0),y=Number(n[11]||0),d;if(f<(s>0||c>0||p>0?24:25)&&s<60&&c<60&&p<1e3&&u>-1&&u<12&&g<24&&y<60&&l>-1&&l=0){r+=nt.data[e];nt.data[e]=Math.floor(r/t);r=r%t*nt.base}},numToString:function Yt(){var t=nt.size;var e="";while(--t>=0){if(e!==""||t===0||nt.data[t]!==0){var r=String(nt.data[t]);if(e===""){e=r}else{e+="0000000".slice(0,7-r.length)+r}}}return e},pow:function qt(t,e,r){return e===0?r:e%2===1?qt(t,e-1,r*t):qt(t*t,e/2,r)},log:function Kt(t){var e=0;var r=t;while(r>=4096){e+=12;r/=4096}while(r>=2){e+=1;r/=2}return e}};N(i,{toFixed:function Qt(t){var e,r,n,i,a,o,u,l;e=Number(t);e=e!==e?0:Math.floor(e);if(e<0||e>20){throw new RangeError("Number.toFixed called with invalid number of decimals")}r=Number(this);if(r!==r){return"NaN"}if(r<=-1e21||r>=1e21){return String(r)}n="";if(r<0){n="-";r=-r}i="0";if(r>1e-21){a=nt.log(r*nt.pow(2,69,1))-69;o=a<0?r*nt.pow(2,-a,1):r/nt.pow(2,a,1);o*=4503599627370496;a=52-a;if(a>0){nt.multiply(0,o);u=e;while(u>=7){nt.multiply(1e7,0);u-=7}nt.multiply(nt.pow(10,u,1),0);u=a-1;while(u>=23){nt.divide(1<<23);u-=23}nt.divide(1<0){l=i.length;if(l<=e){i=n+"0.0000000000000000000".slice(0,e-l+2)+i}else{i=n+i.slice(0,l-e)+"."+i.slice(l-e)}}else{i=n+i}return i}},rt);var it=n.split;if("ab".split(/(?:ab)*/).length!==2||".".split(/(.?)(.?)/).length!==4||"tesst".split(/(s)*/)[1]==="t"||"test".split(/(?:)/,-1).length!==4||"".split(/.?/).length||".".split(/()()/).length>1){(function(){var t=typeof/()??/.exec("")[1]==="undefined";n.split=function(e,r){var n=this;if(typeof e==="undefined"&&r===0){return[]}if(!m(e)){return it.call(this,e,r)}var i=[];var a=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.extended?"x":"")+(e.sticky?"y":""),o=0,l,f,s,c;var p=new RegExp(e.source,a+"g");n+="";if(!t){l=new RegExp("^"+p.source+"$(?!\\s)",a)}var h=typeof r==="undefined"?-1>>>0:D.ToUint32(r);f=p.exec(n);while(f){s=f.index+f[0].length;if(s>o){i.push(n.slice(o,f.index));if(!t&&f.length>1){f[0].replace(l,function(){for(var t=1;t1&&f.index=h){break}}if(p.lastIndex===f.index){p.lastIndex++}f=p.exec(n)}if(o===n.length){if(c||!p.test("")){i.push("")}}else{i.push(n.slice(o))}return i.length>h?i.slice(0,h):i}})()}else if("0".split(void 0,0).length){n.split=function Vt(t,e){if(typeof t==="undefined"&&e===0){return[]}return it.call(this,t,e)}}var at=n.replace;var ot=function(){var t=[];"x".replace(/x(.)?/g,function(e,r){t.push(r)});return t.length===1&&typeof t[0]==="undefined"}();if(!ot){n.replace=function Wt(t,e){var r=h(e);var n=m(t)&&/\)[*?]/.test(t.source);if(!r||!n){return at.call(this,t,e)}else{var i=function(r){var n=arguments.length;var i=t.lastIndex;t.lastIndex=0;var a=t.exec(r)||[];t.lastIndex=i;a.push(arguments[n-2],arguments[n-1]);return e.apply(this,a)};return at.call(this,t,i)}}}var ut=n.substr;var lt="".substr&&"0b".substr(-1)!=="b";N(n,{substr:function _t(t,e){var r=t;if(t<0){r=Math.max(this.length+t,0)}return ut.call(this,r,e)}},lt);var ft=" \n \f\r \xa0\u1680\u180e\u2000\u2001\u2002\u2003"+"\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028"+"\u2029\ufeff";var st="\u200b";var ct="["+ft+"]";var pt=new RegExp("^"+ct+ct+"*");var ht=new RegExp(ct+ct+"*$");var vt=n.trim&&(ft.trim()||!st.trim());N(n,{trim:function te(){if(typeof this==="undefined"||this===null){throw new TypeError("can't convert "+this+" to object")}return String(this).replace(pt,"").replace(ht,"")}},vt);if(parseInt(ft+"08")!==8||parseInt(ft+"0x16")!==22){parseInt=function(t){var e=/^0[xX]/;return function r(n,i){var a=String(n).trim();var o=Number(i)||(e.test(a)?16:10);return t(a,o)}}(parseInt)}}); -//# sourceMappingURL=es5-shim.map \ No newline at end of file diff --git a/lib/jquery-1.8.0.min.js b/lib/jquery-1.8.0.min.js deleted file mode 100644 index f121291c..00000000 --- a/lib/jquery-1.8.0.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v@1.8.0 jquery.com | jquery.org/license */ -(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write(""),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bR[a]=c,c}function ch(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||cd.test(a)?d(a,e):ch(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ch(a+"["+e+"]",b[e],c,d);else d(a,b)}function cy(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.0",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return typeof a=="object"?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b
a",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length||!d)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="
t
",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="
",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/^(?:\{.*\}|\[.*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||++p.uuid:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.shift(),e=p._queueHooks(a,b),f=function(){p.dequeue(a,b)};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),delete e.stop,d.call(a,f,e)),!c.length&&e&&e.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c-1)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c-1)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,""+d),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;jq&&u.push({elem:this,matches:o.slice(q)});for(d=0;d0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bd(a,b,c,d){var e=0,f=b.length;for(;e0?h(g,c,f):[]}function bf(a,c,d,e,f){var g,h,i,j,k,l,m,n,p=0,q=f.length,s=L.POS,t=new RegExp("^"+s.source+"(?!"+r+")","i"),u=function(){var a=1,c=arguments.length-2;for(;ai){m=a.slice(i,g.index),i=n,l=[c],B.test(m)&&(k&&(l=k),k=e);if(h=H.test(m))m=m.slice(0,-5).replace(B,"$&*");g.length>1&&g[0].replace(t,u),k=be(m,g[1],g[2],l,k,h)}}k?(j=j.concat(k),(m=a.slice(i))&&m!==")"?B.test(m)?bd(m,j,d,e):Z(m,c,d,e?e.concat(k):k):o.apply(d,j)):Z(a,c,d,e)}return q===1?d:Z.uniqueSort(d)}function bg(a,b,c){var d,e,f,g=[],i=0,j=D.exec(a),k=!j.pop()&&!j.pop(),l=k&&a.match(C)||[""],m=$.preFilter,n=$.filter,o=!c&&b!==h;for(;(e=l[i])!=null&&k;i++){g.push(d=[]),o&&(e=" "+e);while(e){k=!1;if(j=B.exec(e))e=e.slice(j[0].length),k=d.push({part:j.pop().replace(A," "),captures:j});for(f in n)(j=L[f].exec(e))&&(!m[f]||(j=m[f](j,b,c)))&&(e=e.slice(j.shift().length),k=d.push({part:f,captures:j}));if(!k)break}}return k||Z.error(a),g}function bh(a,b,e){var f=b.dir,g=m++;return a||(a=function(a){return a===e}),b.first?function(b,c){while(b=b[f])if(b.nodeType===1)return a(b,c)&&b}:function(b,e){var h,i=g+"."+d,j=i+"."+c;while(b=b[f])if(b.nodeType===1){if((h=b[q])===j)return b.sizset;if(typeof h=="string"&&h.indexOf(i)===0){if(b.sizset)return b}else{b[q]=j;if(a(b,e))return b.sizset=!0,b;b.sizset=!1}}}}function bi(a,b){return a?function(c,d){var e=b(c,d);return e&&a(e===!0?c:e,d)}:b}function bj(a,b,c){var d,e,f=0;for(;d=a[f];f++)$.relative[d.part]?e=bh(e,$.relative[d.part],b):(d.captures.push(b,c),e=bi(e,$.filter[d.part].apply(null,d.captures)));return e}function bk(a){return function(b,c){var d,e=0;for(;d=a[e];e++)if(d(b,c))return!0;return!1}}var c,d,e,f,g,h=a.document,i=h.documentElement,j="undefined",k=!1,l=!0,m=0,n=[].slice,o=[].push,q=("sizcache"+Math.random()).replace(".",""),r="[\\x20\\t\\r\\n\\f]",s="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",t=s.replace("w","w#"),u="([*^$|!~]?=)",v="\\["+r+"*("+s+")"+r+"*(?:"+u+r+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+t+")|)|)"+r+"*\\]",w=":("+s+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|((?:[^,]|\\\\,|(?:,(?=[^\\[]*\\]))|(?:,(?=[^\\(]*\\))))*))\\)|)",x=":(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\)|)(?=[^-]|$)",y=r+"*([\\x20\\t\\r\\n\\f>+~])"+r+"*",z="(?=[^\\x20\\t\\r\\n\\f])(?:\\\\.|"+v+"|"+w.replace(2,7)+"|[^\\\\(),])+",A=new RegExp("^"+r+"+|((?:^|[^\\\\])(?:\\\\.)*)"+r+"+$","g"),B=new RegExp("^"+y),C=new RegExp(z+"?(?="+r+"*,|$)","g"),D=new RegExp("^(?:(?!,)(?:(?:^|,)"+r+"*"+z+")*?|"+r+"*(.*?))(\\)|$)"),E=new RegExp(z.slice(19,-6)+"\\x20\\t\\r\\n\\f>+~])+|"+y,"g"),F=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,G=/[\x20\t\r\n\f]*[+~]/,H=/:not\($/,I=/h\d/i,J=/input|select|textarea|button/i,K=/\\(?!\\)/g,L={ID:new RegExp("^#("+s+")"),CLASS:new RegExp("^\\.("+s+")"),NAME:new RegExp("^\\[name=['\"]?("+s+")['\"]?\\]"),TAG:new RegExp("^("+s.replace("[-","[-\\*")+")"),ATTR:new RegExp("^"+v),PSEUDO:new RegExp("^"+w),CHILD:new RegExp("^:(only|nth|last|first)-child(?:\\("+r+"*(even|odd|(([+-]|)(\\d*)n|)"+r+"*(?:([+-]|)"+r+"*(\\d+)|))"+r+"*\\)|)","i"),POS:new RegExp(x,"ig"),needsContext:new RegExp("^"+r+"*[>+~]|"+x,"i")},M={},N=[],O={},P=[],Q=function(a){return a.sizzleFilter=!0,a},R=function(a){return function(b){return b.nodeName.toLowerCase()==="input"&&b.type===a}},S=function(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}},T=function(a){var b=!1,c=h.createElement("div");try{b=a(c)}catch(d){}return c=null,b},U=T(function(a){a.innerHTML="";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),V=T(function(a){a.id=q+0,a.innerHTML="
",i.insertBefore(a,i.firstChild);var b=h.getElementsByName&&h.getElementsByName(q).length===2+h.getElementsByName(q+0).length;return g=!h.getElementById(q),i.removeChild(a),b}),W=T(function(a){return a.appendChild(h.createComment("")),a.getElementsByTagName("*").length===0}),X=T(function(a){return a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!==j&&a.firstChild.getAttribute("href")==="#"}),Y=T(function(a){return a.innerHTML="",!a.getElementsByClassName||a.getElementsByClassName("e").length===0?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length!==1)}),Z=function(a,b,c,d){c=c||[],b=b||h;var e,f,g,i,j=b.nodeType;if(j!==1&&j!==9)return[];if(!a||typeof a!="string")return c;g=ba(b);if(!g&&!d)if(e=F.exec(a))if(i=e[1]){if(j===9){f=b.getElementById(i);if(!f||!f.parentNode)return c;if(f.id===i)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(i))&&bb(b,f)&&f.id===i)return c.push(f),c}else{if(e[2])return o.apply(c,n.call(b.getElementsByTagName(a),0)),c;if((i=e[3])&&Y&&b.getElementsByClassName)return o.apply(c,n.call(b.getElementsByClassName(i),0)),c}return bm(a,b,c,d,g)},$=Z.selectors={cacheLength:50,match:L,order:["ID","TAG"],attrHandle:{},createPseudo:Q,find:{ID:g?function(a,b,c){if(typeof b.getElementById!==j&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==j&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==j&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:W?function(a,b){if(typeof b.getElementsByTagName!==j)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(K,""),a[3]=(a[4]||a[5]||"").replace(K,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||Z.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&Z.error(a[0]),a},PSEUDO:function(a){var b,c=a[4];return L.CHILD.test(a[0])?null:(c&&(b=D.exec(c))&&b.pop()&&(a[0]=a[0].slice(0,b[0].length-c.length-1),c=b[0].slice(0,-1)),a.splice(2,3,c||a[3]),a)}},filter:{ID:g?function(a){return a=a.replace(K,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(K,""),function(b){var c=typeof b.getAttributeNode!==j&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(K,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=M[a];return b||(b=M[a]=new RegExp("(^|"+r+")"+a+"("+r+"|$)"),N.push(a),N.length>$.cacheLength&&delete M[N.shift()]),function(a){return b.test(a.className||typeof a.getAttribute!==j&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return b?function(d){var e=Z.attr(d,a),f=e+"";if(e==null)return b==="!=";switch(b){case"=":return f===c;case"!=":return f!==c;case"^=":return c&&f.indexOf(c)===0;case"*=":return c&&f.indexOf(c)>-1;case"$=":return c&&f.substr(f.length-c.length)===c;case"~=":return(" "+f+" ").indexOf(c)>-1;case"|=":return f===c||f.substr(0,c.length+1)===c+"-"}}:function(b){return Z.attr(b,a)!=null}},CHILD:function(a,b,c,d){if(a==="nth"){var e=m++;return function(a){var b,f,g=0,h=a;if(c===1&&d===0)return!0;b=a.parentNode;if(b&&(b[q]!==e||!a.sizset)){for(h=b.firstChild;h;h=h.nextSibling)if(h.nodeType===1){h.sizset=++g;if(h===a)break}b[q]=e}return f=a.sizset-d,c===0?f===0:f%c===0&&f/c>=0}}return function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b,c,d){var e=$.pseudos[a]||$.pseudos[a.toLowerCase()];return e||Z.error("unsupported pseudo: "+a),e.sizzleFilter?e(b,c,d):e}},pseudos:{not:Q(function(a,b,c){var d=bl(a.replace(A,"$1"),b,c);return function(a){return!d(a)}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!$.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},contains:Q(function(a){return function(b){return(b.textContent||b.innerText||bc(b)).indexOf(a)>-1}}),has:Q(function(a){return function(b){return Z(a,b).length>0}}),header:function(a){return I.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:R("radio"),checkbox:R("checkbox"),file:R("file"),password:R("password"),image:R("image"),submit:S("submit"),reset:S("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return J.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b,c){return c?a.slice(1):[a[0]]},last:function(a,b,c){var d=a.pop();return c?a:[d]},even:function(a,b,c){var d=[],e=c?1:0,f=a.length;for(;e$.cacheLength&&delete O[P.shift()],g};Z.matches=function(a,b){return Z(a,null,null,b)},Z.matchesSelector=function(a,b){return Z(b,null,null,[a]).length>0};var bm=function(a,b,e,f,g){a=a.replace(A,"$1");var h,i,j,k,l,m,p,q,r,s=a.match(C),t=a.match(E),u=b.nodeType;if(L.POS.test(a))return bf(a,b,e,f,s);if(f)h=n.call(f,0);else if(s&&s.length===1){if(t.length>1&&u===9&&!g&&(s=L.ID.exec(t[0]))){b=$.find.ID(s[1],b,g)[0];if(!b)return e;a=a.slice(t.shift().length)}q=(s=G.exec(t[0]))&&!s.index&&b.parentNode||b,r=t.pop(),m=r.split(":not")[0];for(j=0,k=$.order.length;j",a.querySelectorAll("[selected]").length||e.push("\\["+r+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),T(function(a){a.innerHTML="

",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+r+"*(?:\"\"|'')"),a.innerHTML="",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=e.length&&new RegExp(e.join("|")),bm=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a)))if(d.nodeType===9)try{return o.apply(f,n.call(d.querySelectorAll(a),0)),f}catch(i){}else if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){var j=d.getAttribute("id"),k=j||q,l=G.test(a)&&d.parentNode||d;j?k=k.replace(c,"\\$&"):d.setAttribute("id",k);try{return o.apply(f,n.call(l.querySelectorAll(a.replace(C,"[id='"+k+"'] $&")),0)),f}catch(i){}finally{j||d.removeAttribute("id")}}return b(a,d,f,g,h)},g&&(T(function(b){a=g.call(b,"div");try{g.call(b,"[test!='']:sizzle"),f.push($.match.PSEUDO)}catch(c){}}),f=new RegExp(f.join("|")),Z.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!ba(b)&&!f.test(c)&&(!e||!e.test(c)))try{var h=g.call(b,c);if(h||a||b.document&&b.document.nodeType!==11)return h}catch(i){}return Z(c,null,null,[b]).length>0})}(),Z.attr=p.attr,p.find=Z,p.expr=Z.selectors,p.expr[":"]=p.expr.pseudos,p.unique=Z.uniqueSort,p.text=Z.getText,p.isXMLDoc=Z.isXML,p.contains=Z.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b0)for(e=d;e=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*\s*$/g,bz={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X
","
"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1>");try{for(;d1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=0,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(g=b===e&&bA;(h=a[s])!=null;s++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{g=g||bk(b),l=l||g.appendChild(b.createElement("div")),h=h.replace(bo,"<$1>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]===""&&!m?l.childNodes:[];for(f=n.length-1;f>=0;--f)p.nodeName(n[f],"tbody")&&!n[f].childNodes.length&&n[f].parentNode.removeChild(n[f])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l=g.lastChild}h.nodeType?t.push(h):t=p.merge(t,h)}l&&(g.removeChild(l),h=l=g=null);if(!p.support.appendChecked)for(s=0;(h=t[s])!=null;s++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(s=0;(h=t[s])!=null;s++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[s+1,0].concat(r)),s+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^margin/,bO=new RegExp("^("+q+")(.*)$","i"),bP=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bQ=new RegExp("^([-+])=("+q+")","i"),bR={},bS={position:"absolute",visibility:"hidden",display:"block"},bT={letterSpacing:0,fontWeight:400,lineHeight:1},bU=["Top","Right","Bottom","Left"],bV=["Webkit","O","Moz","ms"],bW=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return bZ(this,!0)},hide:function(){return bZ(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bW.apply(this,arguments):this.each(function(){(c?a:bY(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bX(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bQ.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bX(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bT&&(f=bT[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(a,b){var c,d,e,f,g=getComputedStyle(a,null),h=a.style;return g&&(c=g[b],c===""&&!p.contains(a.ownerDocument.documentElement,a)&&(c=p.style(a,b)),bP.test(c)&&bN.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=c,c=g.width,h.width=d,h.minWidth=e,h.maxWidth=f)),c}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bP.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0||bH(a,"display")!=="none"?ca(a,b,d):p.swap(a,bS,function(){return ca(a,b,d)})},set:function(a,c,d){return b$(a,c,d?b_(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bP.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bU[d]+b]=e[d]||e[d-2]||e[0];return f}},bN.test(a)||(p.cssHooks[a+b].set=b$)});var cc=/%20/g,cd=/\[\]$/,ce=/\r?\n/g,cf=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,cg=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||cg.test(this.nodeName)||cf.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(ce,"\r\n")}}):{name:b.name,value:c.replace(ce,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ch(d,a[d],c,f);return e.join("&").replace(cc,"+")};var ci,cj,ck=/#.*$/,cl=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cm=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,cn=/^(?:GET|HEAD)$/,co=/^\/\//,cp=/\?/,cq=/)<[^<]*)*<\/script>/gi,cr=/([?&])_=[^&]*/,cs=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,ct=p.fn.load,cu={},cv={},cw=["*/"]+["*"];try{ci=f.href}catch(cx){ci=e.createElement("a"),ci.href="",ci=ci.href}cj=cs.exec(ci.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&ct)return ct.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("
").append(a.replace(cq,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cA(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cA(a,b),a},ajaxSettings:{url:ci,isLocal:cm.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cw},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cy(cu),ajaxTransport:cy(cv),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cB(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cC(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=""+(c||y),k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cl.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(ck,"").replace(co,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=cs.exec(l.url.toLowerCase()),l.crossDomain=!(!i||i[1]==cj[1]&&i[2]==cj[2]&&(i[3]||(i[1]==="http:"?80:443))==(cj[3]||(cj[1]==="http:"?80:443)))),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cz(cu,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!cn.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cp.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cr,"$1_="+z);l.url=A+(A===l.url?(cp.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cw+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cz(cv,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cD=[],cE=/\?/,cF=/(=)\?(?=&|$)|\?\?/,cG=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cD.pop()||p.expando+"_"+cG++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cF.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cF.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cF,"$1"+f):m?c.data=i.replace(cF,"$1"+f):k&&(c.url+=(cE.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cD.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cH,cI=a.ActiveXObject?function(){for(var a in cH)cH[a](0,1)}:!1,cJ=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cK()||cL()}:cK,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cI&&delete cH[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cJ,cI&&(cH||(cH={},p(a).unload(cI)),cH[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cM,cN,cO=/^(?:toggle|show|hide)$/,cP=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cQ=/queueHooks$/,cR=[cX],cS={"*":[function(a,b){var c,d,e,f=this.createTween(a,b),g=cP.exec(b),h=f.cur(),i=+h||0,j=1;if(g){c=+g[2],d=g[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&i){i=p.css(f.elem,a,!0)||c||1;do e=j=j||".5",i=i/j,p.style(f.elem,a,i+d),j=f.cur()/h;while(j!==1&&j!==e)}f.unit=d,f.start=i,f.end=g[1]?i+(g[1]+1)*c:c}return f}]};p.Animation=p.extend(cV,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c$.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c$.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=c_(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window); \ No newline at end of file diff --git a/lib/raphael-min.js b/lib/raphael-min.js deleted file mode 100644 index d30dbad8..00000000 --- a/lib/raphael-min.js +++ /dev/null @@ -1,10 +0,0 @@ -// ┌────────────────────────────────────────────────────────────────────┐ \\ -// │ Raphaël 2.1.0 - JavaScript Vector Library │ \\ -// ├────────────────────────────────────────────────────────────────────┤ \\ -// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ -// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com) │ \\ -// ├────────────────────────────────────────────────────────────────────┤ \\ -// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\ -// └────────────────────────────────────────────────────────────────────┘ \\ - -(function(a){var b="0.3.4",c="hasOwnProperty",d=/[\.\/]/,e="*",f=function(){},g=function(a,b){return a-b},h,i,j={n:{}},k=function(a,b){var c=j,d=i,e=Array.prototype.slice.call(arguments,2),f=k.listeners(a),l=0,m=!1,n,o=[],p={},q=[],r=h,s=[];h=a,i=0;for(var t=0,u=f.length;tf*b.top){e=b.percents[y],p=b.percents[y-1]||0,t=t/b.top*(e-p),o=b.percents[y+1],j=b.anim[e];break}f&&d.attr(b.anim[b.percents[y]])}if(!!j){if(!k){for(var A in j)if(j[g](A))if(U[g](A)||d.paper.customAttributes[g](A)){u[A]=d.attr(A),u[A]==null&&(u[A]=T[A]),v[A]=j[A];switch(U[A]){case C:w[A]=(v[A]-u[A])/t;break;case"colour":u[A]=a.getRGB(u[A]);var B=a.getRGB(v[A]);w[A]={r:(B.r-u[A].r)/t,g:(B.g-u[A].g)/t,b:(B.b-u[A].b)/t};break;case"path":var D=bR(u[A],v[A]),E=D[1];u[A]=D[0],w[A]=[];for(y=0,z=u[A].length;yd)return d;while(cf?c=e:d=e,e=(d-c)/2+c}return e}function n(a,b){var c=o(a,b);return((l*c+k)*c+j)*c}function m(a){return((i*a+h)*a+g)*a}var g=3*b,h=3*(d-b)-g,i=1-g-h,j=3*c,k=3*(e-c)-j,l=1-j-k;return n(a,1/(200*f))}function cq(){return this.x+q+this.y+q+this.width+" × "+this.height}function cp(){return this.x+q+this.y}function cb(a,b,c,d,e,f){a!=null?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function bH(b,c,d){b=a._path2curve(b),c=a._path2curve(c);var e,f,g,h,i,j,k,l,m,n,o=d?0:[];for(var p=0,q=b.length;p=0&&y<=1&&A>=0&&A<=1&&(d?n++:n.push({x:x.x,y:x.y,t1:y,t2:A}))}}return n}function bF(a,b){return bG(a,b,1)}function bE(a,b){return bG(a,b)}function bD(a,b,c,d,e,f,g,h){if(!(x(a,c)x(e,g)||x(b,d)x(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(!k)return;var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(n<+y(a,c).toFixed(2)||n>+x(a,c).toFixed(2)||n<+y(e,g).toFixed(2)||n>+x(e,g).toFixed(2)||o<+y(b,d).toFixed(2)||o>+x(b,d).toFixed(2)||o<+y(f,h).toFixed(2)||o>+x(f,h).toFixed(2))return;return{x:l,y:m}}}function bC(a,b,c,d,e,f,g,h,i){if(!(i<0||bB(a,b,c,d,e,f,g,h)n)k/=2,l+=(m1?1:i<0?0:i;var j=i/2,k=12,l=[-0.1252,.1252,-0.3678,.3678,-0.5873,.5873,-0.7699,.7699,-0.9041,.9041,-0.9816,.9816],m=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],n=0;for(var o=0;od;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}function bx(){return this.hex}function bv(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),f=e.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];if(h[g](f)){bu(i,f);return c?c(h[f]):h[f]}i.length>=1e3&&delete h[i.shift()],i.push(f),h[f]=a[m](b,e);return c?c(h[f]):h[f]}return d}function bu(a,b){for(var c=0,d=a.length;c',bl=bk.firstChild,bl.style.behavior="url(#default#VML)";if(!bl||typeof bl.adj!="object")return a.type=p;bk=null}a.svg=!(a.vml=a.type=="VML"),a._Paper=j,a.fn=k=j.prototype=a.prototype,a._id=0,a._oid=0,a.is=function(a,b){b=v.call(b);if(b=="finite")return!M[g](+a);if(b=="array")return a instanceof Array;return b=="null"&&a===null||b==typeof a&&a!==null||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||H.call(a).slice(8,-1).toLowerCase()==b},a.angle=function(b,c,d,e,f,g){if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return(180+w.atan2(-i,-h)*180/B+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)},a.rad=function(a){return a%360*B/180},a.deg=function(a){return a*180/B%360},a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,E)){var e=b.length;while(e--)if(z(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(fb-d)return c-f+b}return c};var bn=a.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=w.random()*16|0,c=a=="x"?b:b&3|8;return c.toString(16)});a.setWindow=function(b){eve("raphael.setWindow",a,h.win,b),h.win=b,h.doc=h.win.document,a._engine.initWin&&a._engine.initWin(h.win)};var bo=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write(""),e.close(),d=e.body}catch(f){d=createPopup().document.body}var g=d.createTextRange();bo=bv(function(a){try{d.style.color=r(a).replace(c,p);var b=g.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=h.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",h.doc.body.appendChild(i),bo=bv(function(a){i.style.color=a;return h.doc.defaultView.getComputedStyle(i,p).getPropertyValue("color")})}return bo(b)},bp=function(){return"hsb("+[this.h,this.s,this.b]+")"},bq=function(){return"hsl("+[this.h,this.s,this.l]+")"},br=function(){return this.hex},bs=function(b,c,d){c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b&&(d=b.b,c=b.g,b=b.r);if(c==null&&a.is(b,D)){var e=a.getRGB(b);b=e.r,c=e.g,d=e.b}if(b>1||c>1||d>1)b/=255,c/=255,d/=255;return[b,c,d]},bt=function(b,c,d,e){b*=255,c*=255,d*=255;var f={r:b,g:c,b:d,hex:a.rgb(b,c,d),toString:br};a.is(e,"finite")&&(f.opacity=e);return f};a.color=function(b){var c;a.is(b,"object")&&"h"in b&&"s"in b&&"b"in b?(c=a.hsb2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):a.is(b,"object")&&"h"in b&&"s"in b&&"l"in b?(c=a.hsl2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):(a.is(b,"string")&&(b=a.getRGB(b)),a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b?(c=a.rgb2hsl(b),b.h=c.h,b.s=c.s,b.l=c.l,c=a.rgb2hsb(b),b.v=c.b):(b={hex:"none"},b.r=b.g=b.b=b.h=b.s=b.v=b.l=-1)),b.toString=br;return b},a.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;a=a%360/60,i=c*b,h=i*(1-z(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bt(e,f,g,d)},a.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h);if(a>1||b>1||c>1)a/=360,b/=100,c/=100;a*=360;var e,f,g,h,i;a=a%360/60,i=2*b*(c<.5?c:1-c),h=i*(1-z(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bt(e,f,g,d)},a.rgb2hsb=function(a,b,c){c=bs(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;f=x(a,b,c),g=f-y(a,b,c),d=g==0?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=g==0?0:g/f;return{h:d,s:e,b:f,toString:bp}},a.rgb2hsl=function(a,b,c){c=bs(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;g=x(a,b,c),h=y(a,b,c),i=g-h,d=i==0?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=i==0?0:f<.5?i/(2*f):i/(2-2*f);return{h:d,s:e,l:f,toString:bq}},a._path2string=function(){return this.join(",").replace(Y,"$1")};var bw=a._preload=function(a,b){var c=h.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,h.doc.body.removeChild(this)},c.onerror=function(){h.doc.body.removeChild(this)},h.doc.body.appendChild(c),c.src=a};a.getRGB=bv(function(b){if(!b||!!((b=r(b)).indexOf("-")+1))return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bx};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none",toString:bx};!X[g](b.toLowerCase().substring(0,2))&&b.charAt()!="#"&&(b=bo(b));var c,d,e,f,h,i,j,k=b.match(L);if(k){k[2]&&(f=R(k[2].substring(5),16),e=R(k[2].substring(3,5),16),d=R(k[2].substring(1,3),16)),k[3]&&(f=R((i=k[3].charAt(3))+i,16),e=R((i=k[3].charAt(2))+i,16),d=R((i=k[3].charAt(1))+i,16)),k[4]&&(j=k[4][s](W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),k[1].toLowerCase().slice(0,4)=="rgba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100));if(k[5]){j=k[5][s](W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,f,h)}if(k[6]){j=k[6][s](W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsla"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,f,h)}k={r:d,g:e,b:f,toString:bx},k.hex="#"+(16777216|f|e<<8|d<<16).toString(16).slice(1),a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bx}},a),a.hsb=bv(function(b,c,d){return a.hsb2rgb(b,c,d).hex}),a.hsl=bv(function(b,c,d){return a.hsl2rgb(b,c,d).hex}),a.rgb=bv(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b}));return c.hex},a.getColor.reset=function(){delete this.start},a.parsePathString=function(b){if(!b)return null;var c=bz(b);if(c.arr)return bJ(c.arr);var d={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},e=[];a.is(b,E)&&a.is(b[0],E)&&(e=bJ(b)),e.length||r(b).replace(Z,function(a,b,c){var f=[],g=b.toLowerCase();c.replace(_,function(a,b){b&&f.push(+b)}),g=="m"&&f.length>2&&(e.push([b][n](f.splice(0,2))),g="l",b=b=="m"?"l":"L");if(g=="r")e.push([b][n](f));else while(f.length>=d[g]){e.push([b][n](f.splice(0,d[g])));if(!d[g])break}}),e.toString=a._path2string,c.arr=bJ(e);return e},a.parseTransformString=bv(function(b){if(!b)return null;var c={r:3,s:4,t:2,m:6},d=[];a.is(b,E)&&a.is(b[0],E)&&(d=bJ(b)),d.length||r(b).replace($,function(a,b,c){var e=[],f=v.call(b);c.replace(_,function(a,b){b&&e.push(+b)}),d.push([b][n](e))}),d.toString=a._path2string;return d});var bz=function(a){var b=bz.ps=bz.ps||{};b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[g](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])});return b[a]};a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=A(j,3),l=A(j,2),m=i*i,n=m*i,o=k*a+l*3*i*c+j*3*i*i*e+n*g,p=k*b+l*3*i*d+j*3*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,x=j*e+i*g,y=j*f+i*h,z=90-w.atan2(q-s,r-t)*180/B;(q>s||r=a.x&&b<=a.x2&&c>=a.y&&c<=a.y2},a.isBBoxIntersect=function(b,c){var d=a.isPointInsideBBox;return d(c,b.x,b.y)||d(c,b.x2,b.y)||d(c,b.x,b.y2)||d(c,b.x2,b.y2)||d(b,c.x,c.y)||d(b,c.x2,c.y)||d(b,c.x,c.y2)||d(b,c.x2,c.y2)||(b.xc.x||c.xb.x)&&(b.yc.y||c.yb.y)},a.pathIntersection=function(a,b){return bH(a,b)},a.pathIntersectionNumber=function(a,b){return bH(a,b,1)},a.isPointInsidePath=function(b,c,d){var e=a.pathBBox(b);return a.isPointInsideBBox(e,c,d)&&bH(b,[["M",c,d],["H",e.x2+10]],1)%2==1},a._removedFactory=function(a){return function(){eve("raphael.log",null,"Raphaël: you are calling to method “"+a+"” of removed object",a)}};var bI=a.pathBBox=function(a){var b=bz(a);if(b.bbox)return b.bbox;if(!a)return{x:0,y:0,width:0,height:0,x2:0,y2:0};a=bR(a);var c=0,d=0,e=[],f=[],g;for(var h=0,i=a.length;h1&&(v=w.sqrt(v),c=v*c,d=v*d);var x=c*c,y=d*d,A=(f==g?-1:1)*w.sqrt(z((x*y-x*u*u-y*t*t)/(x*u*u+y*t*t))),C=A*c*u/d+(a+h)/2,D=A*-d*t/c+(b+i)/2,E=w.asin(((b-D)/d).toFixed(9)),F=w.asin(((i-D)/d).toFixed(9));E=aF&&(E=E-B*2),!g&&F>E&&(F=F-B*2)}else E=j[0],F=j[1],C=j[2],D=j[3];var G=F-E;if(z(G)>k){var H=F,I=h,J=i;F=E+k*(g&&F>E?1:-1),h=C+c*w.cos(F),i=D+d*w.sin(F),m=bO(h,i,c,d,e,0,g,I,J,[F,H,C,D])}G=F-E;var K=w.cos(E),L=w.sin(E),M=w.cos(F),N=w.sin(F),O=w.tan(G/4),P=4/3*c*O,Q=4/3*d*O,R=[a,b],S=[a+P*L,b-Q*K],T=[h+P*N,i-Q*M],U=[h,i];S[0]=2*R[0]-S[0],S[1]=2*R[1]-S[1];if(j)return[S,T,U][n](m);m=[S,T,U][n](m).join()[s](",");var V=[];for(var W=0,X=m.length;W"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bP(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bP(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y)),i=f-2*d+b-(h-2*f+d),j=2*(d-b)-2*(f-d),k=b-d,l=(-j+w.sqrt(j*j-4*i*k))/2/i,n=(-j-w.sqrt(j*j-4*i*k))/2/i,z(l)>"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bP(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bP(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y));return{min:{x:y[m](0,p),y:y[m](0,o)},max:{x:x[m](0,p),y:x[m](0,o)}}}),bR=a._path2curve=bv(function(a,b){var c=!b&&bz(a);if(!b&&c.curve)return bJ(c.curve);var d=bL(a),e=b&&bL(b),f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},h=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][n](bO[m](0,[b.x,b.y][n](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x)),d=b.y+(b.y-(b.by||b.y)),a=["C",c,d][n](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x)),b.qy=b.y+(b.y-(b.qy||b.y)),a=["C"][n](bN(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][n](bN(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][n](bM(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][n](bM(b.x,b.y,a[1],b.y));break;case"V":a=["C"][n](bM(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][n](bM(b.x,b.y,b.X,b.Y))}return a},i=function(a,b){if(a[b].length>7){a[b].shift();var c=a[b];while(c.length)a.splice(b++,0,["C"][n](c.splice(0,6)));a.splice(b,1),l=x(d.length,e&&e.length||0)}},j=function(a,b,c,f,g){a&&b&&a[g][0]=="M"&&b[g][0]!="M"&&(b.splice(g,0,["M",f.x,f.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],l=x(d.length,e&&e.length||0))};for(var k=0,l=x(d.length,e&&e.length||0);ke){if(c&&!l.start){m=cs(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),k+=["C"+m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k,k=["M"+m.x,m.y+"C"+m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!b&&!c){m=cs(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j,g=+i[5],h=+i[6]}k+=i.shift()+i}l.end=k,m=b?n:c?l:a.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},cu=ct(1),cv=ct(),cw=ct(0,1);a.getTotalLength=cu,a.getPointAtLength=cv,a.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return cw(a,b).end;var d=cw(a,c,1);return b?cw(d,b).end:d},cl.getTotalLength=function(){if(this.type=="path"){if(this.node.getTotalLength)return this.node.getTotalLength();return cu(this.attrs.path)}},cl.getPointAtLength=function(a){if(this.type=="path")return cv(this.attrs.path,a)},cl.getSubpath=function(b,c){if(this.type=="path")return a.getSubpath(this.attrs.path,b,c)};var cx=a.easing_formulas={linear:function(a){return a},"<":function(a){return A(a,1.7)},">":function(a){return A(a,.48)},"<>":function(a){var b=.48-a/1.04,c=w.sqrt(.1734+b*b),d=c-b,e=A(z(d),1/3)*(d<0?-1:1),f=-c-b,g=A(z(f),1/3)*(f<0?-1:1),h=e+g+.5;return(1-h)*3*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==!!a)return a;return A(2,-10*a)*w.sin((a-.075)*2*B/.3)+1},bounce:function(a){var b=7.5625,c=2.75,d;a<1/c?d=b*a*a:a<2/c?(a-=1.5/c,d=b*a*a+.75):a<2.5/c?(a-=2.25/c,d=b*a*a+.9375):(a-=2.625/c,d=b*a*a+.984375);return d}};cx.easeIn=cx["ease-in"]=cx["<"],cx.easeOut=cx["ease-out"]=cx[">"],cx.easeInOut=cx["ease-in-out"]=cx["<>"],cx["back-in"]=cx.backIn,cx["back-out"]=cx.backOut;var cy=[],cz=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},cA=function(){var b=+(new Date),c=0;for(;c1&&!d.next){for(s in k)k[g](s)&&(r[s]=d.totalOrigin[s]);d.el.attr(r),cE(d.anim,d.el,d.anim.percents[0],null,d.totalOrigin,d.repeat-1)}d.next&&!d.stop&&cE(d.anim,d.el,d.next,null,d.totalOrigin,d.repeat)}}a.svg&&m&&m.paper&&m.paper.safari(),cy.length&&cz(cA)},cB=function(a){return a>255?255:a<0?0:a};cl.animateWith=function(b,c,d,e,f,g){var h=this;if(h.removed){g&&g.call(h);return h}var i=d instanceof cD?d:a.animation(d,e,f,g),j,k;cE(i,h,i.percents[0],null,h.attr());for(var l=0,m=cy.length;l.5)*2-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&n!=.5&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/);if(j=="linear"){var t=e.shift();t=-d(t);if(isNaN(t))return null;var u=[0,0,f.cos(a.rad(t)),f.sin(a.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=a._parseDots(e);if(!w)return null;k=k.replace(/[\(\)\s,\xb0#]/g,"_"),b.gradient&&k!=b.gradient.id&&(p.defs.removeChild(b.gradient),delete b.gradient);if(!b.gradient){s=q(j+"Gradient",{id:k}),b.gradient=s,q(s,j=="radial"?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:b.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;x1?G.opacity/100:G.opacity});case"stroke":G=a.getRGB(p),i.setAttribute(o,G.hex),o=="stroke"&&G[b]("opacity")&&q(i,{"stroke-opacity":G.opacity>1?G.opacity/100:G.opacity}),o=="stroke"&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":(d.type=="circle"||d.type=="ellipse"||c(p).charAt()!="r")&&r(d,p);break;case"opacity":k.gradient&&!k[b]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){H=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),H&&(I=H.getElementsByTagName("stop"),q(I[I.length-1],{"stop-opacity":p}));break};default:o=="font-size"&&(p=e(p,10)+"px");var J=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[J]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if(d.type=="text"&&!!(f[b]("text")||f[b]("font")||f[b]("font-size")||f[b]("x")||f[b]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(a._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;if(f[b]("text")){g.text=f.text;while(h.firstChild)h.removeChild(h.firstChild);var j=c(f.text).split("\n"),k=[],m;for(var n=0,o=j.length;n"));var $=X.getBoundingClientRect();t.W=m.w=($.right-$.left)/Y,t.H=m.h=($.bottom-$.top)/Y,t.X=m.x,t.Y=m.y+t.H/2,("x"in i||"y"in i)&&(t.path.v=a.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));var _=["x","y","text","font","font-family","font-weight","font-style","font-size"];for(var ba=0,bb=_.length;ba.25&&(c=e.sqrt(.25-i(b-.5,2))*((c>.5)*2-1)+.5),m=b+n+c);return o}),f=f.split(/\s*\-\s*/);if(l=="linear"){var p=f.shift();p=-d(p);if(isNaN(p))return null}var q=a._parseDots(f);if(!q)return null;b=b.shape||b.node;if(q.length){b.removeChild(g),g.on=!0,g.method="none",g.color=q[0].color,g.color2=q[q.length-1].color;var r=[];for(var s=0,t=q.length;s')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},a._engine.initWin(a._g.win),a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b.container,d=b.height,e,f=b.width,g=b.x,h=b.y;if(!c)throw new Error("VML container not found.");var i=new a._Paper,j=i.canvas=a._g.doc.createElement("div"),k=j.style;g=g||0,h=h||0,f=f||512,d=d||342,i.width=f,i.height=d,f==+f&&(f+="px"),d==+d&&(d+="px"),i.coordsize=u*1e3+n+u*1e3,i.coordorigin="0 0",i.span=a._g.doc.createElement("span"),i.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",j.appendChild(i.span),k.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d),c==1?(a._g.doc.body.appendChild(j),k.left=g+"px",k.top=h+"px",k.position="absolute"):c.firstChild?c.insertBefore(j,c.firstChild):c.appendChild(j),i.renderfix=function(){};return i},a.prototype.clear=function(){a.eve("raphael.clear",this),this.canvas.innerHTML=o,this.span=a._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},a.prototype.remove=function(){a.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null;return!0};var G=a.st;for(var H in E)E[b](H)&&!G[b](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}(window.Raphael) \ No newline at end of file diff --git a/package.json b/package.json index 4b49458f..1c67b781 100644 --- a/package.json +++ b/package.json @@ -36,10 +36,11 @@ "dependencies": { "backbone": "^1.4.0", "flux": "^3.1.3", - "jquery": "^3.4.0", + "jquery": "^1.8.0", "markdown": "^0.5.0", "prop-types": "^15.7.2", "q": "^1.5.1", + "raphael": "^2.1.0", "react": "^16.13.0", "react-dom": "^16.13.0", "underscore": "~1.4.3" diff --git a/src/js/app/index.js b/src/js/app/index.js index ddb4f431..683def93 100644 --- a/src/js/app/index.js +++ b/src/js/app/index.js @@ -1,4 +1,5 @@ var Backbone = require('backbone'); +var jQuery = require('jquery'); var EventEmitter = require('events').EventEmitter; var React = require('react'); var ReactDOM = require('react-dom'); @@ -11,6 +12,16 @@ var LocaleActions = require('../actions/LocaleActions'); /** * Globals */ + +Backbone.$ = jQuery; + +// Bypass jasmine +if (util.isBrowser()) { + window.jQuery = jQuery; + window.$ = jQuery; + window.Raphael = require('raphael'); +} + var events = Object.assign( {}, EventEmitter.prototype, diff --git a/src/template.index.html b/src/template.index.html index dffd7862..e3270fd9 100644 --- a/src/template.index.html +++ b/src/template.index.html @@ -18,117 +18,7 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - Learn Git Branching - -
-
-
-
- -
-
-
-
- -
-
- $ -   -

-
- -
- -
-
- -
- - Git - - - Hg - -
- - - - -
- -
-
- -
-
- -
-
- - - - Fork me on GitHub - - - - - - {{jsDependencies}} - - + - + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + Learn Git Branching + +
+
+
+
+ +
+
+
+
+ +
+
+ $ +   +

+
+ +
+ +
+
+ +
+ + Git + + + Hg + +
+ + + + +
+ +
+
+ +
+
+ +
+
+ + + + Fork me on GitHub + + - From eaa241208472a78d03f540e0298e27e0d8f012be Mon Sep 17 00:00:00 2001 From: hongarc Date: Tue, 21 Apr 2020 21:45:35 +0700 Subject: [PATCH 196/359] minify `css`+`html`, move font to `assets` --- {src/style => assets}/favicon.ico | Bin .../font/fontawesome-webfont.eot | Bin .../font/fontawesome-webfont.svg | 0 .../font/fontawesome-webfont.ttf | Bin .../font/fontawesome-webfont.woff | Bin gulpfile.js | 22 ++- package.json | 3 + src/style/font-awesome.css | 5 +- src/template.index.html | 7 +- yarn.lock | 135 +++++++++++++++--- 10 files changed, 142 insertions(+), 30 deletions(-) rename {src/style => assets}/favicon.ico (100%) rename {src/style => assets}/font/fontawesome-webfont.eot (100%) mode change 100755 => 100644 rename {src/style => assets}/font/fontawesome-webfont.svg (100%) mode change 100755 => 100644 rename {src/style => assets}/font/fontawesome-webfont.ttf (100%) mode change 100755 => 100644 rename {src/style => assets}/font/fontawesome-webfont.woff (100%) mode change 100755 => 100644 diff --git a/src/style/favicon.ico b/assets/favicon.ico similarity index 100% rename from src/style/favicon.ico rename to assets/favicon.ico diff --git a/src/style/font/fontawesome-webfont.eot b/assets/font/fontawesome-webfont.eot old mode 100755 new mode 100644 similarity index 100% rename from src/style/font/fontawesome-webfont.eot rename to assets/font/fontawesome-webfont.eot diff --git a/src/style/font/fontawesome-webfont.svg b/assets/font/fontawesome-webfont.svg old mode 100755 new mode 100644 similarity index 100% rename from src/style/font/fontawesome-webfont.svg rename to assets/font/fontawesome-webfont.svg diff --git a/src/style/font/fontawesome-webfont.ttf b/assets/font/fontawesome-webfont.ttf old mode 100755 new mode 100644 similarity index 100% rename from src/style/font/fontawesome-webfont.ttf rename to assets/font/fontawesome-webfont.ttf diff --git a/src/style/font/fontawesome-webfont.woff b/assets/font/fontawesome-webfont.woff old mode 100755 new mode 100644 similarity index 100% rename from src/style/font/fontawesome-webfont.woff rename to assets/font/fontawesome-webfont.woff diff --git a/gulpfile.js b/gulpfile.js index 67e80496..2380423e 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -8,8 +8,11 @@ var { src, dest, series, watch } = require('gulp'); var log = require('fancy-log'); var gHash = require('gulp-hash'); var gClean = require('gulp-clean'); +var concat = require('gulp-concat'); +var cleanCSS = require('gulp-clean-css'); var gTerser = require('gulp-terser'); var gJasmine = require('gulp-jasmine'); +var { minify } = require('html-minifier'); var { SpecReporter } = require('jasmine-spec-reporter'); var gJshint = require('gulp-jshint'); @@ -74,6 +77,15 @@ var buildIndex = function(done) { jsFile, styleFile, }); + + if (process.env.NODE_ENV === 'production') { + outputIndex = minify(outputIndex, { + minifyJS: true, + collapseWhitespace: true, + processScripts: ['text/html'], + removeComments: true, + }); + } writeFileSync('index.html', outputIndex); done(); }; @@ -118,8 +130,14 @@ var miniBuild = function() { }; var style = function() { - return src('src/style/main.css') - .pipe(gHash()) + var chain = src('src/style/*.css') + .pipe(concat('main.css')); + + if (process.env.NODE_ENV === 'production') { + chain = chain.pipe(cleanCSS()); + } + + return chain.pipe(gHash()) .pipe(dest(destDir)); }; diff --git a/package.json b/package.json index 1c67b781..e33e4303 100644 --- a/package.json +++ b/package.json @@ -22,11 +22,14 @@ "glob": "^7.1.6", "gulp": "^4.0.2", "gulp-clean": "^0.4.0", + "gulp-clean-css": "^4.3.0", + "gulp-concat": "^2.6.1", "gulp-hash": "^4.2.2", "gulp-jasmine": "^4.0.0", "gulp-jshint": "^2.1.0", "gulp-terser": "^1.2.0", "gulp-uglify": "^3.0.2", + "html-minifier": "^4.0.0", "jasmine-spec-reporter": "^4.2.1", "jshint": "^2.11.0", "prompt": "^1.0.0", diff --git a/src/style/font-awesome.css b/src/style/font-awesome.css index 377291bb..57f6f1fe 100644 --- a/src/style/font-awesome.css +++ b/src/style/font-awesome.css @@ -23,8 +23,8 @@ */ @font-face { font-family: "FontAwesome"; - src: url('./font/fontawesome-webfont.eot'); - src: url('./font/fontawesome-webfont.eot?#iefix') format('eot'), url('./font/fontawesome-webfont.woff') format('woff'), url('./font/fontawesome-webfont.ttf') format('truetype'), url('./font/fontawesome-webfont.svg#FontAwesome') format('svg'); + src: url('../assets/font/fontawesome-webfont.eot'); + src: url('../assets/font/fontawesome-webfont.eot?#iefix') format('eot'), url('../assets/font/fontawesome-webfont.woff') format('woff'), url('../assets/font/fontawesome-webfont.ttf') format('truetype'), url('../assets/font/fontawesome-webfont.svg#FontAwesome') format('svg'); font-weight: normal; font-style: normal; } @@ -301,4 +301,3 @@ li[class^="icon-"].icon-large:before, li[class*=" icon-"].icon-large:before { .icon-paste:before { content: "\f0ea"; } .icon-user-md:before { content: "\f200"; } - diff --git a/src/template.index.html b/src/template.index.html index 6ef1f424..4cfd03be 100644 --- a/src/template.index.html +++ b/src/template.index.html @@ -15,9 +15,7 @@ - - - + @@ -415,8 +413,7 @@ autocorrect="off" autocapitalize="off" spellcheck="false" - id="commandTextField"> - + id="commandTextField">
diff --git a/yarn.lock b/yarn.lock index 6ea88b3a..cca3d6d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -774,6 +774,14 @@ cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db" integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg== +camel-case@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -843,6 +851,13 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +clean-css@4.2.3, clean-css@^4.2.1: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + cli@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14" @@ -955,7 +970,7 @@ combine-source-map@^0.8.0, combine-source-map@~0.8.0: lodash.memoize "~3.0.3" source-map "~0.5.3" -commander@^2.20.0, commander@~2.20.3: +commander@^2.19.0, commander@^2.20.0, commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -980,6 +995,13 @@ concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: readable-stream "^2.2.2" typedarray "^0.0.6" +concat-with-sourcemaps@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" + integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg== + dependencies: + source-map "^0.6.1" + console-browserify@1.1.x: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" @@ -1904,6 +1926,16 @@ graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +gulp-clean-css@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-4.3.0.tgz#5b1e73f2fca46703eb636014cdd4553cea65146d" + integrity sha512-mGyeT3qqFXTy61j0zOIciS4MkYziF2U594t2Vs9rUnpkEHqfu6aDITMp8xOvZcvdX61Uz3y1mVERRYmjzQF5fg== + dependencies: + clean-css "4.2.3" + plugin-error "1.0.1" + through2 "3.0.1" + vinyl-sourcemaps-apply "0.2.1" + gulp-clean@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/gulp-clean/-/gulp-clean-0.4.0.tgz#3bc25e7084e641bbd7bde057cf90c01c50d95950" @@ -1939,6 +1971,15 @@ gulp-cli@^2.2.0: v8flags "^3.0.1" yargs "^7.1.0" +gulp-concat@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/gulp-concat/-/gulp-concat-2.6.1.tgz#633d16c95d88504628ad02665663cee5a4793353" + integrity sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M= + dependencies: + concat-with-sourcemaps "^1.0.0" + through2 "^2.0.0" + vinyl "^2.0.0" + gulp-hash@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/gulp-hash/-/gulp-hash-4.2.2.tgz#2cf4ad081ef7a65393a51e3df58f514f388f4523" @@ -2086,6 +2127,11 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -2107,6 +2153,19 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== +html-minifier@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-4.0.0.tgz#cca9aad8bce1175e02e17a8c33e46d8988889f56" + integrity sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig== + dependencies: + camel-case "^3.0.0" + clean-css "^4.2.1" + commander "^2.19.0" + he "^1.2.0" + param-case "^2.1.1" + relateurl "^0.2.7" + uglify-js "^3.5.1" + htmlescape@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" @@ -2942,6 +3001,11 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" @@ -3221,6 +3285,13 @@ next-tick@~1.0.0: resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -3428,6 +3499,13 @@ pako@~1.0.5: resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== +param-case@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= + dependencies: + no-case "^2.2.0" + parents@^1.0.0, parents@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" @@ -3596,6 +3674,16 @@ pkginfo@0.x.x: resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8= +plugin-error@1.0.1, plugin-error@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" + integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA== + dependencies: + ansi-colors "^1.0.1" + arr-diff "^4.0.0" + arr-union "^3.1.0" + extend-shallow "^3.0.2" + plugin-error@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" @@ -3607,16 +3695,6 @@ plugin-error@^0.1.2: arr-union "^2.0.1" extend-shallow "^1.1.2" -plugin-error@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" - integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA== - dependencies: - ansi-colors "^1.0.1" - arr-diff "^4.0.0" - arr-union "^3.1.0" - extend-shallow "^3.0.2" - pluralize@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" @@ -3943,6 +4021,11 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + remove-bom-buffer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" @@ -4255,7 +4338,7 @@ source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.6, source-map@~0.5.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.0, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -4480,6 +4563,13 @@ through2-filter@^3.0.0: through2 "~2.0.0" xtend "~4.0.0" +through2@3.0.1, through2@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" + integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + dependencies: + readable-stream "2 || 3" + through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -4488,13 +4578,6 @@ through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through2@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" - integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== - dependencies: - readable-stream "2 || 3" - "through@>=2.2.7 <3": version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -4600,6 +4683,13 @@ uglify-js@^3.0.5: commander "~2.20.3" source-map "~0.6.1" +uglify-js@^3.5.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.9.1.tgz#a56a71c8caa2d36b5556cc1fd57df01ae3491539" + integrity sha512-JUPoL1jHsc9fOjVFHdQIhqEEJsQvfKDjlubcCilu8U26uZ73qOg8VsN8O1jbuei44ZPlwL7kmbAdM4tzaUvqnA== + dependencies: + commander "~2.20.3" + umd@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" @@ -4682,6 +4772,11 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -4810,7 +4905,7 @@ vinyl-sourcemap@^1.1.0: remove-bom-buffer "^3.0.0" vinyl "^2.0.0" -vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1: +vinyl-sourcemaps-apply@0.2.1, vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" integrity sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU= From 258e3b5aad2d6334d6a3d4ad0ab0c7eecf8e5d12 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Apr 2020 17:33:23 +0000 Subject: [PATCH 197/359] Bump jquery from 1.12.4 to 3.4.0 Bumps [jquery](https://github.com/jquery/jquery) from 1.12.4 to 3.4.0. - [Release notes](https://github.com/jquery/jquery/releases) - [Commits](https://github.com/jquery/jquery/compare/1.12.4...3.4.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index e33e4303..643ca596 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "dependencies": { "backbone": "^1.4.0", "flux": "^3.1.3", - "jquery": "^1.8.0", + "jquery": "^3.4.0", "markdown": "^0.5.0", "prop-types": "^15.7.2", "q": "^1.5.1", diff --git a/yarn.lock b/yarn.lock index cca3d6d2..86f1505b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2563,10 +2563,10 @@ jasmine@^3.1.0: glob "^7.1.4" jasmine-core "~3.5.0" -jquery@^1.8.0: - version "1.12.4" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-1.12.4.tgz#01e1dfba290fe73deba77ceeacb0f9ba2fec9e0c" - integrity sha1-AeHfuikP5z3rp3zurLD5ui/sngw= +jquery@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.0.tgz#8de513fa0fa4b2c7d2e48a530e26f0596936efdf" + integrity sha512-ggRCXln9zEqv6OqAGXFEcshF5dSBvCkzj6Gm2gzuR5fWawaX8t7cxKVkkygKODrDAzKdoYw3l/e3pm3vlT4IbQ== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" From 61e0275ae1e4fc3f8cbd11332a436c4da96d1260 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Wed, 22 Apr 2020 10:06:17 -0700 Subject: [PATCH 198/359] Revert jquery back to 1.8 or above --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 643ca596..e33e4303 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "dependencies": { "backbone": "^1.4.0", "flux": "^3.1.3", - "jquery": "^3.4.0", + "jquery": "^1.8.0", "markdown": "^0.5.0", "prop-types": "^15.7.2", "q": "^1.5.1", diff --git a/yarn.lock b/yarn.lock index 86f1505b..cca3d6d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2563,10 +2563,10 @@ jasmine@^3.1.0: glob "^7.1.4" jasmine-core "~3.5.0" -jquery@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.0.tgz#8de513fa0fa4b2c7d2e48a530e26f0596936efdf" - integrity sha512-ggRCXln9zEqv6OqAGXFEcshF5dSBvCkzj6Gm2gzuR5fWawaX8t7cxKVkkygKODrDAzKdoYw3l/e3pm3vlT4IbQ== +jquery@^1.8.0: + version "1.12.4" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-1.12.4.tgz#01e1dfba290fe73deba77ceeacb0f9ba2fec9e0c" + integrity sha1-AeHfuikP5z3rp3zurLD5ui/sngw= "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" From 0e7b9594ab13fb8523b7a2483131904b15f0e558 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2020 18:31:57 +0000 Subject: [PATCH 199/359] Bump jquery from 1.12.4 to 3.4.0 Bumps [jquery](https://github.com/jquery/jquery) from 1.12.4 to 3.4.0. - [Release notes](https://github.com/jquery/jquery/releases) - [Commits](https://github.com/jquery/jquery/compare/1.12.4...3.4.0) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index e33e4303..643ca596 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "dependencies": { "backbone": "^1.4.0", "flux": "^3.1.3", - "jquery": "^1.8.0", + "jquery": "^3.4.0", "markdown": "^0.5.0", "prop-types": "^15.7.2", "q": "^1.5.1", diff --git a/yarn.lock b/yarn.lock index cca3d6d2..86f1505b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2563,10 +2563,10 @@ jasmine@^3.1.0: glob "^7.1.4" jasmine-core "~3.5.0" -jquery@^1.8.0: - version "1.12.4" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-1.12.4.tgz#01e1dfba290fe73deba77ceeacb0f9ba2fec9e0c" - integrity sha1-AeHfuikP5z3rp3zurLD5ui/sngw= +jquery@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.0.tgz#8de513fa0fa4b2c7d2e48a530e26f0596936efdf" + integrity sha512-ggRCXln9zEqv6OqAGXFEcshF5dSBvCkzj6Gm2gzuR5fWawaX8t7cxKVkkygKODrDAzKdoYw3l/e3pm3vlT4IbQ== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" From d3bc42c936d40019a6b878a4523078707ce02625 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Thu, 23 Apr 2020 09:06:03 -0700 Subject: [PATCH 200/359] Woohoo, fix jquery UI --- gulpfile.js | 2 +- package.json | 4 +++- src/js/views/rebaseView.js | 7 +++++++ yarn.lock | 18 ++++++++++++++---- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 2380423e..0c35630c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -92,7 +92,7 @@ var buildIndex = function(done) { var getBundle = function() { return browserify({ - entries: [...glob.sync('src/**/*.js'), ...glob.sync('src/**/*.jsx'), 'lib/jquery-ui-1.9.0.custom.min.js'], + entries: [...glob.sync('src/**/*.js'), ...glob.sync('src/**/*.jsx')], debug: true, }) .transform(babelify, { presets: ['@babel/preset-react'] }) diff --git a/package.json b/package.json index e33e4303..f6c96cb1 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,9 @@ "dependencies": { "backbone": "^1.4.0", "flux": "^3.1.3", - "jquery": "^1.8.0", + "jquery": "^3.4.0", + "jquery-ui": "^1.12.1", + "jquery-ui-sortable-npm": "^1.0.0", "markdown": "^0.5.0", "prop-types": "^15.7.2", "q": "^1.5.1", diff --git a/src/js/views/rebaseView.js b/src/js/views/rebaseView.js index b79e0b64..32b3674f 100644 --- a/src/js/views/rebaseView.js +++ b/src/js/views/rebaseView.js @@ -7,6 +7,13 @@ var ModalTerminal = require('../views').ModalTerminal; var ContainedBase = require('../views').ContainedBase; var ConfirmCancelView = require('../views').ConfirmCancelView; +require('jquery-ui/ui/widget'); +require('jquery-ui/ui/scroll-parent'); +require('jquery-ui/ui/data'); +require('jquery-ui/ui/widgets/mouse'); +require('jquery-ui/ui/ie'); +require('jquery-ui/ui/widgets/sortable'); + var InteractiveRebaseView = ContainedBase.extend({ tagName: 'div', template: _.template($('#interactive-rebase-template').html()), diff --git a/yarn.lock b/yarn.lock index cca3d6d2..85de6f11 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2563,10 +2563,20 @@ jasmine@^3.1.0: glob "^7.1.4" jasmine-core "~3.5.0" -jquery@^1.8.0: - version "1.12.4" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-1.12.4.tgz#01e1dfba290fe73deba77ceeacb0f9ba2fec9e0c" - integrity sha1-AeHfuikP5z3rp3zurLD5ui/sngw= +jquery-ui-sortable-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/jquery-ui-sortable-npm/-/jquery-ui-sortable-npm-1.0.0.tgz#5fa27c36b76d1fbd45de9e24a0c940c19ba1f6ce" + integrity sha1-X6J8NrdtH71F3p4koMlAwZuh9s4= + +jquery-ui@^1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/jquery-ui/-/jquery-ui-1.12.1.tgz#bcb4045c8dd0539c134bc1488cdd3e768a7a9e51" + integrity sha1-vLQEXI3QU5wTS8FIjN0+dop6nlE= + +jquery@^3.4.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.0.tgz#9980b97d9e4194611c36530e7dc46a58d7340fc9" + integrity sha512-Xb7SVYMvygPxbFMpTFQiHh1J7HClEaThguL15N/Gg37Lri/qKyhRGZYzHRyLH8Stq3Aow0LsHO2O2ci86fCrNQ== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" From 8a74cbbeeef322c2cf522cd225c7bcca7b92e278 Mon Sep 17 00:00:00 2001 From: Anh Hong Date: Fri, 24 Apr 2020 08:37:09 +0700 Subject: [PATCH 201/359] Add `draggable` of `jquery-ui` Fixed #687, #688 --- src/js/views/rebaseView.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/js/views/rebaseView.js b/src/js/views/rebaseView.js index 32b3674f..2d985ffa 100644 --- a/src/js/views/rebaseView.js +++ b/src/js/views/rebaseView.js @@ -13,6 +13,8 @@ require('jquery-ui/ui/data'); require('jquery-ui/ui/widgets/mouse'); require('jquery-ui/ui/ie'); require('jquery-ui/ui/widgets/sortable'); +require('jquery-ui/ui/plugin'); +require('jquery-ui/ui/widgets/draggable'); var InteractiveRebaseView = ContainedBase.extend({ tagName: 'div', From 7bc5bb0f6f4e0c1e9e6ef461d083ab411136489c Mon Sep 17 00:00:00 2001 From: Anh Hong Date: Fri, 24 Apr 2020 10:54:32 +0700 Subject: [PATCH 202/359] Add require module for `draggable` --- src/js/views/rebaseView.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/js/views/rebaseView.js b/src/js/views/rebaseView.js index 2d985ffa..3bd3a3c7 100644 --- a/src/js/views/rebaseView.js +++ b/src/js/views/rebaseView.js @@ -14,6 +14,8 @@ require('jquery-ui/ui/widgets/mouse'); require('jquery-ui/ui/ie'); require('jquery-ui/ui/widgets/sortable'); require('jquery-ui/ui/plugin'); +require('jquery-ui/ui/safe-active-element'); +require('jquery-ui/ui/safe-blur'); require('jquery-ui/ui/widgets/draggable'); var InteractiveRebaseView = ContainedBase.extend({ From 1ac4ca93a7f34999c20aaa975a541c0a45d89a7f Mon Sep 17 00:00:00 2001 From: Matic Trebusak Date: Fri, 24 Apr 2020 11:44:27 +0200 Subject: [PATCH 203/359] Added Slovenian translations --- src/js/dialogs/confirmShowSolution.js | 10 + src/js/dialogs/levelBuilder.js | 21 +- src/js/dialogs/nextLevel.js | 11 + src/js/dialogs/sandbox.js | 25 ++- src/js/intl/strings.js | 274 +++++++++++++++-------- src/js/react_views/IntlHelperBarView.jsx | 9 +- src/js/stores/LocaleStore.js | 8 +- src/levels/advanced/multipleParents.js | 93 +++++++- src/levels/index.js | 42 ++-- src/levels/intro/branching.js | 86 ++++++- src/levels/intro/commits.js | 48 +++- src/levels/intro/merging.js | 75 ++++++- src/levels/intro/rebasing.js | 72 +++++- src/levels/mixed/describe.js | 69 +++++- src/levels/mixed/grabbingOneCommit.js | 45 +++- src/levels/mixed/jugglingCommits.js | 40 +++- src/levels/mixed/jugglingCommits2.js | 49 +++- src/levels/mixed/tags.js | 58 ++++- src/levels/rampup/cherryPick.js | 63 +++++- src/levels/rampup/detachedHead.js | 84 ++++++- src/levels/rampup/interactiveRebase.js | 69 +++++- src/levels/rampup/relativeRefs.js | 81 ++++++- src/levels/rampup/relativeRefs2.js | 74 +++++- src/levels/rampup/reversingChanges.js | 66 +++++- src/levels/rebase/manyRebases.js | 23 +- src/levels/rebase/selectiveRebase.js | 27 ++- src/levels/remote/clone.js | 63 +++++- src/levels/remote/fakeTeamwork.js | 60 ++++- src/levels/remote/fetch.js | 79 ++++++- src/levels/remote/fetchArgs.js | 129 ++++++++++- src/levels/remote/fetchRebase.js | 149 +++++++++++- src/levels/remote/lockedMaster.js | 46 +++- src/levels/remote/mergeManyFeatures.js | 51 ++++- src/levels/remote/pull.js | 63 +++++- src/levels/remote/pullArgs.js | 80 ++++++- src/levels/remote/push.js | 49 +++- src/levels/remote/pushArgs.js | 81 ++++++- src/levels/remote/pushArgs2.js | 76 ++++++- src/levels/remote/pushManyFeatures.js | 59 ++++- src/levels/remote/remoteBranches.js | 67 +++++- src/levels/remote/sourceNothing.js | 59 ++++- src/levels/remote/tracking.js | 124 +++++++++- 42 files changed, 2581 insertions(+), 176 deletions(-) diff --git a/src/js/dialogs/confirmShowSolution.js b/src/js/dialogs/confirmShowSolution.js index f101e73f..5ed3d7b3 100644 --- a/src/js/dialogs/confirmShowSolution.js +++ b/src/js/dialogs/confirmShowSolution.js @@ -134,6 +134,16 @@ exports.dialog = { 'Tôi tin ở bạn! Bạn có thể làm được!' ] } + }], + 'sl_SI': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## Si prepričan, da hočeš videti rešitev?', + '', + 'Verjamem vate! Maš ti to' + ] + } }] }; diff --git a/src/js/dialogs/levelBuilder.js b/src/js/dialogs/levelBuilder.js index 26f41c05..c59ddd4d 100644 --- a/src/js/dialogs/levelBuilder.js +++ b/src/js/dialogs/levelBuilder.js @@ -266,5 +266,24 @@ exports.dialog = { ' * Nhập lệnh ```finish``` xuất cấp độ của bạn dưới dạng JSON!' ] } - }] + }], + 'sl_SI': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## Dobrodošel v graditelju stopenj!', + '', + 'Tu so glavni koraki:', + '', + ' * Postavi začetno stanje z git ukazi', + ' * Določi začetno drevo z ```define start```', + ' * Vnesi zaporedje ukazov, ki predstavljajo (najboljšo) rešitev', + ' * Določi ciljno drevo z ```define goal```. Določanje cilja določi tudi rešitev', + ' * Opcijsko določi namig z ```define hint```', + ' * Uredi ime z ```define name```', + ' * Opcijsko določi ličen začetni dialog z ```edit dialog```', + ' * Vnesi ukaz ```finish``` za ustvarjanje JSON različice tvoje stopnje!' + ] + } + }], }; diff --git a/src/js/dialogs/nextLevel.js b/src/js/dialogs/nextLevel.js index 65737044..bd96295e 100644 --- a/src/js/dialogs/nextLevel.js +++ b/src/js/dialogs/nextLevel.js @@ -154,5 +154,16 @@ exports.dialog = { 'Đáp án của chúng tôi sử dụng {best}.' ] } + }], + 'sl_SI': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## Dobro opravljeno!!', + '', + 'Rešil si stopnjo z *{numCommands}* ukazi; ', + 'naša rešitev uporabi {best}.' + ] + } }] }; diff --git a/src/js/dialogs/sandbox.js b/src/js/dialogs/sandbox.js index 04c42957..c84ed2ba 100644 --- a/src/js/dialogs/sandbox.js +++ b/src/js/dialogs/sandbox.js @@ -635,5 +635,28 @@ exports.dialog = { '[đường link đặc biệt này của chúng tôi](https://pcottle.github.io/learnGitBranching/?NODEMO)' ] } - }] + }], + 'sl_SI': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## Dobrodošel na učenju Git Branchanja', + '', + 'Bi se rad naučil Git? No, prišel si na pravo mesto! ', + '"Learn Git Branching" je najbolj vizualen in interaktiven način učenja Git-a ', + 'na spletu; zagrizel boš v zanimive stopnje, po korakih boš spoznaval osupljive ', + 'funkcije in kaj pa veš, morda ti bo celo zabavno. ;)', + '', + 'Za tem oknom boš videl kopico stopenj, ki so na razpolago. Če si ', + 'začetnik, kar pogumno, začni s prvo. Če pa že poznaš Git osnove, ', + 'se preizkusi v zahtevnejših stopnjah.', + '', + 'Vidiš lahko vse ukaze, ki so na voljo, z ukazom `show commands` v terminalu.', + '', + 'PS: Bi rad šel naslednjič naravnost v peskovnik?', + 'Poizkusi s', + '[to posebno povezavo](https://pcottle.github.io/learnGitBranching/?NODEMO)' + ] + } + }], }; diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js index 5e97cc93..0d46246a 100755 --- a/src/js/intl/strings.js +++ b/src/js/intl/strings.js @@ -15,7 +15,9 @@ exports.strings = { 'ru_RU': 'Вау! Вы прошли последний уровень, отлично!', 'uk': 'Вау! Ти пройшов останній рівень, круто!', 'ko': '와우! 마지막 레벨까지 마쳤습니다. 멋지네요!', - 'vi': 'Wao! Bạn đã phá đảo, quá tuyệt!' + 'vi': 'Wao! Bạn đã phá đảo, quá tuyệt!', + 'sl_SI': 'Wow! Končal si zadnjo stopnjo, fantastično!' + }, /////////////////////////////////////////////////////////////////////////// 'finish-dialog-next': { @@ -33,7 +35,8 @@ exports.strings = { 'ru_RU': 'Хотите перейти на следующий уровень: *"{nextLevel}"*?', 'uk': 'Хочеш перейти на наступний рівень -- *"{nextLevel}"*?', 'ko': '다음 레벨로 넘어갈까요? 레벨 *"{nextLevel}"*', - 'vi': 'Bạn có muốn chuyển sang cấp độ tiếp: *"{nextLevel}"* không?' + 'vi': 'Bạn có muốn chuyển sang cấp độ tiếp: *"{nextLevel}"* không?', + 'sl_SI': 'Bi rad nadaljeval na *"{nextLevel}"*, naslednjo stopnjo?' }, /////////////////////////////////////////////////////////////////////////// 'finish-dialog-win': { @@ -51,7 +54,8 @@ exports.strings = { 'ru_RU': 'Отлично! Ваше решение соответствует или превосходит наше.', 'uk': 'Чудово! Твій розв’язок на рівні або кращий від нашого.', 'ko': '멋져요! 우리의 해답과 일치하거나 우리보다 좀 더 나은 해답입니다.', - 'vi': 'Tuyệt vời! Đáp án của bạn đạt chuẩn thâm chí có thể tốt hơn.' + 'vi': 'Tuyệt vời! Đáp án của bạn đạt chuẩn thâm chí có thể tốt hơn.', + 'sl_SI': 'Bravo! Izenačil ali celo presegel si našo rešitev.' }, /////////////////////////////////////////////////////////////////////////// 'finish-dialog-lose': { @@ -69,7 +73,8 @@ exports.strings = { 'ru_RU': 'Попробуйте, может вы сможете уложиться в {best} : D', 'uk': 'Спробуй, можливо ти зможеш вкластися в {best} кроків :D', 'ko': '{best}회로 줄일 수 있다면 해보세요. :D', - 'vi': 'Thử xem bạn có thể giảm xuống {best} không? :D' + 'vi': 'Thử xem bạn có thể giảm xuống {best} không? :D', + 'sl_SI': 'Misliš da lahko spraviš rešitev na {best}? :D' }, /////////////////////////////////////////////////////////////////////////// 'hg-prune-tree': { @@ -86,7 +91,8 @@ exports.strings = { 'ru_RU': 'Внимание! Mercurial использует агрессивный сборщик мусора и обрезает ваше дерево', 'uk': 'Увага! Mercurial агресивно збирає сміття й може обрізати твоє дерево ', 'ko': '주의! Mercurial은 공격적으로 가비지 컬렉션을 수행하므로 트리를 정리할 필요가 있습니다.', - 'vi': 'Cảnh báo! Mercurial cần thực hiện thu gom rác và thu nhỏ cây lịch sử của bạn.' + 'vi': 'Cảnh báo! Mercurial cần thực hiện thu gom rác và thu nhỏ cây lịch sử của bạn.', + 'sl_SI': 'Opozorilo! Mercurial ima agresivno politiko garbage collectiona in bo obrezal vaše drevo' }, /////////////////////////////////////////////////////////////////////////// 'hg-a-option': { @@ -103,7 +109,8 @@ exports.strings = { 'ru_RU': 'Опция -A не требуется для этого приложения, просто сделайте коммит.', 'uk': 'Опція -A не потрібна для цього застосунку, можна просто комітити!', 'ko': '이 앱에선 -A 옵션은 필요 없습니다. 그냥 커밋하세요!', - 'vi': 'Không cần thiết phải dùng tùy chọn -A trên ứng dụng này, cứ commit là được!' + 'vi': 'Không cần thiết phải dùng tùy chọn -A trên ứng dụng này, cứ commit là được!', + 'sl_SI': 'Opcija -A ni potrebna za to aplikacijo, samo commitaj!' }, /////////////////////////////////////////////////////////////////////////// 'hg-error-no-status': { @@ -120,7 +127,8 @@ exports.strings = { 'ru_RU': 'Команда status не поддерживается в этом приложении, так как здесь нет файлов. Попробуйте выполнить hg summary', 'uk': 'Команда status не підтримується в цьому застосунку, так як немає стейджингу(staging) файлів. Натомість спробуй hg summary ', 'ko': '이 앱을 위한 상태 명령어는 없습니다. 왜냐하면 파일들의 스테이징이 없기 때문입니다. 대신 hg summary를 시도해보세요.', - 'vi': 'Ứng dụng này không hỗ trợ lệnh `status` vì không có tệp nhớ đệm, thay vì đó hãy dùng lệnh `hg summary`' + 'vi': 'Ứng dụng này không hỗ trợ lệnh `status` vì không có tệp nhớ đệm, thay vì đó hãy dùng lệnh `hg summary`', + 'sl_SI': 'Za to aplikacijo ni na voljo `status` ukaza, ker tu ni `stage-anja` datotek. Poizkusiš lahko `hg summary`' }, /////////////////////////////////////////////////////////////////////////// 'hg-error-need-option': { @@ -137,7 +145,8 @@ exports.strings = { 'ru_RU': 'Для этой команды требуется опция {option}', 'uk': 'Для цієї команди потрібна опція {option}', 'ko': '나는 그 명령어를 위한 {option} 옵션이 필요합니다.', - 'vi': 'Câu lệnh đó cần tùy chọn {option}!' + 'vi': 'Câu lệnh đó cần tùy chọn {option}!', + 'sl_SI': 'Potrebujem opcijo {option} za ta ukaz!' }, /////////////////////////////////////////////////////////////////////////// 'hg-error-log-no-follow': { @@ -154,7 +163,8 @@ exports.strings = { 'ru_RU': 'hg log без опции -f в настоящий момент не поддерживается, используйте -f', 'uk': 'hg log без опції -f в данний момент не підтримується, використовуй -f', 'ko': '-f가 없는 hg log는 현재 지원되지 않습니다. -f를 사용하세요.', - 'vi': 'Hiện tại thì `hg log` mà không có tùy chọn -f chưa được hỗ trợ, hãy viết thêm -f.' + 'vi': 'Hiện tại thì `hg log` mà không có tùy chọn -f chưa được hỗ trợ, hãy viết thêm -f.', + 'sl_SI': 'hg log brez -f trenutno ni podprt, uporabi -f' }, /////////////////////////////////////////////////////////////////////////// 'git-status-detached': { @@ -171,7 +181,8 @@ exports.strings = { 'ru_RU': 'Отделенный HEAD', 'uk': 'Відокремлений HEAD', 'ko': '분리된 HEAD!', - 'vi': 'HEAD bị tách biệt!' + 'vi': 'HEAD bị tách biệt!', + 'sl_SI': 'Detached head!' }, /////////////////////////////////////////////////////////////////////////// 'git-status-onbranch': { @@ -188,7 +199,8 @@ exports.strings = { 'ru_RU': 'В ветке {branch}', 'uk': 'В гілці {branch}', 'ko': '분기 지점 {branch}에서', - 'vi': 'Đang trên nhánh {branch}' + 'vi': 'Đang trên nhánh {branch}', + 'sl_SI': 'Na branchu {branch}' }, /////////////////////////////////////////////////////////////////////////// 'git-status-readytocommit': { @@ -205,7 +217,8 @@ exports.strings = { 'ru_RU': 'Готово к коммиту! (как и всегда в этом демо)', 'uk': 'Готово до коміту! (як завжди в цьому демо)', 'ko': '커밋을 준비하세요! (이 데모에서는 항상)', - 'vi': 'Sẵn sàng để commit! (khi demo thì luôn có thể commit)' + 'vi': 'Sẵn sàng để commit! (khi demo thì luôn có thể commit)', + 'sl_SI': 'Pripravljen za commit! (kot vedno v tem demotu)' }, /////////////////////////////////////////////////////////////////////////// 'git-dummy-msg': { @@ -223,7 +236,8 @@ exports.strings = { 'ru_RU': 'Быстрый коммит. А надо!', 'uk': 'Швидкий коміт. Динамо!', 'ko': '빨리 커밋하세요!', - 'vi': 'Commit luôn đi cho nóng!' + 'vi': 'Commit luôn đi cho nóng!', + 'sl_SI': 'Hiter commit.' }, 'git-error-origin-fetch-uptodate': { '__desc__': 'One of the error messages for git', @@ -239,7 +253,8 @@ exports.strings = { 'ru_RU': 'Уже обновлено!', 'uk': 'Вже оновлено!', 'ko': '이미 최신 상태입니다!', - 'vi': 'Cập nhật mới nhất rồi!' + 'vi': 'Cập nhật mới nhất rồi!', + 'sl_SI': 'Že posodobljeno!' }, 'git-error-origin-fetch-no-ff': { '__desc__': 'One of the error messages for git', @@ -255,7 +270,8 @@ exports.strings = { 'ru_RU': 'Ваша origin ветка не синхронизирована с удаленной веткой, невозможно выполнить fetch', 'uk': 'Твоя гілка origin не синхронізована з віддаленою гілкою, неможливо виконати fetch', 'ko': '당신의 오리진 브랜치가 원격 브랜치와 동기화되지 않았고, 패치를 실행할 수 없습니다.', - 'vi': 'Nhánh của bạn không đồng bộ với nhánh remote nên lệnh fetch không thực thi được.' + 'vi': 'Nhánh của bạn không đồng bộ với nhánh remote nên lệnh fetch không thực thi được.', + 'sl_SI': 'Tvoj origin branch ni sinhroniziran z oddaljenim branchem, zato se fetch se ne more izvesti' }, 'git-error-origin-push-no-ff': { '__desc__': 'One of the error messages for git', @@ -271,7 +287,8 @@ exports.strings = { 'ru_RU': 'Удаленный репозиторий разошелся с вашим локальным репозиторием, поэтому выгрузка ваших изменений не может быть в режиме fast forward (и следовательно ваш push будет отклонён). Пожалуйста, удалите изменения в удаленном репозитории которые, объедините их в эту ветку и попробуйте еще раз. Вы можете сделать это с помощью git pull или git pull --rebase', 'uk': 'Віддалений репозиторій розбігся з твоїм локальним репозиторієм, тому відвантаження твоїх змін не є простим fast forward (і тому твій push був відхилений). Будь-ласка, витягни зміни з віддаленого репозиторію, включи їх в цю гілку, й спробуй ще. Ти можеш зробити це за допомогою git pull чи git pull --rebase', 'ko': '원격 레포지토리가 당신의 로컬 레포지토리에서 분기하므로, 변경 사항을 업데이트 하는것은 간단한 fast forward가 아닙니다(따라서 push가 거절될 것입니다.). 원격 레포지토리에서의 변경 사항을 내려 받아 이 브랜치에 합치고, 이를 반복하세요. 당신은 git pull 또는 git pull --rebase를 사용해 이를 수행할 수 있습니다.', - 'vi': 'Kho chứa từ xa có sự khác biệt với kho chứa cục bộ của bạn, nên không thể tự động (fast forward) cập nhật thay đổi của bạn (và vì thế hoạt động push của bạn bị từ chối). Vui lòng kéo về thay đổi từ kho chứa từ xa, kết nạp vào nhánh hiện tại, và thử lại lần nữa. Bạn có thể dùng lệnh `git pull` hoặc `git pull --rebase`' + 'vi': 'Kho chứa từ xa có sự khác biệt với kho chứa cục bộ của bạn, nên không thể tự động (fast forward) cập nhật thay đổi của bạn (và vì thế hoạt động push của bạn bị từ chối). Vui lòng kéo về thay đổi từ kho chứa từ xa, kết nạp vào nhánh hiện tại, và thử lại lần nữa. Bạn có thể dùng lệnh `git pull` hoặc `git pull --rebase`', + 'sl_SI': 'Oddaljen repozitorij se je ločil od tvojega lokalnega repozitorija, zato nalaganje sprememb ni možno z `fast forward` opcijo (zato je bil `push` zavrnjen). Prosim pull-aj dol nove spremembe iz oddaljenega repozitorija, jih vključi v svoj branch, nato pa poizkusi ponovno. To lahko narediš z `git pull` ali `git pull --rebase`' }, 'git-error-remote-branch': { '__desc__': 'One of the error messages for git', @@ -287,7 +304,8 @@ exports.strings = { 'ru_RU': 'Вы не можете выполнить эту команду на удаленной ветке', 'uk': 'Ти не можеш виконати цю команду на віддаленій гілці', 'ko': '당신은 원격 브랜치에서 그 명령어를 실행시킬 수 없습니다.', - 'vi': 'Bạn không thể thực thi lệnh đó lên nhánh từ xa.' + 'vi': 'Bạn không thể thực thi lệnh đó lên nhánh từ xa.', + 'sl_SI': 'Tega ukaza ne moreš narediti na oddaljenem branchu' }, 'git-error-origin-required': { '__desc__': 'One of the error messages for git', @@ -303,7 +321,8 @@ exports.strings = { 'ru_RU': 'Origin требуется для этой команды', 'uk': 'Для цієї команди потрібний origin', 'ko': '그 명령어를 위한 오리진이 필요합니다.', - 'vi': 'Lệnh đó yêu cầu có origin.' + 'vi': 'Lệnh đó yêu cầu có origin.', + 'sl_SI': 'Origin je potreben za izvedbo tega ukaza' }, 'git-error-origin-exists': { '__desc__': 'One of the error messages for git', @@ -319,7 +338,8 @@ exports.strings = { 'ru_RU': 'Origin уже существует! Невозможно создать еще один', 'uk': 'Origin вже існує! Неможливо створити ще один', 'ko': '오리진이 이미 존재합니다! 당신은 새로 만들 수 없습니다.', - 'vi': 'Nguyên bản (origin) đã tồn tại. Bạn không thể tạo thêm 1 cái mới' + 'vi': 'Nguyên bản (origin) đã tồn tại. Bạn không thể tạo thêm 1 cái mới', + 'sl_SI': 'Origin že obstaja. Ne moreš narediti novega.' }, /////////////////////////////////////////////////////////////////////////// 'git-error-branch': { @@ -337,7 +357,8 @@ exports.strings = { 'ru_RU' : 'Невозможно удалить ветку master, ветку на которой вы сейчас и то что не является веткой', 'uk': 'Неможливо видалити гілку master, гілку на якій ти зараз знаходишся чи штуки які не є гілкою', 'ko': '당신은 마스터 브랜치, 당신이 현재 사용중인 브랜치, 또는 브랜치가 아닌 것들을 삭제할 수 없습니다.', - 'vi': 'Bạn không thể xóa nhánh master, nhánh mà bạn đang tham chiếu tới, hoặc những gì không phải nhánh.' + 'vi': 'Bạn không thể xóa nhánh master, nhánh mà bạn đang tham chiếu tới, hoặc những gì không phải nhánh.', + 'sl_SI': 'Ne moreš izbrisati master brancha, brancha na katerem si trenutno ali stvari, ki niso branchi' }, /////////////////////////////////////////////////////////////////////////// 'git-merge-msg': { @@ -354,7 +375,8 @@ exports.strings = { 'ru_RU': 'Слияние {target} в {current}', 'uk': 'Злиття {target} в {current}', 'ko': '{target}을 {current}에 병합하세요.', - 'vi': 'Gộp {target} vào {current}.' + 'vi': 'Gộp {target} vào {current}.', + 'sl_SI': 'Mergaj {target} v {current}' }, /////////////////////////////////////////////////////////////////////////// 'git-error-rebase-none': { @@ -371,7 +393,8 @@ exports.strings = { 'ru_RU': 'Нет коммитов для rebase! Все в коммите слияния или изменения уже применены', 'uk': 'Нема комітів для rebase! Все в коміті злиття (merge commit) чи зміни вже застосовані', 'ko': 'rebase를 하기 위한 커밋이 없습니다! 모든 커밋과 변경 사항들의 병합은 이미 적용되었습니다.', - 'vi': 'Không có commit nào để rebase. Mọi thứ là merge commit hoặc thay đổi đã được áp dụng.' + 'vi': 'Không có commit nào để rebase. Mọi thứ là merge commit hoặc thay đổi đã được áp dụng.', + 'sl_SI': 'Ni commitov za rebase! Vse je merge commit ali pa so spremembe že dodane' }, /////////////////////////////////////////////////////////////////////////// 'git-result-nothing': { @@ -388,7 +411,8 @@ exports.strings = { 'ru_RU': 'Нечего выполнять...', 'uk': 'Нічого виконувати...', 'ko': '할게 없습니다 ...', - 'vi': 'Không có gì để làm ...' + 'vi': 'Không có gì để làm ...', + 'sl_SI': 'Ničesar za narediti ...' }, /////////////////////////////////////////////////////////////////////////// 'git-result-fastforward': { @@ -405,7 +429,8 @@ exports.strings = { 'ru_RU': 'Выполняю Fast forward...', 'uk': 'Виконую Fast forward', 'ko': 'Fast forward 중입니다...', - 'vi': 'Đang fast forward...' + 'vi': 'Đang fast forward...', + 'sl_SI': 'Fast forwardiranje' }, /////////////////////////////////////////////////////////////////////////// 'git-result-uptodate': { @@ -422,7 +447,8 @@ exports.strings = { 'ru_RU': 'Ветка уже обновлена', 'uk': 'Гілку вже оновлено', 'ko': '브랜치가 이미 최신 상태입니다.', - 'vi': 'Nhánh đã được cập nhật mới nhất.' + 'vi': 'Nhánh đã được cập nhật mới nhất.', + 'sl_SI': 'Branch je že posodobljen' }, /////////////////////////////////////////////////////////////////////////// 'git-error-exist': { @@ -439,7 +465,8 @@ exports.strings = { 'ru_RU': 'Ссылка {ref} не существует или неизвестна', 'uk': 'Посилання {ref} не існує чи невідоме', 'ko': '{ref} 참조가 존재하지 않거나 알 수 없습니다.', - 'vi': 'Tham chiếu {ref} không tồn tại hoặc không thể tìm thấy.' + 'vi': 'Tham chiếu {ref} không tồn tại hoặc không thể tìm thấy.', + 'sl_SI': 'Ref {ref} new obstaja ali je neznan' }, /////////////////////////////////////////////////////////////////////////// 'git-error-relative-ref': { @@ -456,7 +483,8 @@ exports.strings = { 'ru_RU': 'Коммит {commit} не содержит {match}', 'uk': 'Коміт {commit} не містить {match}', 'ko': '커밋 {commit}은 {match}를 가지고 있지 않습니다.', - 'vi': 'Commit {commit} mà không có {match}.' + 'vi': 'Commit {commit} mà không có {match}.', + 'sl_SI': 'Commit {commit} nima {match}' }, /////////////////////////////////////////////////////////////////////////// 'git-warning-detached': { @@ -473,7 +501,8 @@ exports.strings = { 'ru_RU': 'Внимание! Репозиторий в состоянии detached HEAD, то есть не находится ни на какой ветке!', 'uk': 'Увага! Репозиторій в стані detached HEAD, тобто не знаходиться в жодній гілці!', 'ko': '주의! 분리된 HEAD 상태', - 'vi': 'Cảnh báo! HEAD bị tách rời' + 'vi': 'Cảnh báo! HEAD bị tách rời', + 'sl_SI': 'Opozorilo! Detached HEAD stanje' }, /////////////////////////////////////////////////////////////////////////// 'git-warning-add': { @@ -490,7 +519,8 @@ exports.strings = { 'ru_RU': 'Это демо не оперирует файлами', 'uk': 'Не потрібно додавати файли для цього демо', 'ko': '이 데모에서는 파일을 추가할 필요가 없습니다.', - 'vi': 'Không cần thêm tập tin trong bản giới thiệu này.' + 'vi': 'Không cần thêm tập tin trong bản giới thiệu này.', + 'sl_SI': 'Ni potrebe po dodajanju datotetk v tem demotu' }, /////////////////////////////////////////////////////////////////////////// 'git-error-options': { @@ -507,7 +537,8 @@ exports.strings = { 'ru_RU': 'Неправильные опции', 'uk': 'Опції, які ти ввів, або некорректні або не підтримуються', 'ko': '당신이 지정한 그 옵션들은 호환되지 않거나 올바르지 않습니다.', - 'vi': 'Các tham số bạn chỉ định không tương thích hoặc không chính xác.' + 'vi': 'Các tham số bạn chỉ định không tương thích hoặc không chính xác.', + 'sl_SI': 'Opcije, ki si jih podal, so nezdružljive ali napačne' }, /////////////////////////////////////////////////////////////////////////// 'git-error-already-exists': { @@ -524,7 +555,8 @@ exports.strings = { 'ru_RU': 'Коммит {commit} существует, отменяю!', 'uk': 'Коміт {commit} вже існує в твоєму change set, відміна!', 'ko': '커밋 {commit}은 이미 당신의 변경 내역에 존재합니다. 중단!', - 'vi': 'Commit {commit} đã tồn tại trong những thay đổi của bạn. Đang hủy!' + 'vi': 'Commit {commit} đã tồn tại trong những thay đổi của bạn. Đang hủy!', + 'sl_SI': 'Commit {commit} že obstaja v tvoji množici sprememb, prekinjam!' }, /////////////////////////////////////////////////////////////////////////// 'git-error-reset-detached': { @@ -541,7 +573,8 @@ exports.strings = { 'ru_RU': 'Это невозможно в режиме detached HEAD! Используйте checkout!', 'uk': 'Неможливо зробити reset в стані detached head! Використовуй checkout якщо хочеш змінити розташування', 'ko': '분리된 HEAD에서 reset할 수 없습니다. 만약 이동시키기를 원한다면 checkout을 사용하세요.', - 'vi': 'Trong trạng thái tách rời `HEAD` thì không thể `reset`. Dùng `checkout` nếu bạn muốn di chuyển.' + 'vi': 'Trong trạng thái tách rời `HEAD` thì không thể `reset`. Dùng `checkout` nếu bạn muốn di chuyển.', + 'sl_SI': 'Ni možno resetat, zaradi detached HEADa' }, /////////////////////////////////////////////////////////////////////////// 'git-warning-hard': { @@ -565,7 +598,8 @@ exports.strings = { 'ko': 'LearnGitBranching에서 reset의 기본 설정은 옵션은 --hard입니다. 우리 레슨에서는 이 옵션을 생략해도 됩니다. 다만 실제 Git의 기본 설정 옵션은 --mixed라는것만 기억하세요.', 'vi': 'Trạng thái mặc định cho lệnh `reset` của \"Học nhánh Git\" là `--hard`.' + ' Nên khi làm bài nếu bạn thấy gõ tham số này hơi tốn công thì cứ bỏ qua.' + - ' Nhưng mà hãy nhớ rằng thực tế thì `--mixed` mới là trạng thái mặc định của `reset`.' + ' Nhưng mà hãy nhớ rằng thực tế thì `--mixed` mới là trạng thái mặc định của `reset`.', + 'sl_SI': 'Privzeto delovanje za reset na LearnGitBranching je --hard, zato lahko to izpustiš. Na pravem gitu je --mixed.' }, /////////////////////////////////////////////////////////////////////////// 'git-error-staging': { @@ -583,7 +617,8 @@ exports.strings = { 'ru_RU': 'Это демо не работает с файлами, так что git add не нужен!', 'uk': 'В цьому демо немає можливості додати файл до робочої копії чи до стейджингу, тому ця опція чи команда некоректна чи не підтримується', 'ko': '여기엔 파일을 추가하거나 스테이징한다는 개념이 없습니다. 따라서 그 옵션 또는 명령어는 유효하지 않습니다.', - 'vi': 'Không có khái nệm thêm tập tin đệm(staging file), nên tùy chọn đó là bất hợp lệ.' + 'vi': 'Không có khái nệm thêm tập tin đệm(staging file), nên tùy chọn đó là bất hợp lệ.', + 'sl_SI': 'Tu ni možnosti addanja/stageanja datotek, zato je ta ukaz nepravilen' }, /////////////////////////////////////////////////////////////////////////// 'git-revert-msg': { @@ -600,7 +635,8 @@ exports.strings = { 'ru_RU': 'Откатываю {oldCommit}: {oldMsg}', 'uk': 'Повертаю {oldCommit}: {oldMsg}', 'ko': '{oldCommit}:{oldMsg}를 복구중입니다.', - 'vi': 'Hoàn tác {oldCommit}:{oldMsg}.' + 'vi': 'Hoàn tác {oldCommit}:{oldMsg}.', + 'sl_SI': 'Revertanje {oldCommit}: {oldMsg}' }, /////////////////////////////////////////////////////////////////////////// 'git-error-args-many': { @@ -617,7 +653,8 @@ exports.strings = { 'ru_RU': 'Ожидается максимум {upper} аргумент(ов) для {what}', 'uk': 'Я очікую максимум {upper} аргумент(ів) для {what}', 'ko': '{what}을 위해 최대 {upper}개의 인자를 받습니다.', - 'vi': 'Có thể có nhiều nhất {upper} tham số cho {what}.' + 'vi': 'Có thể có nhiều nhất {upper} tham số cho {what}.', + 'sl_SI': 'Pričakovanih je največ {upper} argumentov za {what}' }, /////////////////////////////////////////////////////////////////////////// 'git-error-args-few': { @@ -634,7 +671,8 @@ exports.strings = { 'ru_RU': 'Ожидается как минимум {lower} аргументов для {what}', 'uk': 'Я очікую як мінімум {lower} аргумент(ів) для {what}', 'ko': '{what}을 위해 최소 {lower}개의 인자를 받습니다.', - 'vi': 'Cần ít nhất {lower} tham số cho {what}.' + 'vi': 'Cần ít nhất {lower} tham số cho {what}.', + 'sl_SI': 'Pričakovanih je najmanj {lower} argumentov za {what}' }, /////////////////////////////////////////////////////////////////////////// 'git-error-no-general-args': { @@ -651,7 +689,8 @@ exports.strings = { 'ru_RU': 'Это команда без аргументов', 'uk': 'Ця команда не приймає загальних аргументів', 'ko': '그 명령어는 일반적으로 인자를 받지 않습니다.', - 'vi': 'Lệnh đó không chấp nhận các tham số chung.' + 'vi': 'Lệnh đó không chấp nhận các tham số chung.', + 'sl_SI': 'Ta ukaz ne sprejme splošnih ukazov' }, /////////////////////////////////////////////////////////////////////////// 'copy-tree-string': { @@ -668,7 +707,8 @@ exports.strings = { 'ru_RU': 'Скопируй текст ниже', 'uk': 'Скопіюй рядок дерева нижче', 'ko': '다음 트리 문자열을 복사하세요.', - 'vi': 'Sao chép chuỗi cây bên dưới.' + 'vi': 'Sao chép chuỗi cây bên dưới.', + 'sl_SI': 'Skopiraj besedilo drevesa spodaj' }, /////////////////////////////////////////////////////////////////////////// 'learn-git-branching': { @@ -686,7 +726,8 @@ exports.strings = { 'ru_RU': 'Изучаем ветвление в git', 'uk': 'Learn Git Branching', 'ko': '깃 브랜칭을 배워봅시다.', - 'vi': 'Học nhánh Git.' + 'vi': 'Học nhánh Git.', + 'sl_SI': 'Nauči se Git Branching' }, /////////////////////////////////////////////////////////////////////////// 'select-a-level': { @@ -703,7 +744,8 @@ exports.strings = { 'ru_RU': 'Выбери уровень', 'uk': 'Обери рівень', 'ko': '레벨을 선택하세요.', - 'vi': 'Chọn một cấp độ.' + 'vi': 'Chọn một cấp độ.', + 'sl_SI': 'Izberi stopnjo' }, /////////////////////////////////////////////////////////////////////////// 'main-levels-tab': { @@ -717,7 +759,8 @@ exports.strings = { 'ru_RU': 'Основы', 'uk' : 'Основи', 'ko': '메인', - 'vi': 'Bài học chính' + 'vi': 'Bài học chính', + 'sl_SI': 'Glavno' }, /////////////////////////////////////////////////////////////////////////// 'remote-levels-tab': { @@ -731,7 +774,8 @@ exports.strings = { 'ru_RU': 'Удаленные репозитории', 'uk' : 'Віддалені репозиторії', 'ko' : '원격', - 'vi' : 'Bài học về thao tác từ xa' + 'vi' : 'Bài học về thao tác từ xa', + 'sl_SI': 'Oddaljeno' }, /////////////////////////////////////////////////////////////////////////// 'branch-name-short': { @@ -748,7 +792,8 @@ exports.strings = { 'ru_RU': 'Для наглядности нам нужно сохранять имена веток короткими. Твоё название сокращено до 9 символов и теперь это "{branch}"', 'uk': 'Вибач, нам потрібно щоб ім’я гілок було як можна коротше для наглядності. Твоє ім’я гілки було скорочене до 9 літер й тепер це "{branch}"', 'ko': '미안하지만, 우리는 시각적으로 더 좋게 보기위해 짧은 브랜치명이 필요합니다. 당신의 브랜치명은 9자리로 잘라 "{branch}"로 만들었습니다.', - 'vi': 'Xin lỗi, chúng tôi cần giữ tên nhánh ngắn để tiện minh họa. Tên nhánh của bạn đã bị cắt xuống 9 ký tự là "{branch}".' + 'vi': 'Xin lỗi, chúng tôi cần giữ tên nhánh ngắn để tiện minh họa. Tên nhánh của bạn đã bị cắt xuống 9 ký tự là "{branch}".', + 'sl_SI': 'Oprosti, imena branchev moramo obdržati kratka zaradi vizualizacije. Tvoje ime brancha je bilo skrajšano na 9 črk, kar predstavlja "{branch}"' }, /////////////////////////////////////////////////////////////////////////// 'bad-branch-name': { @@ -765,7 +810,8 @@ exports.strings = { 'ru_RU': 'Название для ветки "{branch}" недопустимо!', 'uk': 'Назва гілки "{branch}" є недопустимою', 'ko': '"{branch}"라는 브랜치명은 사용할 수 없습니다.', - 'vi': 'Tên nhánh "{branch}" không được chấp nhận.' + 'vi': 'Tên nhánh "{branch}" không được chấp nhận.', + 'sl_SI': 'To ime brancha "{branch}" ni dovoljeno!' }, /////////////////////////////////////////////////////////////////////////// 'bad-tag-name': { @@ -782,7 +828,8 @@ exports.strings = { 'ru_RU': 'Название для тега "{tag}" недопустимо!', 'uk': 'Назва тегу "{tag}" є недопустимою', 'ko': '"{tag}"라는 태그명은 사용할 수 없습니다.', - 'vi': 'Tên thẻ "{tag}" không được chấp nhận.' + 'vi': 'Tên thẻ "{tag}" không được chấp nhận.', + 'sl_SI': 'To ime tag-a "{tag}" ni dovoljeno!' }, /////////////////////////////////////////////////////////////////////////// 'option-not-supported': { @@ -799,7 +846,8 @@ exports.strings = { 'ru_RU': 'Опция "{option}" недопустима!', 'uk': 'Опція "{option}" не підтримується!', 'ko': '"{option}"(이)라는 옵션은 지원하지 않습니다.', - 'vi': 'Tùy chọn "{option}" không được hỗ trợ.' + 'vi': 'Tùy chọn "{option}" không được hỗ trợ.', + 'sl_SI': 'Opcija "{option}" ni podprta! ' }, /////////////////////////////////////////////////////////////////////////// 'git-usage-command': { @@ -816,7 +864,8 @@ exports.strings = { 'ru_RU': 'git <команда> [<аргументы>]', 'uk': 'git <команда> [<аргументи>]', 'ko': 'git <명령어> [<인자들>]', - 'vi': 'git []' + 'vi': 'git []', + 'sl_SI': 'git []' }, /////////////////////////////////////////////////////////////////////////// 'git-supported-commands': { @@ -833,7 +882,8 @@ exports.strings = { 'ru_RU': 'Поддерживаемые команды', 'uk': 'Допустимі команди', 'ko': '지원되는 명령어들:', - 'vi': 'Các lệnh được hỗ trợ:' + 'vi': 'Các lệnh được hỗ trợ:', + 'sl_SI': 'Podprti ukazi:' }, /////////////////////////////////////////////////////////////////////////// 'git-usage': { @@ -850,7 +900,8 @@ exports.strings = { 'ru_RU': 'Использование:', 'uk': 'Використання:', 'ko': '사용법', - 'vi': 'Cách dùng:' + 'vi': 'Cách dùng:', + 'sl_SI': 'Uporaba:' }, /////////////////////////////////////////////////////////////////////////// 'git-version': { @@ -867,7 +918,8 @@ exports.strings = { 'ru_RU': 'Версия git PCOTTLE.1.0', 'uk': 'Версія git PCOTTLE.1.0', 'ko': 'Git Version PCOTILE.1.0', - 'vi': 'Phiên bản Git TTC-Solutions.1.0' + 'vi': 'Phiên bản Git TTC-Solutions.1.0', + 'sl_SI': 'Git Verzija PCOTTLE.1.0' }, /////////////////////////////////////////////////////////////////////////// 'flip-tree-command': { @@ -883,7 +935,8 @@ exports.strings = { 'ru_RU': 'Переворачиваю дерево...', 'uk': 'Перевертаю дерево...', 'ko': '트리 뒤집는중...', - 'vi': 'Cây lật...' + 'vi': 'Cây lật...', + 'sl_SI': 'Obračanje drevesa ...' }, /////////////////////////////////////////////////////////////////////////// 'refresh-tree-command': { @@ -900,7 +953,8 @@ exports.strings = { 'ru_RU': 'Обновляю дерево...', 'uk': 'Оновлюю дерево...', 'ko': '트리 다시 불러오는중...', - 'vi': 'Làm mới cây...' + 'vi': 'Làm mới cây...', + 'sl_SI': 'Osveževanje drevesa ...' }, /////////////////////////////////////////////////////////////////////////// 'locale-command': { @@ -917,7 +971,8 @@ exports.strings = { 'ru_RU': 'Локаль теперь равна {locale}', 'uk': 'Локаль тепер дорівнює {locale}', 'ko': '로케일이 {locale}로 설정되었습니다.', - 'vi': 'Ngôn ngữ được thay đổi thành {locale}.' + 'vi': 'Ngôn ngữ được thay đổi thành {locale}.', + 'sl_SI': 'Locale nastavljen na {locale}' }, /////////////////////////////////////////////////////////////////////////// 'locale-reset-command': { @@ -934,7 +989,8 @@ exports.strings = { 'ru_RU': 'Локаль сброшена. Теперь она равна {locale}', 'uk': 'Локаль скинута. Тепер вона дорівнює {locale}', 'ko': '로케일이 {locale}로 초기화 되었습니다.', - 'vi': 'Ngôn ngữ được đổi thành mặc định: {locale}.' + 'vi': 'Ngôn ngữ được đổi thành mặc định: {locale}.', + 'sl_SI': 'Locale ponastavljen na {locale}' }, /////////////////////////////////////////////////////////////////////////// 'show-command': { @@ -951,7 +1007,8 @@ exports.strings = { 'ru_RU': 'Для получения большей информации используй следующие команды:', 'uk': 'Щоб отримати більше інформації використовуй наступні команди:', 'ko': '더 많은 정보를 위해 다음 명령어들중 하나를 사용하세요.', - 'vi': 'Vui lòng dùng một trong các lệnh sau để có thêm thông tin:.' + 'vi': 'Vui lòng dùng một trong các lệnh sau để có thêm thông tin:.', + 'sl_SI': 'Prosim uporabi enega od naslednjih ukazov' }, /////////////////////////////////////////////////////////////////////////// 'show-all-commands': { @@ -968,7 +1025,8 @@ exports.strings = { 'ru_RU': 'Вот все поддерживаемуе команды:', 'uk': 'Ось список всіх можливих команд:', 'ko': '여기에 사용 가능한 모든 명령어들의 리스트가 있습니다.', - 'vi': 'Dưới đây là danh sách tất cả các lệnh hiện hành:.' + 'vi': 'Dưới đây là danh sách tất cả các lệnh hiện hành:.', + 'sl_SI': 'Tu je seznam vseh možnih ukazov:' }, /////////////////////////////////////////////////////////////////////////// 'cd-command': { @@ -985,7 +1043,8 @@ exports.strings = { 'ru_RU': 'Директория изменена на "/директории/не/важны/в/этом/демо"', 'uk': 'Директорія змінена на "/директорії/не/мають/значення/в/цьому/демо"', 'ko': '디렉토리가 "/directories/dont/matter/in/this/demo"로 변경되었습니다.', - 'vi': 'Thay đổi thư mục thành "/directories/dont/matter/in/this/demo".' + 'vi': 'Thay đổi thư mục thành "/directories/dont/matter/in/this/demo".', + 'sl_SI': 'Mapa spremenjena na "/directories/dont/matter/in/this/demo"' }, /////////////////////////////////////////////////////////////////////////// 'ls-command': { @@ -1002,7 +1061,8 @@ exports.strings = { 'ru_RU': 'НеНадоЗаботитьсяОФайлахВЭтомДемо.txt', 'uk': 'ЗабийНаФайлиВЦьомуДемо.txt', 'ko': 'DontWorryAboutFilesInThisDemo.txt (이_데모에서_파일에_대한_걱정은_하지마세요.txt)', - 'vi': 'DontWorryAboutFilesInThisDemo.txt (ĐừngLoLắngVềTậpTinTrongBảnGiớiThiệuNày.txt)' + 'vi': 'DontWorryAboutFilesInThisDemo.txt (ĐừngLoLắngVềTậpTinTrongBảnGiớiThiệuNày.txt)', + 'sl_SI': 'DontWorryAboutFilesInThisDemo.txt' }, 'mobile-alert': { '__desc__': 'When someone comes to the site on a mobile device, they can not input commands so this is a nasty alert to tell them', @@ -1018,7 +1078,8 @@ exports.strings = { 'ru_RU': 'Мобильные не поддерживаются, зайди с компьютера!', 'uk': 'LGB не підтримує ввід тексту з мобільного, зайди з компьютера! Це цього варте!', 'ko': 'LGB는 모바일에서 입력을 받을 수 없습니다. 데스크톱으로 접속하세요! 이것은 가치가 있습니다. :D', - 'vi': 'Đáng tiếc là ứng dụng không thể nhận thông tin từ điện thoại hay máy tính bảng, hãy sử dụng máy tính cá nhân, đáng để bỏ công mà :D' + 'vi': 'Đáng tiếc là ứng dụng không thể nhận thông tin từ điện thoại hay máy tính bảng, hãy sử dụng máy tính cá nhân, đáng để bỏ công mà :D', + 'sl_SI': 'LGB ne more sprejeti ukazov na mobilni napravi, obiščite nas na računalinku! Je vredno :D ' }, /////////////////////////////////////////////////////////////////////////// 'share-tree': { @@ -1035,7 +1096,8 @@ exports.strings = { 'ru_RU': 'Поделись деревом с друзьями! Они могут загрузить его при помощи "import tree"', 'uk': 'Поділись цим деревом з друзями! Вони зможуть його завантажити за допомогою "import tree"', 'ko': '친구들과 이 트리를 공유하세요! 그들은 "import tree"를 사용해 이를 로드할 수 있습니다.', - 'vi': 'Hãy chia sẻ cây này với bạn của mình! Họ có thể dùng "import tree" để tải.' + 'vi': 'Hãy chia sẻ cây này với bạn của mình! Họ có thể dùng "import tree" để tải.', + 'sl_SI': 'Deli to drevo s prijatelji! Lahko ga naložijo z "import tree"' }, /////////////////////////////////////////////////////////////////////////// 'paste-json': { @@ -1052,7 +1114,8 @@ exports.strings = { 'ru_RU': 'Вставь JSON ниже!', 'uk': 'Встав JSON нижче!', 'ko': '아래에 JSON blob을 붙여넣으세요.', - 'vi': 'Dán một chuỗi JSON xuống bên dưới.' + 'vi': 'Dán một chuỗi JSON xuống bên dưới.', + 'sl_SI': 'Prilepi JSON kodo spodaj!' }, /////////////////////////////////////////////////////////////////////////// 'solved-map-reset': { @@ -1069,7 +1132,8 @@ exports.strings = { 'ru_RU': 'Всё сброшено! Можно начать с чистого листа!', 'uk': 'Все скинуте! Можна починати з чистого аркушу!', 'ko': '해결된 지도가 초기화 되었습니다. 당신은 깨끗한 상태에서 시작합니다.', - 'vi': 'Tất cả đáp án đã được xóa, bạn có thể bắt đầu lại từ đầu.' + 'vi': 'Tất cả đáp án đã được xóa, bạn có thể bắt đầu lại từ đầu.', + 'sl_SI': 'Rešena mapa je ponastavljena, začel boš lahko na novo!' }, /////////////////////////////////////////////////////////////////////////// 'level-cant-exit': { @@ -1086,7 +1150,8 @@ exports.strings = { 'ru_RU': 'Ты не проходишь уровень! Ты в песочнице! Чтобы начать уровень, используй команду "levels"!', 'uk': 'Ти не в рівні! Ти в пісочниці! Почни рівень з "levels"', 'ko': '당신은 샌드박스에 있습니다. "levels"를 사용하여 레벨을 시작하세요.', - 'vi': 'Bạn hiện không ở cấp độ nào cả! Hãy bắt đầu một cấp độ với "levels".' + 'vi': 'Bạn hiện không ở cấp độ nào cả! Hãy bắt đầu một cấp độ với "levels".', + 'sl_SI': 'Nisi v stopnji! Si v peskovniku, začni stopnjo z "levels"' }, /////////////////////////////////////////////////////////////////////////// 'level-no-id': { @@ -1103,7 +1168,8 @@ exports.strings = { 'ru_RU': 'Уровень с id "{id}" не найден! Открываю выбор уровней', 'uk': 'Рівень з id "{id}" не знайдений! Відкриваю вибір рівней', 'ko': 'id "{id}"에 대한 레벨이 존재하지 않습니다. 레벨 선택 화면을 열어보세요.', - 'vi': 'Không tìm thấy cấp độ cho định danh "{id}". Mở cửa sổ chọn cấp độ.' + 'vi': 'Không tìm thấy cấp độ cho định danh "{id}". Mở cửa sổ chọn cấp độ.', + 'sl_SI': 'Stopnja za ta id "{id}" ni bila najdena! Odpiram pogled za izbiro stopnje' }, /////////////////////////////////////////////////////////////////////////// 'undo-stack-empty': { @@ -1120,7 +1186,8 @@ exports.strings = { 'ru_RU': 'Некуда откатывать!', 'uk': 'Нема куди відкатуватися', 'ko': '되돌리기 스택이 비었습니다!', - 'vi': 'Không có gì để hoàn tác!' + 'vi': 'Không có gì để hoàn tác!', + 'sl_SI': 'Undo seznam je prazen!' }, /////////////////////////////////////////////////////////////////////////// 'already-solved': { @@ -1137,7 +1204,8 @@ exports.strings = { 'ru_RU': 'Ты уже прошел этот уровень, попробуй пройти другие при помощи команды "levels" или иди в песочницу "sandbox"', 'uk': 'Ти вже пройшов цей рівень, спробуй інші рівні з "levels" чи повернись в пісочницю з "sandbox"', 'ko': '당신은 이미 이 레벨을 해결했습니다. "levels"를 사용하여 다른 레벨에 도전하거나 "sandbox"를 사용하여 샌드박스로 돌아가세요.', - 'vi': 'Bạn đã vượt qua cấp độ này. Thử cấp độ khác với "levels" hoặc dùng "sandbox" để trở lại hộp cát.' + 'vi': 'Bạn đã vượt qua cấp độ này. Thử cấp độ khác với "levels" hoặc dùng "sandbox" để trở lại hộp cát.', + 'sl_SI': 'To stopnjo si že rešil, poizkusi druge stopnje z "levels" ali pojdi nazaj v peskovnik s "sandbox"' }, /////////////////////////////////////////////////////////////////////////// 'solved-level': { @@ -1151,7 +1219,8 @@ exports.strings = { 'ru_RU': 'Решено!!\n:D', 'uk' : 'Вирішено!!\n:D', 'ko' : '해결 완료!!\n:D', - 'vi' : 'ĐÃ XONG!!\n:D' + 'vi' : 'ĐÃ XONG!!\n:D', + 'sl_SI': 'Rešeno!!\n:D' }, /////////////////////////////////////////////////////////////////////////// 'command-disabled': { @@ -1168,7 +1237,8 @@ exports.strings = { 'ru_RU': 'На этом уровне нельзя использовать эту команду!', 'uk': 'На цьому рівні не можна використовувати цю команду!', 'ko': '그 Git 명령어는 이 레벨에서 사용할 수 없습니다.', - 'vi': 'Ở cấp độ này thì lệnh git đó bị vô hiệu hóa.' + 'vi': 'Ở cấp độ này thì lệnh git đó bị vô hiệu hóa.', + 'sl_SI': 'Ta git ukaz je onemogočen za to stopnjo!' }, /////////////////////////////////////////////////////////////////////////// 'share-json': { @@ -1185,7 +1255,8 @@ exports.strings = { 'ru_RU': 'Вот JSON для этого уровня! Поделись им с кем-нибудь или отправь его нам на GitHub', 'uk': 'Ось JSON для цього рівня! Поділись з кимось чи відправ мені його на Github', 'ko': '이 레벨을 위한 JSON 데이터가 있습니다! 이를 다른 사람들과 공유하거나 Github에서 제게 보내보세요.', - 'vi': 'Đây là chuỗi JSON cho cấp độ này! Hãy chia sẻ với người khắc hoặc với tôi qua Github.' + 'vi': 'Đây là chuỗi JSON cho cấp độ này! Hãy chia sẻ với người khắc hoặc với tôi qua Github.', + 'sl_SI': 'Tu je JSON za to stopnjo! Deli ga z nekom ali ga pošlji meni na Github' }, /////////////////////////////////////////////////////////////////////////// 'want-start-dialog': { @@ -1202,7 +1273,8 @@ exports.strings = { 'ru_RU': 'Не указано стартово сообщение! Точно продолжаем?', 'uk': 'Не вказано стартовий діалог, хочеш додати стартовий діалог?', 'ko': '당신은 시작 대화창을 지정하지 않았습니다. 추가 하시겠습니까?', - 'vi': 'Không có cửa sổ hội thoại được chỉ định, thêm một cái chứ?' + 'vi': 'Không có cửa sổ hội thoại được chỉ định, thêm một cái chứ?', + 'sl_SI': 'Nisi določil začetnega dialoga, bi ga rad dodal?' }, /////////////////////////////////////////////////////////////////////////// 'want-hint': { @@ -1219,7 +1291,8 @@ exports.strings = { 'ru_RU': 'Не указана подсказка для уровня! Пренебречь? Вальсируем?', 'uk': 'Не вказана підказка, хочеш додати підказку?', 'ko': '당신은 힌트를 지정하지 않았습니다. 추가 하시겠습니까?', - 'vi': 'Bạn chưa chỉ định một gợi ý, thêm một cái chứ?' + 'vi': 'Bạn chưa chỉ định một gợi ý, thêm một cái chứ?', + 'sl_SI': 'Nisi določil namiga, bi ga rad dodal?' }, /////////////////////////////////////////////////////////////////////////// 'prompt-hint': { @@ -1236,7 +1309,8 @@ exports.strings = { 'ru_RU': 'Введи подсказку для уровня, если хочешь.', 'uk': 'Додай підказку для рівня, якщо хочеш', 'ko': '이 레벨을 위한 힌트를 입력하거나 만약 이를 포함시키고 싶지 않을 경우엔 비워두세요.', - 'vi': 'Thêm một gợi ý cho cấp độ này, hoặc cứ để trống nếu bạn không muốn thêm.' + 'vi': 'Thêm một gợi ý cho cấp độ này, hoặc cứ để trống nếu bạn không muốn thêm.', + 'sl_SI': 'Vnesi namig za to stopnjo ali pusti to prazno, če ga nočeš dodati' }, /////////////////////////////////////////////////////////////////////////// 'prompt-name': { @@ -1253,7 +1327,8 @@ exports.strings = { 'ru_RU': 'Введи название уровня', 'uk': 'Введи назву рівня', 'ko': '레벨 이름을 입력하세요.', - 'vi': 'Nhập tên cho cấp độ này.' + 'vi': 'Nhập tên cho cấp độ này.', + 'sl_SI': 'Vnesi ime za stopnjo' }, /////////////////////////////////////////////////////////////////////////// 'solution-empty': { @@ -1270,7 +1345,8 @@ exports.strings = { 'ru_RU': 'Решение не указано! Так не годится!', 'uk': 'Розв’язок порожній!! Щось не так', 'ko': '해답이 비어있습니다. 무언가 잘못되었습니다.', - 'vi': 'Đáp án bị bỏ trống!! Có gì thiếu rồi.' + 'vi': 'Đáp án bị bỏ trống!! Có gì thiếu rồi.', + 'sl_SI': 'Tvoja rešitev je prazna!! Nekaj ni vredu.' }, /////////////////////////////////////////////////////////////////////////// 'define-start-warning': { @@ -1287,7 +1363,8 @@ exports.strings = { 'ru_RU': 'Устанавливаю стартовую точку... Решение и итоговое состояние будут стёрты, если они указаны ранее', 'uk': 'Встановлюю стартову точку... розв’язок та ціль будуть переписані якщо вони були задані раніше', 'ko': '시작 지점을 정의하세요... 만약 그것이 먼저 정의된다면 해답과 목표가 덮어씌워질 것입니다.', - 'vi': 'Xác định điểm bắt đầu ... Các giải pháp và mục tiêu sẽ được thay thế nếu đã được chỉ định từ trước.' + 'vi': 'Xác định điểm bắt đầu ... Các giải pháp và mục tiêu sẽ được thay thế nếu đã được chỉ định từ trước.', + 'sl_SI': 'Določanje začetne točke ... rešitev in cilj bosta povožena, če sta bila prej že podana' }, /////////////////////////////////////////////////////////////////////////// 'help-vague-level': { @@ -1304,7 +1381,8 @@ exports.strings = { 'ru_RU': 'При прохождении уровня доступны несколько видов помощи. Определить что нужно: "help level" чтобы получить информацию об этом уровне, "help general" для того, чтобы узнать о игре в целом или "objective" чтобы узнать что надо сделать в этом уровне.', 'uk': 'При проходженні рівня доступні декілька різновидів допомоги. Виберіть або "help level" щоб взнати більше про цей рівень, чи "help general" щоб взнати більше про Learn Git Branching, чи "objective" щоб дізнатись більше про проходження цього рівня', 'ko': '당신은 한 레벨에 들어가 있고, 여러가지 도움 양식들을 사용할 수 있습니다. 레슨에 대해 더 알고싶을 땐 "help level", LearnGitBranching을 사용하고 싶을 땐 "help general", 또는 레벨을 어떻게 해결해야할지 알고싶을 땐 "objective"를 선택하세요.', - 'vi': 'Bạn đang ở trong một cấp độ, nên sẽ có nhiều hỗ trợ. Vui lòng dùng "help level" để biết thêm về bài học này, "help general" để sử dụng HọcNhánhGit, hoặc "objective" để biết cách giải quyết bài tập.' + 'vi': 'Bạn đang ở trong một cấp độ, nên sẽ có nhiều hỗ trợ. Vui lòng dùng "help level" để biết thêm về bài học này, "help general" để sử dụng HọcNhánhGit, hoặc "objective" để biết cách giải quyết bài tập.', + 'sl_SI': 'Si v stopnji, zato so na voljo različne pomoči. Prosim izberi "help level" za več informacij o tej lekciji, "help general" za splošna navodila ali "objective" da izveš kako rešiti to stopnjo' }, /////////////////////////////////////////////////////////////////////////// 'help-vague-builder': { @@ -1321,7 +1399,8 @@ exports.strings = { 'ru_RU': 'При создании уровней доступны несколько видов помощи. Выбери между "help general" и "help builder"', 'uk': 'При створенні рівня доступні декілька різновидів допомоги. Виберіть або "help general", чи "help builder"', 'ko': '당신은 한 레벨 생성기에 들어가 있고, 여러가지 도움 양식들을 사용할 수 있습니다. "help general" 또는 "help builder"를 선택해주세요.', - 'vi': 'Bạn đang tạo một cấp độ, nên sẽ có nhiều trợ giúp có sẵn. Vui lòng chọn "help general" hoặc "help builder".' + 'vi': 'Bạn đang tạo một cấp độ, nên sẽ có nhiều trợ giúp có sẵn. Vui lòng chọn "help general" hoặc "help builder".', + 'sl_SI': 'Si v graditelju stopenj, zato so na voljo različne pomoči. Prosim izberi "help general" ali "help builder"' }, /////////////////////////////////////////////////////////////////////////// 'show-goal-button': { @@ -1339,7 +1418,8 @@ exports.strings = { 'ru_RU': 'Цель уровня', 'uk': 'Ціль рівня', 'ko': '목표 보기', - 'vi': 'Hiển thị mục tiêu' + 'vi': 'Hiển thị mục tiêu', + 'sl_SI': 'Prikaži Cilj' }, /////////////////////////////////////////////////////////////////////////// 'hide-goal-button': { @@ -1357,7 +1437,8 @@ exports.strings = { 'ru_RU': 'Спрятать цель', 'uk': 'Сховати ціль', 'ko': '목표 숨기기', - 'vi': 'Ẩn mục tiêu' + 'vi': 'Ẩn mục tiêu', + 'sl_SI': 'Skrij Cilj' }, /////////////////////////////////////////////////////////////////////////// 'objective-button': { @@ -1371,7 +1452,8 @@ exports.strings = { 'ru_RU': 'Задача', 'uk': 'Задача', 'ko': '목적', - 'vi': 'Chỉ dẫn' + 'vi': 'Chỉ dẫn', + 'sl_SI': 'Navodila' }, /////////////////////////////////////////////////////////////////////////// 'git-demonstration-title': { @@ -1385,7 +1467,8 @@ exports.strings = { 'ru_RU': 'Git демо', 'uk' : 'Git демо', 'ko' : 'Git 데모', - 'vi' : 'Trình diễn Git' + 'vi' : 'Trình diễn Git', + 'sl_SI': 'Git Predstavitev' }, /////////////////////////////////////////////////////////////////////////// 'goal-to-reach': { @@ -1403,7 +1486,8 @@ exports.strings = { 'ru_RU': 'Цель уровня', 'uk': 'Ціль рівня', 'ko': '목표', - 'vi': 'Mục tiêu cần đạt' + 'vi': 'Mục tiêu cần đạt', + 'sl_SI': 'Končni Cilj' }, /////////////////////////////////////////////////////////////////////////// 'goal-only-master': { @@ -1421,7 +1505,8 @@ exports.strings = { 'ru_RU': 'Важно: В этом уровне проверяется только ветка master. Остальные ветки просто для наглядности. Как обычно, можно скрыть это сообщение при помощи "hide goal"', 'uk': 'Важливо: В цьому рівні буде перевірятися тільки гілка master. Решта гілок тільки для наглядності (показані пунктиром нижче). Як завжди, можна сховати цей діалог за допомогою "hide goal"', 'ko': 'Note: 이 레벨에선 오직 마스터 브랜치만이 검사될 것입니다.. 다른 브랜치들은 단순히 참고용입니다. (아래에 대시 라벨로 보여집니다.). "hide goal"을 사용하여 언제든지 창을 숨길 수 있습니다.', - 'vi': 'Chú ý: Ở cấp độ này chỉ nhánh master bị kiểm tra. Các nhánh khác chỉ dùng để tham chiếu(có dấu - ở nhãn). Như thường lệ, bạn có thể ẩn mục tiêu bằng "hide goal".' + 'vi': 'Chú ý: Ở cấp độ này chỉ nhánh master bị kiểm tra. Các nhánh khác chỉ dùng để tham chiếu(có dấu - ở nhãn). Như thường lệ, bạn có thể ẩn mục tiêu bằng "hide goal".', + 'sl_SI': 'Opomba: Samo master branch bo preverjen v tej stopnji. Ostali branchi so zgolj za referenco (prikazani kot črtaste oznake spodaj). Kot ponavadi, lahko skriješ dialog z "hide goal"' }, /////////////////////////////////////////////////////////////////////////// 'hide-goal': { @@ -1439,7 +1524,8 @@ exports.strings = { 'ru_RU': 'Можно скрыть это окно при помощи "hide goal"', 'uk': 'Можна сховати це вікно за допомогою "hide goal"', 'ko': '"hide goal"을 사용하여 이 창을 숨길 수 있습니다.', - 'vi': 'Bạn có thể ẩn cửa sổ này với "hide goal".' + 'vi': 'Bạn có thể ẩn cửa sổ này với "hide goal".', + 'sl_SI': 'To okno lahko skriješ z "hide goal"' }, /////////////////////////////////////////////////////////////////////////// 'hide-start': { @@ -1457,7 +1543,8 @@ exports.strings = { 'ru_RU': 'Можно скрыть это окно при помощи "hide start"', 'uk': 'Можна сховати це вікно за допомогою "hide start"', 'ko': '"hide start"를 사용하여 이 창을 숨길 수 있습니다.', - 'vi': 'Bạn có thể ẩn cửa sổ này với "hide start".' + 'vi': 'Bạn có thể ẩn cửa sổ này với "hide start".', + 'sl_SI': 'To okno lahko skriješ z "hide start"' }, /////////////////////////////////////////////////////////////////////////// 'level-builder': { @@ -1475,7 +1562,8 @@ exports.strings = { 'ru_RU': 'Редактор уровней', 'uk': 'Редактор рівнів', 'ko': '레벨 생성기', - 'vi': 'Trình tạo câp độ' + 'vi': 'Trình tạo câp độ', + 'sl_SI': 'Graditelj Stopenj' }, /////////////////////////////////////////////////////////////////////////// 'no-start-dialog': { @@ -1493,7 +1581,8 @@ exports.strings = { 'ru_RU': 'Нет стартового сообщение для уровня!', 'uk': 'Немає початкового діалогу для цього рівня!', 'ko': '이 레벨을 위한 시작 대화창이 없습니다.', - 'vi': 'Cấp độ này không được giới thiệu.' + 'vi': 'Cấp độ này không được giới thiệu.', + 'sl_SI': 'Ni začetnega dialoga za prikaz te stopnje!' }, /////////////////////////////////////////////////////////////////////////// 'no-hint': { @@ -1511,7 +1600,8 @@ exports.strings = { 'ru_RU': "Милый мой, хороший, догадайся сам :-/ Подсказка не создана...", 'uk': 'Хм, схоже для цього рівня немає підказки :-/', 'ko': '흠, 이 레벨을 위한 힌트가 없어보이는군요.', - 'vi': 'Hmmm, có vẻ cấp độ này không có gợi ý rồi. :-/' + 'vi': 'Hmmm, có vẻ cấp độ này không có gợi ý rồi. :-/', + 'sl_SI': 'Hmm, izgleda da ni namiga za to stopnjo :-/' }, /////////////////////////////////////////////////////////////////////////// 'error-untranslated-key': { @@ -1529,7 +1619,8 @@ exports.strings = { 'ru_RU': 'Перевода для {key} не создано :( Пожалуйста, предложи перевод на GitHub', 'uk': 'Немає перекладу для {key} :( Будь-ласка, запропонуй переклад на Github', 'ko': '{key}를 위한 번역은 아직 존재하지 않습니다 :( 번역에 참여해주세요!', - 'vi': 'Bản dịch cho {key} không có rồi :( Nếu có thể thì hãy lên dự án của chúng tôi ở Github để cung cấp bản dịch!' + 'vi': 'Bản dịch cho {key} không có rồi :( Nếu có thể thì hãy lên dự án của chúng tôi ở Github để cung cấp bản dịch!', + 'sl_SI': 'Prevod za {key} še ne obstaja :( Skoči na github in dodaj prevod!' }, /////////////////////////////////////////////////////////////////////////// 'error-untranslated': { @@ -1547,6 +1638,7 @@ exports.strings = { 'ru_RU': 'Для этого сообщения нет перевода :( Пожалуйста, предложи перевод на GitHub', 'uk': 'Для цього повідомлення ще немає перекладу :( Будь-ласка, запропонуй переклад на Github', 'ko': '이 대화창이나 텍스트는 아직 번역되지 않았습니다. :( 번역에 참여해주세요!', - 'vi': 'Hội thoại hoặc văn bản này chưa được dịch ra ngôn ngữ của bạn rồi. :( Hãy lên Github để cung cấp bản dịch!' + 'vi': 'Hội thoại hoặc văn bản này chưa được dịch ra ngôn ngữ của bạn rồi. :( Hãy lên Github để cung cấp bản dịch!', + 'sl_SI': 'Ta dialog ali tekst še ni preveden za tvoj jezik :( Skoči na github in dodaj prevod!' } }; diff --git a/src/js/react_views/IntlHelperBarView.jsx b/src/js/react_views/IntlHelperBarView.jsx index ee7d0917..c166e016 100644 --- a/src/js/react_views/IntlHelperBarView.jsx +++ b/src/js/react_views/IntlHelperBarView.jsx @@ -113,7 +113,14 @@ class IntlHelperBarView extends React.Component{ onClick: function() { this.props.onExit(); }.bind(this) - }]; + }, { + text: 'Slovensko', + testID: 'slovenian', + onClick: function() { + this.fireCommand('locale sl_SI; levels'); + }.bind(this) + } + ]; } }; diff --git a/src/js/stores/LocaleStore.js b/src/js/stores/LocaleStore.js index cb0d4ce6..40a1eabe 100644 --- a/src/js/stores/LocaleStore.js +++ b/src/js/stores/LocaleStore.js @@ -6,7 +6,7 @@ var util = require('../util'); var EventEmitter = require('events').EventEmitter; var ActionTypes = AppConstants.ActionTypes; -var DEFAULT_LOCALE = 'en_US'; +var DEFAULT_LOCALE = 'sl'; // resolve the messy mapping between browser language // and our supported locales @@ -21,14 +21,16 @@ var langLocaleMap = { pt: 'pt_BR', ru: 'ru_RU', uk: 'uk', - vi: 'vi' + vi: 'vi', + sl: 'sl_SI' }; var headerLocaleMap = { 'zh-CN': 'zh_CN', 'zh-TW': 'zh_TW', 'pt-BR': 'pt_BR', - 'es-ES': 'es_ES' + 'es-ES': 'es_ES', + 'sl-SI': 'sl_SI' }; var supportedLocalesList = Object.values(langLocaleMap) diff --git a/src/levels/advanced/multipleParents.js b/src/levels/advanced/multipleParents.js index 6d2f76d8..9ecce729 100644 --- a/src/levels/advanced/multipleParents.js +++ b/src/levels/advanced/multipleParents.js @@ -16,7 +16,8 @@ exports.level = { "ru_RU": "Здоровая семья, или несколько родителей", "ko" : "다수의 부모", 'uk': 'Декілька батьків', - 'vi': 'Nhiều cha lắm mẹ' + 'vi': 'Nhiều cha lắm mẹ', + 'sl_SI': 'Več Staršev' }, "hint": { "en_US": "Use `git branch bugWork` with a target commit to create the missing reference.", @@ -32,7 +33,8 @@ exports.level = { "ru_RU": "`git branch bugWork` на нужном коммите поможет создать нужную ссылку.", "ko" : "`git branch bugWork`를 대상 커밋과 함께 사용해서 부족한 참조를 만드세요", 'uk': 'Використай "git branch bugWork" на потрібному коміті щоб створити потрібне посилання', - 'vi': 'Dùng lệnh `git branch bugWork` để tạo nhánh tại vị trí chỉ định' + 'vi': 'Dùng lệnh `git branch bugWork` để tạo nhánh tại vị trí chỉ định', + 'sl_SI': 'Uporabi `git branch bugWork` s ciljnim commitom za ustvarjanje manjkajoče reference.' }, "startDialog": { "en_US": { @@ -1253,6 +1255,93 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Določanje Staršev", + "", + "Tako kot `~` modifikator, tudi `^` modifikator sprejme opcijsko število na koncu.", + "", + "Raje kot specificiranje število generacij, za katere se hočemo premakniti nazaj (kot pri `~`), modifikator `^` pove kateremu staršu oz. njegovi referenci naj sledi iz commita merga. Zapomni si, da imajo commiti mergev več staršev, zato je pot nejasna.", + "", + "Git bo ponavadi sledil \"prvemu\" staršu navzgor po commitu merga, ampak določitev števila s `^` spremeni privzeto obnašanje.", + "", + "Dovolj govorjenja, poglejmo stvar v akciji.", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Tukaj imamo commit merga. Če checkoutamo `master^` brez modifikatorjev, bomo sledili prvem staršu po commitu merga. ", + "", + "(*V naši vizualizaciji, je postavljen prvi starš direktno nad commitom mergea)" + ], + "afterMarkdowns": [ + "Enostavno -- Tega smo vsi navajeni." + ], + "command": "git checkout master^", + "beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Sedaj pa poizkusimo določiti raje drugega starša ..." + ], + "afterMarkdowns": [ + "Vidiš? Sledili smo drugemu staršu navzgor." + ], + "command": "git checkout master^2", + "beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Modifikatorja `^` in `~` naredita sprehajanje po drevesu zelo učinkovito:" + ], + "afterMarkdowns": [ + "Bliskovito!" + ], + "command": "git checkout HEAD~; git checkout HEAD^2; git checkout HEAD~2", + "beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Še bolj noro, te modifikatorji so lahko povezani skupaj! Poglej to:" + ], + "afterMarkdowns": [ + "Isto gibanje kot prej, ampak vse z enim ukazom." + ], + "command": "git checkout HEAD~^2~2", + "beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Preizkusi v praksi", + "", + "Za dokončanje te stopnje, ustvari nov brench na določeni destinaciji.", + "", + "Seveda bi bilo lažje izbrati commit direktno (npr. s `C6`), ampak te izzivam, da namesto tega poizkusiš z modifikatorji o katerih smo govorili!" + ] + } + } + ] } } }; diff --git a/src/levels/index.js b/src/levels/index.js index 46e03d81..89c5d8fb 100644 --- a/src/levels/index.js +++ b/src/levels/index.js @@ -68,7 +68,8 @@ var sequenceInfo = exports.sequenceInfo = { 'ko' : 'git 기본', 'ru_RU': 'Введение', 'uk' : 'Вступ', - 'vi' : 'Giới thiệu chuỗi luyện tập' + 'vi' : 'Giới thiệu chuỗi luyện tập', + 'sl_SI': 'Uvodno Zaporedje' }, about: { 'en_US': 'A nicely paced introduction to the majority of git commands', @@ -84,7 +85,8 @@ var sequenceInfo = exports.sequenceInfo = { 'ko' : 'git의 주요 명령어를 깔끔하게 알려드립니다', 'ru_RU': 'Хорошо подобранное введение в основные команды git', 'uk' : 'Гарно підібране введення в основні команди git', - 'vi' : 'Từng bước làm quen với phần lớn lệnh điều khiển git' + 'vi' : 'Từng bước làm quen với phần lớn lệnh điều khiển git', + 'sl_SI': 'Prijeten uvod v git ukaze' } }, rampup: { @@ -102,7 +104,8 @@ var sequenceInfo = exports.sequenceInfo = { 'ru_RU': 'Едем дальше', 'uk' : 'Їдемо далі', 'ko' : '다음 단계로', - 'vi' : 'Tăng tốc' + 'vi' : 'Tăng tốc', + 'sl_SI': 'Prva Stopnička' }, about: { 'en_US': 'The next serving of 100% git awesomes-ness. Hope you\'re hungry', @@ -118,7 +121,8 @@ var sequenceInfo = exports.sequenceInfo = { 'ru_RU': 'Следующая порция абсолютной git-крутотенюшки. Проголодались?', 'uk' : 'Наступна порція абсолютної git-дивини. Сподіваюсь, ви зголодніли', 'ko' : 'git은 아주 멋져요. 왜 멋진지 알려드립니다', - 'vi' : 'Tận hưởng khẩu phần tuyệt hảo của git. Hi vọng bạn còn đói.' + 'vi' : 'Tận hưởng khẩu phần tuyệt hảo của git. Hi vọng bạn còn đói.', + 'sl_SI': 'Naslednja porcija git izjemnosti. Upam, da si lačen' } }, remote: { @@ -137,7 +141,8 @@ var sequenceInfo = exports.sequenceInfo = { 'ru_RU': 'Push & Pull - удалённые репозитории в Git!', 'uk' : 'Push & Pull -- віддалені репозиторії в Git!', 'ko' : 'Push & Pull -- Git 원격 저장소!', - 'vi' : 'Push & Pull -- Tác động git từ xa!' + 'vi' : 'Push & Pull -- Tác động git từ xa!', + 'sl_SI': 'Push & Pull -- Oddaljeni Git' }, about: { 'en_US': 'Time to share your 1\'s and 0\'s kids; coding just got social', @@ -153,7 +158,8 @@ var sequenceInfo = exports.sequenceInfo = { 'ru_RU': 'Настало время поделиться своими единичками и нулями. Время коллективного программирования', 'uk' : 'Настав час поділитися своїми нулями та одиничками; соціальне програмування', 'ko' : '내 코드를 공개할 때가 되었습니다. 코드를 공개해봅시다!', - 'vi' : 'Chia sẻ đứa con tinh thần \'0\' và \'1\' của bạn; mã đã đến với cộng đồng' + 'vi' : 'Chia sẻ đứa con tinh thần \'0\' và \'1\' của bạn; mã đã đến với cộng đồng', + 'sl_SI': 'Čas za deljenje tvojih 1 in 0; kodiranje je pravkar postalo socialno' } }, remoteAdvanced: { @@ -172,7 +178,8 @@ var sequenceInfo = exports.sequenceInfo = { 'ru_RU': 'Через origin – к звёздам. Продвинутое использование Git Remotes', 'uk' : 'Через origin – до зірок. Прогресивне використання Git Remotes', 'ko' : '"origin"그 너머로 -- 고급 Git 원격 저장소', - 'vi' : 'Về với cội nguồn và vươn xa hơn -- nâng cao về các git remote' + 'vi' : 'Về với cội nguồn và vươn xa hơn -- nâng cao về các git remote', + 'sl_SI': 'Do Origina In Naprej -- Napredni Oddaljeni Git' }, about: { 'en_US': 'And you thought being a benevolent dictator would be fun...', @@ -188,7 +195,8 @@ var sequenceInfo = exports.sequenceInfo = { 'ru_RU': 'Весело было быть всесильным мудрым правителем...', 'uk' : 'А ти думав, що бути всесильним диктатором весело...', 'ko' : '자비로운 독재자가 되는게 재밌을 줄 알았겠지만...', - 'vi' : 'Và bạn nghĩ làm một kẻ độc tài nhân từ thì sẽ vui ...' + 'vi' : 'Và bạn nghĩ làm một kẻ độc tài nhân từ thì sẽ vui ...', + 'sl_SI': 'In ti si mislil, da je biti dobronamerni diktator zabavno ...' } }, move: { @@ -206,7 +214,8 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_TW': '調整提交順序', 'ru_RU': 'Перемещаем труды туда-сюда', 'uk' : 'Переміщуємо роботу туди-сюди', - 'vi' : 'Điều chỉnh vị trí' + 'vi' : 'Điều chỉnh vị trí', + 'sl_SI': 'Premikanje Dela Naokrog' }, about: { 'en_US': '"Git" comfortable with modifying the source tree :P', @@ -222,7 +231,8 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_TW': '自由修改提交樹', 'ru_RU': 'Не стесняйтесь менять историю', 'uk' : 'Не соромимось змінювати історію', - 'vi' : 'Chỉnh sửa cây lịch sử Git không hề khó' + 'vi' : 'Chỉnh sửa cây lịch sử Git không hề khó', + 'sl_SI': 'Spretno "Git" premikanje po drevesu :P' } }, mixed: { @@ -240,7 +250,8 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_TW': '活用 git 的指令', 'ru_RU': 'Сборная солянка', 'uk' : 'Всяке', - 'vi' : 'Những trò mèo đáng đồng tiền bát gạo' + 'vi' : 'Những trò mèo đáng đồng tiền bát gạo', + 'sl_SI': 'Mešana vreča' }, about: { 'en_US': 'A mixed bag of Git techniques, tricks, and tips', @@ -256,7 +267,8 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_TW': 'git 的技術,招數與技巧', 'ru_RU': 'Ассорти из приёмов работы с Git, хитростей и советов', 'uk' : 'Різні прийоми роботи з Git, хитрощі та поради', - 'vi' : 'Các kỹ thuật, bí quyết, và mẹo vặt hữu ích' + 'vi' : 'Các kỹ thuật, bí quyết, và mẹo vặt hữu ích', + 'sl_SI': 'Mešana vreča Git tehnik, trikov in nasvetov' } }, advanced: { @@ -274,7 +286,8 @@ var sequenceInfo = exports.sequenceInfo = { 'ru_RU': 'Продвинутый уровень', 'uk' : 'Досвідчений рівень', 'ko' : '고급 문제', - 'vi' : 'Các chủ đề nâng cao' + 'vi' : 'Các chủ đề nâng cao', + 'sl_SI': 'Napredne Teme' }, about: { 'en_US': 'For the truly brave!', @@ -290,7 +303,8 @@ var sequenceInfo = exports.sequenceInfo = { 'ru_RU': 'Если ты смелый, ловкий, умелый – потренируйся тут', 'uk' : 'Для хоробрих', 'ko' : '용기있는 도전자를 위해 준비한 문제입니다', - 'vi' : 'Mạnh mẽ lên!' + 'vi' : 'Mạnh mẽ lên!', + 'sl_SI': 'Za resnično pogumne!' } } }; diff --git a/src/levels/intro/branching.js b/src/levels/intro/branching.js index 09beba89..883aabcc 100644 --- a/src/levels/intro/branching.js +++ b/src/levels/intro/branching.js @@ -15,7 +15,8 @@ exports.level = { "zh_TW": "建立 git branch", "ru_RU": "Ветвление в Git", "uk": "Розгалуження в Git", - "vi": "Rẽ nhánh với Git" + "vi": "Rẽ nhánh với Git", + "sl_SI": "Branchanje v Gitu" }, "hint": { "en_US": "Make a new branch with \"git branch \" and check it out with \"git checkout \"", @@ -32,6 +33,7 @@ exports.level = { "ru_RU": "Создай новую ветку при помощи \"git branch [name]\" и перейди на неё при помощи \"git checkout [name]\"", "uk": "Створи нову гілку за допомогою \"git branch [ім’я]\" й перейди на неї за допомогою \"git checkout [ім’я]\"", "vi": "Tạo một nhánh mới với lệnh \"git branch \" và chuyển sang đó với lệnh \"git checkout \"", + "sl_SI": "Naredi nov branch z \"git branch \" in ga checkoutaj z \"git checkout \"" }, "disabledMap": { "git revert": true @@ -1141,5 +1143,87 @@ exports.level = { } ] }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Branches", + "", + "Tudi branchi v Gitu so izredno majhni. To so preprosto kazalci na določen commit -- nič več. Zato veliko Git navdušencev ponavlja:", + "", + "```", + "branchaj zgodaj in branchaj pogosto", + "```", + "", + "Ker ustvarjanje večih branchev ne porablja dodatnega spomina ali prostora, je lažje logično razdeliti svoje delo kot imeti velike težke branche.", + "", + "Ko začnemo mešati branche in commite, bomo videli kako se te dve funkcionalnosti dopolnjujeta. Za zdaj si zapomni samo to, da branch ubistvu pomeni \"Hočem vključiti delo tega commita in vseh starševskih commitov.\"" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Poglejmo kako branchi zgledajo v praksi.", + "", + "Tu bomo ustvarili nov branch imenovan `newImage`" + ], + "afterMarkdowns": [ + "Tako, to je vsa umetnost branchanja! Branch poimenovan `newImage` se sedaj nanaša na commit `C1`" + ], + "command": "git branch newImage", + "beforeCommand": "" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Poizkusimo dodati nekaj dela na ta nov branch. Pristisni gumb spodaj" + ], + "afterMarkdowns": [ + "O ne! `master` branch se je premaknil ampak `newImage` branch se pa ni! To je zato, ker nismo bili \"na\" novem branchu, kot smo lahko videli z označeno zvezdico (*) na `master` branchu" + ], + "command": "git commit", + "beforeCommand": "git branch newImage" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Povejmo gitu da želimo checkoutat branch z", + "", + "```", + "git checkout ", + "```", + "", + "To nas bo postavilo na nov branch pred commitanjem sprememb" + ], + "afterMarkdowns": [ + "Tako je! Naše sprememebe so zabeležene na novem branchu" + ], + "command": "git checkout newImage; git commit", + "beforeCommand": "git branch newImage" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ok! Pripravljen si da začneš branchat. Ko se to okno zapre, ", + "ustvari nov branch z imenom `bugFix` in preklopi na ta branch.", + "", + "Mimogrede, tu je bližnjica: če hočeš narediti nov ", + "branch IN ga hkrati checkoutati, lahko enostavno ", + "natipkaš `git checkout -b [yourbranchname]`." + ] + } + } + ] + } } }; diff --git a/src/levels/intro/commits.js b/src/levels/intro/commits.js index 47de7043..84ed3ef3 100644 --- a/src/levels/intro/commits.js +++ b/src/levels/intro/commits.js @@ -13,7 +13,8 @@ exports.level = { 'zh_TW': '介紹 git commit ', 'ru_RU': 'Знакомство с Git Commit ', 'uk': 'Знайомство з комітами в Git', - 'vi': 'Giới thiệu về Git Commit' + 'vi': 'Giới thiệu về Git Commit', + 'sl_SI': "Uvod v Git Commit" }, "goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C3\",\"id\":\"master\"}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C2\"],\"id\":\"C3\"}},\"HEAD\":{\"target\":\"master\",\"id\":\"HEAD\"}}", "solutionCommand": "git commit;git commit", @@ -32,7 +33,8 @@ exports.level = { "ko": "'git commit'이라고 두 번 치세요!", "ru_RU": "Попробуй дважды выполнить команду 'git commit' ;)", "uk": "Спробуй двічі виконати команду 'git commit' ;)", - 'vi': "Đơn giản là cứ gõ 'git commit' 2 lần" + 'vi': "Đơn giản là cứ gõ 'git commit' 2 lần", + 'sl_SI': "Preprosto dvakrat vpiši 'git commit' in zaključi!" }, "disabledMap": { "git revert": true @@ -635,6 +637,48 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Commits", + "Commit v git repozitoriju zabeleži stanje vseh datotek v tvoji mapi. Deluje kot tak velik 'Izreži in Prilepi', vendar še bolje!", + "", + "Git hoče commite ohraniti majhne kot se da, tako da ne skopira vsakič kar vseh datotek ob commitu. Lahko (kadar je možno) stisne commit le kot množico sprememb oziroma kot \"delto\" sprememb med eno in drugo različico v repozitoriju.", + "", + "Git vodi tudi zgodovino o tem, kdaj je bil kateri commit narejen. Zato ima večina commitov nad seboj svoje prednike -- to je v vizualizaciji predstavljeno s puščicami. Vzdrževanje zgodovine je uporabno za vse, ki delajo na projektu!", + "", + "Veliko je za dojeti na začetku ampak za zdaj si lahko predstavljaš commite kot posnetek projekta v določenem času. Commiti so zelo majhni in prehajanje med njimi je noro hitro!" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Poglejmo kako to izgleda v praksi. Na desni imamo vizualizacijo (majhnega) git repozitorija. Trenutno imamo dva commita -- prvi začetni commit, `C0`, in še en commit za tem, `C1`, ki ima lahko pomembne spremembe.", + "", + "Pritisni gumb spodaj, da narediš nov commit" + ], + "afterMarkdowns": [ + "Tako ja! Super. Pravkar smo naredili spremembe v repozitoriju in jih shranili kot commit. Commit, ki smo ga naredili ima starša, `C1`, ki nam pove iz katerega commita smo izhajali." + ], + "command": "git commit", + "beforeCommand": "" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Čas je, da poizkusiš sam! Ko se to okno zapre, naredi dva commita, da dokončaš to stopnjo." + ] + } + } + ] } } }; diff --git a/src/levels/intro/merging.js b/src/levels/intro/merging.js index f5a52d51..7f35c095 100644 --- a/src/levels/intro/merging.js +++ b/src/levels/intro/merging.js @@ -15,7 +15,8 @@ exports.level = { "zh_TW": "git 中的 merge", "ru_RU": "Слияния веток в Git", "uk": "Злиття гілок в Git", - "vi": "Gộp nhánh trong Git" + "vi": "Gộp nhánh trong Git", + "sl_SI": "Merganje v Gitu" }, "hint": { "en_US": "Remember to commit in the order specified (bugFix before master)", @@ -31,7 +32,8 @@ exports.level = { "ko": "말씀드린 순서대로 커밋해주세요 (bugFix에 먼저 커밋하고 master에 커밋)", "ru_RU": "Не забудь делать коммиты в правильном порядке (сначала bugFix, потом master)", "uk": "Не забудь робити коміти в правильному порядку (спочатку bugFix, а вже потім master)", - "vi": "Nhớ là commit theo đúng thứ tự(bugFix trước master)" + "vi": "Nhớ là commit theo đúng thứ tự(bugFix trước master)", + "sl_SI": 'Zapomni si, da je potrebno commitati v pravilnem vrstnem redu (bugfix pred master)' }, "disabledMap": { "git revert": true @@ -1002,6 +1004,75 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Branchi in Merganje", + "", + "Odlično! Sedaj znamo commitati in branchati. Naslednja stvar je da se naučimo združiti delo iz dveh različnih branchev. To nam bo omogočilo, da naredimo branch, razvijemo novo funkcionalnost in jo združimo nazaj.", + "", + "Prva metoda za združevanje dela, ki jo bomo preučili je `git merge`. Merganje v Gitu naredi poseben commit, ki ima dva edinstvena starša. Commit z dvema staršema vbistvu pomeni \"Hočem vključiti vso delo iz tega starša tukaj in iz tega tu *ter* vse delo iz njunih staršev\"", + "", + "Vizualizacija je enostavnejša, poglejmo v naslednjem oknu" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Tu imamo dva brancha; vsak ima en commit, ki je unikaten. To pomeni, da noben branch v repozitorju nima vsega \"dela\". Pa popravimo to z mergeom.", + "", + "Sedaj bomo `mergeali` branch `bugFix` v `master`" + ], + "afterMarkdowns": [ + "Woah! Si videl to? `master` sedaj kaže na commit, ki ima dva starša. Če slediš puščicam po drevesu commitov iz `master`, boš našel vsak commit po poti do roota. To pomeni, da `master` sedaj vsebuje vso delo iz repozitorija.", + "", + "Tudi, vidiš kako so se barve commitov spremenile? V pomoč pri učenju, sem vključil še nekaj barvne pomoči. Vsak branch ima svojo barvo. Vsak commit spremeni barvo v kombinirano barvo vseh branchev, ki imajo ta commit.", + "", + "Torej tukaj vidimo, da je `master` branch barva zmešana v vseh commitih, `bugFix` barva pa ne. Popravimo to ..." + ], + "command": "git merge bugFix", + "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Zmergajmo sedaj `master` v `bugFix`:" + ], + "afterMarkdowns": [ + "Ker je `bugFix` bil prednik `master`, git ni rabil storiti ničesar; preprosto je premaknil `bugFix` v isti commit, kamer kaže `master`.", + "", + "Sedaj so vsi commiti iste barve, kar pomeni, da vsak branch vsebuje vse delo v repozitoriju!! Woohoo!" + ], + "command": "git checkout bugFix; git merge master", + "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Da zaključiš to stopnjo, naredi naslednje korake:", + "", + "* Naredi novi branch `bugFix`", + "* Checkoutaj `bugFix` branch z `git checkout bugFix`", + "* Enkrat commitaj", + "* Pojdi nazaj na `master` z `git checkout`", + "* Še enkrat commitaj", + "* Mergeaj branch `bugFix` v `master` z `git merge`", + "", + "*Pomni, vedno lahko spet pogledaš ta dialog z \"objective\"!*" + ] + } + } + ] } } }; diff --git a/src/levels/intro/rebasing.js b/src/levels/intro/rebasing.js index 980d67bf..e5230978 100644 --- a/src/levels/intro/rebasing.js +++ b/src/levels/intro/rebasing.js @@ -15,7 +15,8 @@ exports.level = { "zh_TW": "介紹 rebase", "ru_RU": "Введение в rebase", "uk": "Знайомство з rebase", - "vi": "Giới thiệu về rebase" + "vi": "Giới thiệu về rebase", + 'sl_SI': 'Uvod v Rebase' }, "hint": { "en_US": "Make sure you commit from bugFix first", @@ -31,7 +32,8 @@ exports.level = { "zh_TW": "你要先在 bugFix branch 進行 commit", "ru_RU": "Убедись, что сделал коммит в ветке bugFix", "uk": "Впевнись, що зробив коміт в гілці bugFix", - "vi": "Hãy chắc chắn rằng bạn commit từ bugFix trước" + "vi": "Hãy chắc chắn rằng bạn commit từ bugFix trước", + 'sl_SI': 'Prepričaj se, da si najprej commital bugFix' }, "disabledMap": { "git revert": true @@ -977,6 +979,72 @@ exports.level = { } } ] + },"sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Rebase", + "", + "Drugi način kombiniranja dela med branchi je *rebasing*. Rebasing vzame listo commitov, jih \"skopira\", nato pa jih položi nekam drugam.", + "", + "To se morda sliši komplicirano, ampak prednost rebeasinga je, da se ga lahko uporabi za lepo linearno zaporedje commitov. Commit log / zgodovina repozitorija bo dosti lepša, če je dovoljeno le rebaseanje.", + "", + "Poglejmo to na primeru ..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Tu imamo spet dva brancha; trenutno izbran je bugFix branch (zvezdica)", + "", + "Radi bi prestavili naše delo iz bugFix direktno na delo iz masterja. Tako bi izgledalo, kot da sta bili ti dve funkcionalnosti razviti zaporedno, v resnici pa sta bili razviti vzporedno.", + "", + "Naredimo sedaj to z `git rebase` ukazom" + ], + "afterMarkdowns": [ + "Super! Sedaj je naše delo iz bugFix brancha na vrhu masterja in imamo lepo zaporedje commitov.", + "", + "Omenimo, da commit C3 še vedno obstaja nekje (v drevesu je zbledel), in C3' je vbistvu \"kopija\", ki smo jo rebaseali na master.", + "", + "Edini problem je, da tudi master ni bil posodobljen, naredimo to sedaj ..." + ], + "command": "git rebase master", + "beforeCommand": "git commit; git checkout -b bugFix C1; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Sedaj smo checkoutani na `master` branchu. Pojdimo in rebaseajmo na `bugFix`..." + ], + "afterMarkdowns": [ + "Tako! Ker je bil `master` prednik `bugFix`, je git enostavno premaknil `master` branch referenco naprej v zgodovini." + ], + "command": "git rebase bugFix", + "beforeCommand": "git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Da zaključiš to stopnjo, naredi naslednje", + "", + "* Checkoutaj nov branch poimenovan `bugFix`", + "* Enkrat commitaj", + "* Pojdni nazaj na master in commita ponovno", + "* Ponovno checkoutaj bugFix in ga rebaseaj na master", + "", + "Srečno!" + ] + } + } + ] } } }; diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js index 1974558b..1681f243 100644 --- a/src/levels/mixed/describe.js +++ b/src/levels/mixed/describe.js @@ -16,7 +16,8 @@ exports.level = { "ru_RU": "Git describe", "ko" : "Git describe(묘사)", "uk" : "Git Describe", - "vi": "Git Describe(mô tả)" + "vi": "Git Describe(mô tả)", + "sl_SI": "Git Describe" }, "hint": { "en_US": "Just commit once on bugFix when you're ready to move on", @@ -32,7 +33,8 @@ exports.level = { "ru_RU": "Когда закончишь, просто сделай commit", "ko" : "다음으로 넘어가고 싶으면 bugFix를 한번 커밋하면 됩니다.", "uk" : "Просто зроби один коміт в bugFix коли ти будеш готовий іти далі", - "vi": "Đơn giản là hãy commit một lẩn ở bugFix là xong rồi" + "vi": "Đơn giản là hãy commit một lẩn ở bugFix là xong rồi", + "sl_SI": "Commitaj enkrat na bugFix, ko boš pripravljen za nadaljevanje" }, "startDialog": { "en_US": { @@ -920,6 +922,69 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Git Describe", + "", + "Ker tagi služijo kot tako odlična \"sidra\" v kodi, ima git ukaz za *opis* kje si, relativno glede na najbližije \"sidro\" (aka tag). Temu ukazu se reče `git describe`!", + "", + "Git describe se ti lahko pomaga orientirati, če si premikal veliko commitov naprej in nazaj po zgodovini; to se lahko zgodi, če si končal git bisekcijo (iskanje kot debuggiranje) ali če se usedeš za sodelavčev računalnik, ko je prišel iz dopusta." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Git describe izgleda takole:", + "", + "`git describe `", + "", + "Kjer je `` karkoli kar lahko git prepozna kot commit. Če ne podaš ref-a, git uporabi mesto, kjer si trenutno checkoutan (`HEAD`).", + "", + "Izpis ukaza je sledeč:", + "", + "`__g`", + "", + "Kjer je `tag` najbližji prednik v zgodovini, `numCommits` je število commitov oddaljenosti tag-a in `` je hash commita, ki ga opisujemo." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Poglejmo hiter primer. Za drevo spodaj:" + ], + "afterMarkdowns": [ + "Ukaz `git describe master` bi izpisal:", + "", + "`v1_2_gC2`", + "", + "Ukaz `git describe side` pa bi vrnil:", + "", + "`v2_1_gC4`" + ], + "command": "git tag v2 C3", + "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "To je približno vse, kar se tiče git describe! Poizkusi za občutek opisati nekaj lokacij v tej stopnji.", + "", + "Ko si pripravljen, samo enkrat commitaj, da zaključiš stopnjo. Tole ti častimo :P" + ] + } + } + ] } } }; diff --git a/src/levels/mixed/grabbingOneCommit.js b/src/levels/mixed/grabbingOneCommit.js index 30c527fd..4db8d067 100644 --- a/src/levels/mixed/grabbingOneCommit.js +++ b/src/levels/mixed/grabbingOneCommit.js @@ -27,7 +27,8 @@ exports.level = { "zh_TW": "只取一個 commit", "ru_RU": "Выберем один коммит.", "uk": "Вибираємо всього один коміт", - "vi": "Chỉ lấy 1 commit" + "vi": "Chỉ lấy 1 commit", + "sl_SI": "Izbiranje Samo Enega Commita" }, "hint": { "en_US": "Remember, interactive rebase or cherry-pick is your friend here", @@ -43,7 +44,8 @@ exports.level = { "zh_TW": "記住,使用互動式的 rebase 或者 cherry-pick 會很有幫助", "ru_RU": "Не забывай, что интерактивный rebase и cherry-pick – это твои друзья!", "uk": "Не забувай, що інтерактивний rebase та cherry-pick -- це твої друзі!", - "vi": "Hãy nhớ 2 anh bạn tương tác rebase và cherry-pick!" + "vi": "Hãy nhớ 2 anh bạn tương tác rebase và cherry-pick!", + "sl_SI": "Pomni, interactive rebase ali cherry-pick sta tu tvoja prijatelja" }, "startDialog": { "en_US": { @@ -591,6 +593,45 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Lokalno naloženi commiti", + "", + "Tu je razvijalska situacija, ki se zgodi pogosto: Hočem najti bug, ampak se kar izmika. V pomoč mojemu detektivskemu delu, sem dodal nekaj ukazov za debuggiranje in izpis.", + "", + "Vsi te ukazi za debuggiranje / izpisovanje so v svojih commitih. Končno odkrijem bug, ga popravim in se veselim!", + "", + "Edini problem je, da morem sedaj spraviti moj `bugFix` nazaj v `master` branch. Če uporabim samo fast-forwarded na `masterju`, potem bi `master` vseboval vse moje debug vrstice, česar si ne želim. Mora obstajati še neka druga pot ..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Gitu moramo povedati naj skopira čez samo en commit. To je podobno stopnjam prej, ko smo premikali delo okoli -- uporabimo lahko iste ukaze:", + "", + "* `git rebase -i`", + "* `git cherry-pick`", + "", + "Da dosežemo ta cilj." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Tebi prepuščamo, da se odločiš, kateri ukaz boš uporabil da končaš stopnjo. Poskrbi samo, da `master` dobi commit, na katerega kaže `bugFix` referenca." + ] + } + } + ] } } }; diff --git a/src/levels/mixed/jugglingCommits.js b/src/levels/mixed/jugglingCommits.js index cf500f73..083fadcb 100644 --- a/src/levels/mixed/jugglingCommits.js +++ b/src/levels/mixed/jugglingCommits.js @@ -31,7 +31,8 @@ exports.level = { "zh_TW": "commit 的戲法", "ru_RU": "Жонглируем коммитами", "uk": "Жонглюємо комітами", - "vi": "Tung hứng commit" + "vi": "Tung hứng commit", + "sl_SI": "Žongliranje s Commiti" }, "hint": { "en_US": "The first command is git rebase -i HEAD~2", @@ -47,7 +48,8 @@ exports.level = { "zh_TW": "第一個命令是 'git rebase -i HEAD~2'", "ru_RU": "Первой командой должна быть git rebase -i HEAD~2", "uk": "Перша команда має бути git rebase -i HEAD~2", - "vi": "Lệnh đầu tiên là git rebase -i HEAD~2" + "vi": "Lệnh đầu tiên là git rebase -i HEAD~2", + "sl_SI": "Prvi ukaz je git rebase -i HEAD~2" }, "startDialog": { "en_US": { @@ -529,6 +531,40 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Žongliranje s Commiti", + "", + "Tu je še ena situacija, ki se dogaja kar pogosto. Imaš nekaj sprememb (`newImage`) in še nekaj drugih sprememb (`caption`), ki so povezane in zložene druga na drugo v tvojem repozitoriju.", + "", + "Včasih se zgodi, da bi rad naredil manjšo spremembo na zgodnejšem commitu. V tem primeru si naš dizajner želi, da spremenimo dimenzije slike `newImage`, čeprav je commit daleč nazaj v naši zgodovini!!" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ta izziv bomo rešili takole:", + "", + "* Preuredili bomo commite tako, da bo tisti, ki ga želimo spremeniti na vrhu z `git rebase -i`", + "* Izvedli bomo `commit --amend` da naredimo naš popravek", + "* Nato bomo preuderili commite nazaj v začetno stanje z `git rebase -i`", + "* Za konec bomo premaknili master na ta posodobljen del drevesa, da zaključimo stopnjo (z metodo po tvoji izbiri)", + "", + "Obstaja več načinov, da dosežemo ta cilj (vidim te kako gledaš cherry-pick) s katerimi se bomo ukvarjali kasneje, ampak za zdaj se osredotočimo na to tehniko.", + "In nenazadnje, bodi pozoren na ciljno stanje -- ker premaknemo commit dvakrat, oba dobita pripeto vejico zgoraj. Še ena je dodana za ammendan commit, torej skupno tri ", + "", + "Sedaj lahko primerjam stopnje po strukturi in relativni spremembi vejic. Dokler ima `master` branch na tvojem drevesu enako strukturo in število vejic, dobiš vse točke" + ] + } + } + ] } } }; diff --git a/src/levels/mixed/jugglingCommits2.js b/src/levels/mixed/jugglingCommits2.js index 9ed088f7..46c2e6b2 100644 --- a/src/levels/mixed/jugglingCommits2.js +++ b/src/levels/mixed/jugglingCommits2.js @@ -30,7 +30,8 @@ exports.level = { "zh_TW": "commit 的戲法 #2", "ru_RU": "Жонглируем коммитами №2", "uk": "Жонглюємо комітами #2", - "vi": "Tung hứng commit #2" + "vi": "Tung hứng commit #2", + "sl_SI": "Žongliranje s Commiti #2" }, "hint": { "en_US": "Don't forget to forward master to the updated changes!", @@ -46,7 +47,8 @@ exports.level = { "zh_TW": "別忘記了將 master 推到最新的 commit 上面!", "ru_RU": "Не забудь переместить master на последние изменения.", "uk": "Не забудь перемістити master на останні зміни!", - "vi": "Đừng quên đẩy nhánh master lên cập nhật mới nhất!" + "vi": "Đừng quên đẩy nhánh master lên cập nhật mới nhất!", + "sl_SI": "Ne pozabi prestaviti master naprej na posodobljene spremembe" }, "startDialog": { "en_US": { @@ -644,6 +646,49 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Žongliranje s Commiti #2", + "", + "* Če še nisi končal Žongliranje s Commiti #1 (prejšnjo stopnjo), jo končaj pred nadaljevanjem*", + "", + "Kot si videl v prejšnji stopnji, smo uporabili `rebase -i` za preureditev commitov. Ko je bil commit, ki smo ga želeli spremeniti, na vrhu, smo preprosto uporabili --amend in preuredili nazaj v naše željeno stanje.", + "", + "Edini problem tu je, da je veliko prerazporejanja, kar lahko povzroči rebase konflikte. Poglejmo si še eno drugo tehniko `git cherry-pick`" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Git cherry-pick bo skopiral commit iz bilokaterega mesta na drevesu na HEAD (seveda dokler ni ta commit že prednik HEAD).", + "", + "Tu je mali osvežitveni primer:" + ], + "afterMarkdowns": [ + "Odlično! Nadaljujmo ..." + ], + "command": "git cherry-pick C2", + "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Torej v tej stopnji bi radi enako spremenili `C2`, ampak tokrat brez uporabe `rebase -i`. Kako to narediti, prepustim tebi! :D", + "", + "Točno število zgornjih vejic (') na commitu ni pomembno, pomembna je samo relativna sprememba. Naprimer, vse točko bom dal tudi za drevo, ki ustreza ciljenmu drevesu, a ima povsod dodatno vejico" + ] + } + } + ] } } }; diff --git a/src/levels/mixed/tags.js b/src/levels/mixed/tags.js index 96cffdd0..6d6bf551 100644 --- a/src/levels/mixed/tags.js +++ b/src/levels/mixed/tags.js @@ -16,7 +16,8 @@ exports.level = { "ru_RU": "git tag", "ko" : "Git 태그", "uk" : "Git Tags", - "vi" : "Tag trong Git" + "vi" : "Tag trong Git", + "sl_SI": "Git Tagi" }, "hint": { "en_US": "you can either check out the commit directly or simply checkout the tag!", @@ -32,7 +33,8 @@ exports.level = { "ru_RU": "Можно сделать checkout напрямую на коммит или же на тег", "ko" : "커밋을 직접 또는 태그를 이용해서 체크아웃할수 있습니다!", "uk" : "ти можеш або зробити checkout коміта напряму чи просто зачекаутити таг!", - "vi" : "Bạn có thể chuyển trực tiếp sang commit hoặc đơn giản là chuyển sang tag!" + "vi" : "Bạn có thể chuyển trực tiếp sang commit hoặc đơn giản là chuyển sang tag!", + "sl_SI": "Checkoutaš lahko neposredno commit ali pa preprosto njegov tag!" }, "startDialog": { "en_US": { @@ -762,6 +764,58 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Tagi", + "", + "Kot si se naučil v prejšnjih lekcijah, so branchi enostavni za premikat okoli in pogosto kažejo na različne commite in delo za njimi. Veliko se spreminjajo in združujejo, pogosto le začasno.", + "", + "Če je temu res tako, se morda sprašuješ, če obstaja kak način, ki bi *trajno* označil točke v zgodovini projekta. Za stvari kot so večji release-i ali pomembni merge-i, ali obstaja način, ki je trajnejši kot branch?", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Itak da je! Git tagi podpirajo točno ta primer uporabe -- oni trajno (do neke mere) označijo določene commite kot \"mejnike\" na katere se lahko sklicujemo kot na branche.", + "", + "Toda še pomembneje, oni se ne premikajo, ko se ustvarjajo novi commiti. Ne moreš \"checkoutat\" tag in nato končati delo na tem tagu -- tagi obstajajo kot sidra na drevesu commitov, ki označujejo določene točke.", + "", + "Poglejmo kako to izgleda v praksi." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Poizkusimo narediti tag na `C1`, ki je recimo naša prva verzija prototipa" + ], + "afterMarkdowns": [ + "Tako! Kar enostavno. Tag smo poimenovali `v1` in se sklicuje na commit `C1`. Če ne navedeš commit, bo git postavil tag tam, kjer je trenutno `HEAD`" + ], + "command": "git tag v1 C1", + "beforeCommand": "git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Za to stopnjo ustvari tage kot so določeni na ciljnem prikazu in nato checkoutaj `v1`. Opazil boš, kako prideš v detached `HEAD` stanje -- to je zato, ker ne moreš commitat direktno na `v1` tag.", + "", + "V naslednji stopnji si bomo pogledali zanimivejši primer za uporabo tagov." + ] + } + } + ] } } }; diff --git a/src/levels/rampup/cherryPick.js b/src/levels/rampup/cherryPick.js index 4c359792..f16ca41e 100644 --- a/src/levels/rampup/cherryPick.js +++ b/src/levels/rampup/cherryPick.js @@ -20,7 +20,8 @@ exports.level = { "ru_RU": "Введение в Cherry-pick", "ko" : "Cherry-pick 소개", "uk": "Знайомство з cherry-pick", - "vi" : "Giới thiệu về cherry-pick" + "vi" : "Giới thiệu về cherry-pick", + "sl_SI": "Uvod v cherry-pick" }, "hint": { "fr_FR": "git cherry-pick suivi par les noms de commits", @@ -36,7 +37,8 @@ exports.level = { "ru_RU": "git cherry-pick основывается на именах коммитов!", "ko" : "커밋의 이름들로 git cherry-pick 하세요!", "uk": "git cherry-pick базується на іменах комітів!", - "vi" : "git cherry-pick sau đó là tên commit!" + "vi" : "git cherry-pick sau đó là tên commit!", + "sl_SI": "git cherry-pick nato pa imena commitov" }, "startDialog": { "en_US": { @@ -835,6 +837,63 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Premikanje dela naokoli", + "", + "Zaenkrat smo pokrili osnove gita -- commitanje, branchanje in pomikanje po drevesu. Samo te koncepti so dovolj za koriščenje 90% moči git repozitorijev in pokrijejo večino potreb razvijalcev.", + "", + "Preostalih 10% pa je lahko kar uporabnih med reševanjem kompleksnejših situacij (ali ko ste zašli v zagato). Naslednji koncept, ki ga bomo pokrili je \"premikanje dela naokoli\" -- z drugimi besedami, tako razvijalci rečejo \"Rad bi to delo tu in tisto delo tam\" na natančen, zgovoren in prilagodljiv način.", + "", + "Morda se zdi veliko, a gre za preprost koncept." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Cherry-pick", + "", + "Prvi ukaz v zaporedju je `git cherry-pick`. Je sledeče oblike:", + "", + "* `git cherry-pick <...>`", + "", + "Gre za jasen način, da povemo, da bi radi skopirali zaporedje commitov pod trenutno lokacijo (`HEAD`). Sam imam rad `cherry-pick`, ker je vključeno le malo čarovnije in je preprost za razumet.", + "", + "Poglejmo predstavitev!", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Tu je repozitorij, kjer imamo nekaj dela na branchu `side`, ki bi ga radi skopirali na `master`. To bi lahko dosegli z rebase-om (kar smo se že naučili), ampak poglejmo kako se odreže cherry-pick." + ], + "afterMarkdowns": [ + "To je to! Želeli smo commita `C2` in `C4` in git ju je prilimal točno pod nas. Preprosto!" + ], + "command": "git cherry-pick C2 C4", + "beforeCommand": "git checkout -b side; git commit; git commit; git commit; git checkout master; git commit;" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Za končanje te stopnje, enostavno skopiraj nekaj dela iz predstavljenih treh branchev v master. Vidiš lako, katere commite želimo, v priloženi vizualizaciji.", + "" + ] + } + } + ] } } }; diff --git a/src/levels/rampup/detachedHead.js b/src/levels/rampup/detachedHead.js index cd2f9e36..153e6050 100644 --- a/src/levels/rampup/detachedHead.js +++ b/src/levels/rampup/detachedHead.js @@ -16,7 +16,8 @@ exports.level = { "ru_RU": "Теряем голову, или detached HEAD", "ko" : "HEAD 분리하기", "uk": "Втрачаємо голову чи detached HEAD", - 'vi': "Tháo đầu cái nào" + 'vi': "Tháo đầu cái nào", + "sl_SI": "Odstranjevanje tvoje glave - HEAD" }, "hint": { "en_US": "Use the label (hash) on the commit for help!", @@ -32,7 +33,8 @@ exports.level = { "ru_RU": "Ориентируйся по идентификаторам (hash) коммитов.", "ko" : "커밋에 있는 라벨(hash)을 활용하세요!", "uk": "Орієнтуйся по індентифікаторам (hash) комітів.", - "vi": "Dùng mã băm (hash) của commit để hoàn thành!" + "vi": "Dùng mã băm (hash) của commit để hoàn thành!", + "sl_SI": "Uporabi oznako (hash) commita za pomoč!" }, "startDialog": { "en_US": { @@ -1122,6 +1124,84 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Premikanje po Gitu", + "", + "Preden se lotimo nekaj naprednejših funkcij Gita, je pomembno da razumemo različne načine premikanja po drevesu commitov, ki predstavljajo tvoj projekt.", + "", + "Ko ti je enkrat premikanje po drevesu domače, bodo tvoje sposobnosti z ostalimi git ukazi še močnejše!", + "", + "", + "", + "", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## HEAD", + "", + "Najprej moramo spozanti \"HEAD\". HEAD (glava) je simbolično ime za trenutno checkoutan commit -- v bistvu povemo nad katerim commitu bomo nadaljevali.", + "", + "HEAD vedno kaže na zadnji commit na trenutnem drevesu. Večina git ukazov, ki spreminjajo to delovno drevo, bo začelo s spremembo HEAD-a.", + "", + "Ponavadi HEAD kaže na ime brancha (npr. bugFix). Ko commitaš, je stanje bugFix spremenjeno in ta sprememba je opazna tudi skozi HEAD." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Poglejmo to v akciji. Sedaj bomo razkrili HEAD pred in po commitu." + ], + "afterMarkdowns": [ + "Evo! HEAD se je vseskozi skrival pod našim `master` branchom." + ], + "command": "git checkout C1; git checkout master; git commit; git checkout C2", + "beforeCommand": "" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "### Odstranjevanje HEAD-a", + "", + "Odstranjevanje HEAD-a pomeni samo, da ga namestno na branch sedaj pripnemo na commit. Tako je zgledalo prej:", + "", + "HEAD -> master -> C1", + "" + ], + "afterMarkdowns": [ + "Sedaj pa takole", + "", + "HEAD -> C1" + ], + "command": "git checkout C1", + "beforeCommand": "" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Za dokončanje te stopnje, odstranimo HEAD iz `bugFix` in ga pritrdimo raje na commit.", + "", + "Določi ta commit z njegovim hash-om. Hash za vsak commit je predstavljen v krogu, ki predstavlja commit." + ] + } + } + ] } } }; diff --git a/src/levels/rampup/interactiveRebase.js b/src/levels/rampup/interactiveRebase.js index 10173fe8..6ecd83b3 100644 --- a/src/levels/rampup/interactiveRebase.js +++ b/src/levels/rampup/interactiveRebase.js @@ -21,6 +21,7 @@ exports.level = { "ko" : "리베이스할 타겟으로 브랜치나 상대 참조(HEAD~)를 사용할 수 있습니다", "uk" : "ти можеш використовувати гілки чи відносні посилання (HEAD~) щоб вказувати ціль для rebase", "vi": "bạn có thể sử dụng tham chiếu tương đối (HEAD~) hoặc nhánh để chỉ định mục tiêu rebase", + "sl_SI": "uporabiš lahko bilokater branch ali relativen ref (HEAD~), da določiš cilj za rebase" }, "name": { "en_US": "Interactive Rebase Intro", @@ -36,7 +37,8 @@ exports.level = { "ru_RU": "Введение в интерактивный Rebase", "ko" : "인터랙티브 리베이스 소개", "uk" : "Знайомство з інтерактивним rebase", - "vi" : "Giới thiệu về tương tác rebase" + "vi" : "Giới thiệu về tương tác rebase", + "sl_SI": "Interaktivni uvod v Rebase" }, "startDialog": { "en_US": { @@ -948,6 +950,71 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Interaktivni Rebase", + "", + "Git cherry-pick je odličen način, ko veš katere commite bi rad (in poznaš njihove hashe) -- težko je premagati njegovo enostavnost.", + "", + "Ampak kaj pa situacija, ko ne veš katere commite želiš? K sreči ima git pokrit tudi to! Uporabimo lahko interaktivni rebase -- gre za najboljši način za pregled commitov, ki jih želiš rebaseati.", + "", + "Spustimo se v podrobnosti..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Vse kar interaktvini rebase pomeni je, da uporabimo `rebase` ukaz z opcijo `-i`.", + "", + "Če vključiš to opcijo, bo git odprl okno, da ti pokaže, kateri commiti bodo skopirani pod naš ciljni commit rebaseanja. Prav tako pokaže tudi njihove hashe in sporočila, kar je super za razumevanje kaj je kaj.", + "", + "Za \"pravi\" git, odprte oknja pomeni odprtje datoteke v urejevalniku kot je `vim`. Za naš namen sem zgradil majhno okno, ki se obnaša enako." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ko se odpre okno za interaktivno rebaseanje, imaš možnost narediti 3 stvari:", + "", + "* Enostavno lahko preurediš commite v vrstni red, ki ga želiš (v našem oknu to dosežeš kar s klikom in vlečenjem miške).", + "* Odločiš se lahko, da čisto izpustiš nekatere commite. To je omogočeno z `pick` -- izklop `pick` opcije pomeni, da bi rad commit izpustil.", + "* Nenazadnje, commite lahko tudi stisnemo. Nažalost naše stopnje tega ne podpirajo zaradi logističnih razlogov, zato bom preskočil podrobnosti tega. Toda če povzamem -- omogoča združevanje commitov.", + "", + "Super! Poglejmo primer." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Ko pritisneš gumb, se bo pojavilo interaktivno okno. Prerazporedi nekaj commitov okoli (ali pa jih odstrani z pick) in poglej rezultat!" + ], + "afterMarkdowns": [ + "Boom! Git je na dno skopiral commite v točno takšnem vrstnem redu, kot si ga določil v oknu" + ], + "command": "git rebase -i HEAD~4 --aboveAll", + "beforeCommand": "git commit; git commit; git commit; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Za dokončanje te stopnje naredi interaktvini rebase in doseži vrstni red, kot je predstavljen v ciljni vizualizaciji. Vedno lahko razveljavjiš z `undo` ali ponastaviš z `reset` ukazom, da popraviš napake :D" + ] + } + } + ] } } }; diff --git a/src/levels/rampup/relativeRefs.js b/src/levels/rampup/relativeRefs.js index 3667b4bd..a7c991c3 100644 --- a/src/levels/rampup/relativeRefs.js +++ b/src/levels/rampup/relativeRefs.js @@ -16,7 +16,8 @@ exports.level = { "ru_RU": "Относительные ссылки (^)", "ko" : "상대 참조 (^) (Relative Refs)", "uk": "Відносні посилання", - "vi": "Tham chiếu tương đối (^)" + "vi": "Tham chiếu tương đối (^)", + "sl_SI": "Relativne Reference (^)" }, "hint": { "en_US": "Remember the Caret (^) operator!", @@ -32,7 +33,8 @@ exports.level = { "ru_RU": "Не забудь оператор `^`", "ko" : "(^)연산자를 기억하세요!", "uk": "Не забудь оператор `^`", - "vi": "Đừng quên dấu mũ (^)!" + "vi": "Đừng quên dấu mũ (^)!", + "sl_SI": "Spomni se na (^) operator!" }, "startDialog": { "en_US": { @@ -1084,6 +1086,81 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Relativne Reference", + "", + "Premikanje po Gitu z določanjem hashev commitov je lahko včasih nerodno. V praksi ne boš imel na voljo lepe vizualizacije drevesa zraven ukaznega terminala, zato boš moral uporabljati `git log`, da boš videl hashe.", + "", + "Nadaljne, hashi so ponavadi v praksi tudi veliko daljši. Naprimer, hash commita predstavljenega v prejšnji stopnji je `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Ni ravno preprosto za izgovoriti ...", + "", + "Pozitivna stran je, da je Git pameten glede hashev. Zahteva, da napišeš le toliko znakov hasha, da lahko prepozna unikaten commit. Tako lahko napišem `fed2` namesto dolge verzije zgoraj." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Kot sem rekel, izbiranje commitov po njihovih commitih ni ravno najpriročnejša stvar na svetu, zato ima Git relativne reference. In te so super!", + "", + "Z relativni referencami, lahko izhajaš iz nekje (npr. branch `bugFix` ali `HEAD`) in delaš od tam.", + "", + "Relativni commiti so mogočni, ampak tu bomo predstavili dva preprosta:", + "", + "* Premikanje navzgor en commit naenkrat z `^`", + "* Premikanje navzgor num-krat z `~`" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Pogljemo najprej operator `^`. Vsakič, ko pripneš to imenu reference, poveš Gitu naj najde starša tega commita.", + "", + "Torej `master^` je isto kot \"prvi starš brancha `master`\".", + "", + "`master^^` je stari starš (prednik druge generacije) `master`", + "", + "Checkoutajmo sedaj commit nad masterjem" + ], + "afterMarkdowns": [ + "Boom! Narejeno. Veliko enostavneje kot tipkanje hasha commita" + ], + "command": "git checkout master^", + "beforeCommand": "git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Prav tako se lahko sklicuješ na `HEAD` kot relativno referenco. Uporabimo to nekajkrat, da se pomakenmo višje po drevesu commitov" + ], + "afterMarkdowns": [ + "Enostavno! Lahko potujemo nazaj v čas z `HEAD^`" + ], + "command": "git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^", + "beforeCommand": "git commit; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Za dokončanje te stopnje, checkoutaj starša commita `bugFix`. To bo razdružilo `HEAD`.", + "", + "Hash lahko določiš, če želiš, ampak probaj raje z relativnimi referencami!" + ] + } + } + ] } } }; diff --git a/src/levels/rampup/relativeRefs2.js b/src/levels/rampup/relativeRefs2.js index 9caf5b02..43187202 100644 --- a/src/levels/rampup/relativeRefs2.js +++ b/src/levels/rampup/relativeRefs2.js @@ -16,7 +16,8 @@ exports.level = { "ru_RU": "Понадобится использовать как минимум одну прямую ссылку (хеш), чтобы пройти этот уровень", "ko" : "이번 레벨을 완료하려면 최소 한번은 직접 참조(해시)를 사용해야 합니다.", "uk": "Тобі потрібно використати як мінімум одне пряме посилання (хеш) щоб пройти цей рівень", - "vi": "Bạn sẽ cần dùng ít nhất một tham chiếu trực tiếp (mã băm) để hoàn thành cấp độ này" + "vi": "Bạn sẽ cần dùng ít nhất một tham chiếu trực tiếp (mã băm) để hoàn thành cấp độ này", + "sl_SI": "Moral boš uporabiti vsaj eno direktno referenco (hash) za dokončanje te stopnje" }, "name": { "en_US": "Relative Refs #2 (~)", @@ -33,7 +34,7 @@ exports.level = { "ko" : "상대 참조 #2 (~)", "uk": "Відносні посилання №2", "vi": "Tham chiếu tương đối #2 (~)", - + "sl_SI": "Relativne Reference #2 (~)" }, "startDialog": { "en_US": { @@ -984,6 +985,75 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Operator \"~\"", + "", + "Recimo, da se želiš premakniti veliko stopenj višje po drevesu commitov. Malo je nerodno večkrat tipkati `^`, zato ima Git tudi tilda (~) operator.", + "", + "", + "Tild operator (opcijsko) sprejme številko, ki določi, koliko staršev bi se rad povzpel po drevesu. Poglejmo to v praksi" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Določimo število prejšnjih commitov z `~`." + ], + "afterMarkdowns": [ + "Boom! Tako jedrnato -- relativne reference so super." + ], + "command": "git checkout HEAD~4", + "beforeCommand": "git commit; git commit; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Forcanje Branchev", + "", + "Sedaj si strokovnjak za relativne reference, zato jih končno *uporabimo* za nekaj.", + "", + "Eden izmed najpogostejših načinov, kjer uporabljam relativne reference je za premikanje branchev naokoli. Direktno lahko premakneš branch na nek commit z `-f` opcijo. Takole nekako:", + "", + "`git branch -f master HEAD~3`", + "", + "premakne (s force-om) master branch tri commite za HEAD." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Poglejmo si prejšnji ukaz v praksi." + ], + "afterMarkdowns": [ + "Tako ja! Relativne reference so nam dale jedrnat način s katerim se lakho nanašamo na `C1` in branch force-anje (`-f`) nam je omogočilo, da hitro prestavimo branch na to lokacijo." + ], + "command": "git branch -f master HEAD~3", + "beforeCommand": "git commit; git commit; git commit; git checkout -b bugFix" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Sedaj ko smo si pogledali relativne reference in force branchanje v kombinaciji, uporabimo to, da rešimo naslednjo stopnjo.", + "", + "Za dokončanje te stopnje, premakni `HEAD`, `master` in `bugFix` na njihove ciljne prikazane destinacije." + ] + } + } + ] } } }; diff --git a/src/levels/rampup/reversingChanges.js b/src/levels/rampup/reversingChanges.js index 2b5c188f..9ee409be 100644 --- a/src/levels/rampup/reversingChanges.js +++ b/src/levels/rampup/reversingChanges.js @@ -18,7 +18,7 @@ exports.level = { "ru_RU": "Отмена изменений в Git", "uk": "Відміна змін в Git", "vi": "Hoàn tác thay đổi trong Git", - + "sl_SI": "Revertanje Sprememb v Gitu" }, "hint": { "en_US": "Notice that revert and reset take different arguments.", @@ -35,6 +35,7 @@ exports.level = { "ru_RU": "Обрати внимание, что revert и reset принимают разные параметры.", "uk": "Зверни увагу на те що revert та reset приймають різні параметри", "vi": "Lưu ý rằng hoàn tác(revert) và đặt lại(reset) có những đối số khác nhau.", + "sl_SI": "Revert in reset sprejmeta različne argumente" }, "startDialog": { "en_US": { @@ -920,6 +921,69 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Revertanje Sprememb v Gitu", + "", + "Veliko načinov je, kako revertati (razveljaviti) spremembe v Gitu. In tako kot commitanje ima tudi revertanje sprememb v Gitu low-level komponente (stageanje posameznih datotek ali kosov) in high-level komponente (kako so spremembe dejansko povrnjene). Naša aplikacija se bo osredotočila na slednje.", + "", + "Obstajata dva glavna načina kako razveljaviti spremembe v Gitu -- prvi je uporaba `git reset` in drugi je uporaba `git revert`. V naslednjem dialogu si bomo pogledali oba pristopa.", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "## Git Reset", + "", + "`git reset` povrne spremembe tako, da prestavi referenco brancha na starejši commit. Lahko si predstavljaš kot \"pisanje zgodovine na novo;\" `git reset` bo prestavil branch nazaj, kot da se commiti sploh niso zgodili.", + "", + "Poglejmo kako to izgleda:" + ], + "afterMarkdowns": [ + "Lepo! Git je premaknil master branch referenco nazaj na `C1`; sedaj je naš lokalen repozitorij v stanju, kot da se `C2` sploh ni nikoli zgodil." + ], + "command": "git reset HEAD~1", + "beforeCommand": "git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "## Git Revert", + "", + "Medtem ko ponastavljanje z reset deluje super na lokalnih brancih na tvoji mašini, njegova metoda \"prepisovanja zgodovina\" ne deluje na remote brancih, ki jih uporabljajo drugi.", + "", + "Če želimo ponastaviti spremembe in *deliti* te ponastavitve z drugimi, moramo uporabiti `git revert`. Poglejmo si to v praksi" + ], + "afterMarkdowns": [ + "Čudno, nov commit se je naredil pod commitom, ki smo ga želeli reversati. To je zato, ker ta nov commit `C2'` uvede *spremembe* -- spremembe so pač v tem primeru točno nasprotne od `C2`.", + "", + "Z revertanjem lahko pushas in deliš svoje spremembe tudi z drugimi." + ], + "command": "git revert HEAD", + "beforeCommand": "git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Za dokončanje te stopnje, povrni oba zadnja commita, tako na `local` kot na `pushed` brancih. Skupno boš revertal dva commita (enega na branch).", + "", + "Upoštevaj, da je `pushed` oddaljen branch in `local` lokalen branch -- to bi ti moralo pomagati izbrati metodo." + ] + } + } + ] } } }; diff --git a/src/levels/rebase/manyRebases.js b/src/levels/rebase/manyRebases.js index 81ecf091..a15ade85 100644 --- a/src/levels/rebase/manyRebases.js +++ b/src/levels/rebase/manyRebases.js @@ -21,7 +21,8 @@ exports.level = { "zh_TW": "N次Rebase", "ru_RU": "Rebase over 9000 раз", "uk" : "Rebase over 9000 разів", - "vi" : "Rebase hơn 9000 lần" + "vi" : "Rebase hơn 9000 lần", + "sl_SI": "Več kot 9000 Rebaseov" }, "hint": { "en_US": "Remember, the most efficient way might be to only update master at the end...", @@ -37,7 +38,8 @@ exports.level = { "zh_TW": "要記住喔! 把 master branch 留到最後更新可能是最有效率的方法。", "ru_RU": "Не забудь, что лучше всего сдвинуть мастер в самом конце...", "uk" : "Не забувай, що краще всього буде перемістити master в самому кінці... ", - "vi" : "Hãy nhớ rằng, cách tốt nhất có lẽ là nên cuối cùng mới cập nhật nhánh `master`... " + "vi" : "Hãy nhớ rằng, cách tốt nhất có lẽ là nên cuối cùng mới cập nhật nhánh `master`... ", + "sl_SI": "Pomni, morda je najbolj učinkovit način posodabljanje masterja samo na koncu ..." }, "startDialog": { "en_US": { @@ -291,6 +293,23 @@ exports.level = { } } ] + },"sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Rebasing Večih Branchev", + "", + "Uf, tu imamo pa res veliko branchev! Pojdimo in rebaseajmo vse delo iz teh branchev na master.", + "", + "Toda vodstvo se je odločilo, da le ne bo tako preprosto -- žeijo da so vsi commiti v zaporednem vrstnem redu. To pomeni, da bo naše ciljno drevo moralo imeti `C7'` na dnu, `C6'` nad njim, in tako dalje po vrsti.", + "", + "Če med reševanjem zamočiš, preprosto uporabi `reset`, da začneš znova. Poglej tudi našo rešitev in preveri, če lahko stopnjo rešiš še z manj ukazi!" + ] + } + } + ] } } }; diff --git a/src/levels/rebase/selectiveRebase.js b/src/levels/rebase/selectiveRebase.js index 288390b1..00720f09 100644 --- a/src/levels/rebase/selectiveRebase.js +++ b/src/levels/rebase/selectiveRebase.js @@ -20,7 +20,8 @@ exports.level = { "zh_TW": "branch 漿糊", "ru_RU": "Спутанные ветки", "uk" : "Макарони з гілок", - "vi" : "Nhánh rối như canh hẹ" + "vi" : "Nhánh rối như canh hẹ", + "sl_SI": "Špageti iz Branchev" }, "hint": { "en_US": "Make sure to do everything in the proper order! Branch one first, then two, then three", @@ -36,7 +37,8 @@ exports.level = { "zh_TW": "確認你是按照正確的順序來操作!先操作 branch `one`, 然後 `two`, 最後才是 `three`", "ru_RU": "Убедись, что у нас всё по порядку! Сначала ветка `one`, потом `two` и только потом `three`", "uk": "Переконайся, що все йде за порядком! Спершу гілка `one`, потім `two`, і тільки потім `three`", - "vi": "Hãy chắc chắn rằng bạn làm đúng thứ tự! Nhánh `one` trước, rồi `two`, rồi mới đến `three`" + "vi": "Hãy chắc chắn rằng bạn làm đúng thứ tự! Nhánh `one` trước, rồi `two`, rồi mới đến `three`", + "sl_SI": "Glej da boš vse opravil v pravilnem vrstnem redu! Najprej branch ena, nato pa dva in tri" }, "startDialog": { "en_US": { @@ -318,6 +320,25 @@ exports.level = { } } ] - } + },"sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Špageti iz Branchev", + "", + "WOAHHHhhh Miško! Ta stopnja bo pa pravi izziv.", + "", + "Tu imamo `master`, ki je nekaj commitov pred branchi `one`, `two` in `three`. Iz neznanega razloga moramo posodbiti te tri druge branche z modificiranimi različicami zadnjih nekaj commitov na masterju.", + "", + "Branch `one` potrebuje prerazporeditev in izbris `C5`. `two` rabi samo prerazporeditev, `three` pa potrebuje samo en commit!", + "", + "Prepustili ti bomo da ugotovi kako tole rešiti -- vseeno lahko na koncu preveriš našo rešitev s `show solution`. " + ] + } + } + ] + }, } }; diff --git a/src/levels/remote/clone.js b/src/levels/remote/clone.js index 540488d7..fc54f41d 100644 --- a/src/levels/remote/clone.js +++ b/src/levels/remote/clone.js @@ -15,7 +15,8 @@ exports.level = { "ru_RU": "Введение в клонирование", "ko" : "Clone 소개", "uk" : "Знайомство з clone", - "vi" : "Giới thiệu về clone" + "vi" : "Giới thiệu về clone", + "sl_SI": "Uvod v Git Clone" }, "hint": { "en_US": "Just git clone!", @@ -31,7 +32,8 @@ exports.level = { "ru_RU": "Простой git clone!", "ko" : "그냥 git clone 하세요!", "uk" : "Просто git clone!", - "vi" : "Đơn giản là `git clone`!" + "vi" : "Đơn giản là `git clone`!", + "sl_SI": "Preprosto samo git clone!" }, "startDialog": { "en_US": { @@ -830,6 +832,63 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Oddaljeni Git", + "", + "Oddaljeno repozitoriji sploh niso tako zakomplicirani. V današnjem svetu oblačnih storitev si lahko kdo predstavlja, da je veliko čarovnije za oddaljnim Gitom, a gre preprosto za tvoj repozitorij na drugem računalniku. Ponavadi lahko komuniciraš s tem računalnikom preko interneta, ki ti omogoča da prenašaš commite naprej in nazaj.", + "", + "Poleg tega imajo oddaljeni repozitoriji tudi veliko super lastnosti:", + "", + "- Prvič, oddaljenost služi za odlično rezervo! Lokalni git repozitoriji imajo možnost obnovitve datotek v prejšnje stanje (kot že veš), ampak vse te informacije so shranjene lokalno. S tem da imaš shranjene kopije gita na drugih računalnikih, lahko izgubiš vse tvoje lokalne podatke, pa imaš še zmeraj opcijo nadaljevati, kjer si ostal.", + "", + "- Še pomembneje, kodiranje lahko naredijo družabno! Sedaj, ko je kopija tvojega projekta nekje objavljena, lahko tvoji prijatelji pomagajo tvojemu projektu (ali pridobijo zadnje spremembe) zelo enostavno.", + "", + "Uporaba strani, ki vizualizirajo oddaljene repozitorije je postala zelo popularna (npr. [Github](https://github.com/) ali [Phabricator](http://phabricator.org/)), ampak bistvo teh strani vseeno predstavljajo oddaljeni repozitoriji. Zato je pomembno, da jih razumemo!" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Naši Ukazi za kreiranje oddaljenih repozitorijev", + "", + "Do te točke, se je Learn Git Branching osredotočil na učenje osnov dela na lokalnih repozitorijih (branching, merging, rebasing, itd). Ampak sedaj, ko se hočemo naučiti še o delu na oddaljenih repozitorijih, potrebujemo ukaz, da postavi okolje za te lekcije. `git clone` bo ta ukaz.", + "", + "Tehnično je `git clone` v pravem svetu ukaz, ki ga boš uporabil za ustvarjanje lokalnih kopij oddaljenih repozitorijev (iz githuba naprimer). Mi uporabljamo ta ukaz nekoliko drugače na Learn Git Branching -- `git clone` ubistvu naredi oddaljen repozitorij iz tvojega lokalnega. Seveda, tehnično je nasproten pomen pravega ukaza, ampak pomaga ustvariti povezavo med kloniranjem in delom na oddaljenem repozitoriju, zato ga zdaj pač uporabljajmo.", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Začnimo počasi in poglejmo kako izgleda oddaljen repozitorij (v naši vizualizaciji).", + "" + ], + "afterMarkdowns": [ + "Evo ga! Sedaj imamo oddaljen repozitorij našega projekta. Izgleda precej podoben razen nekaj vizalnih sprememb, da se opazi razlika -- v kasnejših stopnjah boš spoznal, kako si delimo delo preko teh repozitorijev." + ], + "command": "git clone", + "beforeCommand": "" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Za dokončanje te stopnje, uporabi `git clone` na svojem obstoječem repozitoriju. Pravo učenje pride v lekcijah, ki sledijo." + ] + } + } + ] } } }; diff --git a/src/levels/remote/fakeTeamwork.js b/src/levels/remote/fakeTeamwork.js index d5ceb56c..a9789817 100644 --- a/src/levels/remote/fakeTeamwork.js +++ b/src/levels/remote/fakeTeamwork.js @@ -16,7 +16,8 @@ exports.level = { "ru_RU": "Коллективная работа", "uk" : "Симуляція колективної роботи", "ko" : "가짜 팀워크", - "vi" : "Giả lập làm việc nhóm" + "vi" : "Giả lập làm việc nhóm", + "sl_SI": "Lažno Ekipno Delo" }, "hint": { "en_US": "remember you can specify the number of commits to fake", @@ -32,7 +33,8 @@ exports.level = { "ru_RU": "помните, Вы можете указать количество фейковых коммитов", "uk" : "пам’ятай що ти можеш вказати кількість фейкових комітів", "ko" : "가장할 커밋의 갯수를 조절할 수 있습니다.", - "vi" : "Nhớ rằng bạn có thể chỉ định số lượng commit để giả lập." + "vi" : "Nhớ rằng bạn có thể chỉ định số lượng commit để giả lập.", + "sl_SI": "pomni da lahko določiš število lažnih commitov" }, "startDialog": { "en_US": { @@ -792,6 +794,60 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Simulacija sodelovanja", + "", + "Tule imamo izziv -- za nekaj naslednjih lekcij te moramo naučiti kako potegniti dol spremembe, ki so bile narejene na oddaljenem repozitoriju.", + "", + "To pomeni, da se moramo pravzaprav \"pretvarjati\", da je oddaljen branch posodobil kak sodelavec, včasih na določenem branchu ali določeno število commitov.", + "", + "Da bi to lahko naredili, smo uvedli ukaz `git fakeTeamwork`! Poglejmo prikaz ..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Privzeto delovanje `fakeTeamwork` je, da samo doda commit na master" + ], + "afterMarkdowns": [ + "Tako -- oddaljen repo je bil posodobljen z novim commitom, katerega še nismo potegnili k sebi, ker še nismo pognali ukaza `git fetch`." + ], + "command": "git fakeTeamwork", + "beforeCommand": "git clone" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Prav tako lahko določimo tudi število commtiov ali ime brancha tako, da jih dodamo na koncu" + ], + "afterMarkdowns": [ + "Z enim ukazom smo simulirali sodelavca, ki je dodal tri commite na `foo` branch na našem oddaljnem repotu" + ], + "command": "git fakeTeamwork foo 3", + "beforeCommand": "git branch foo; git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Naslednje stopnje bodo precej težke, zato od tebe v tej stopnji zahtevamo še več.", + "", + "Naredi oddaljen repo (z `git clone`), simuliraj nekaj sprememb na tem repotu, sam commitaj, nato pa potegni dol spremembe. Kot da bi bilo več lekcij v eni!" + ] + } + } + ] } } }; diff --git a/src/levels/remote/fetch.js b/src/levels/remote/fetch.js index 8934dfa5..c92ec6d3 100644 --- a/src/levels/remote/fetch.js +++ b/src/levels/remote/fetch.js @@ -16,7 +16,8 @@ exports.level = { "ru_RU": "Git fetch", "uk" : "Git fetch", "ko" : "Git Fetch", - "vi" : "Git Fetch" + "vi" : "Git Fetch", + "sl_SI": "Git Fetch" }, "hint": { "en_US": "just run git fetch!", @@ -32,7 +33,8 @@ exports.level = { "ru_RU": "Просто выполните git fetch!", "uk" : "Просто виконай git fetch!", "ko" : "그냥 git fetch를 하세요!", - "vi" : "Gõ git fetch là được!" + "vi" : "Gõ git fetch là được!", + "sl_SI": "le izvedi git fetch!" }, "startDialog": { "en_US": { @@ -1056,6 +1058,79 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Fetch", + "", + "Delanje z git oddaljnemi repoti je v bistvu le premikanje podatkov na in z drugih repozitorijev. Dokler lahko pošiljamo commite naprej in nazaj, lahko delimo bilokakšno posodobitev, kateri git sledi (in posledično delimo delo, nove datoteke, nove ideje, ljubezenska pisma, itd.).", + "", + "V tej lekciji se bomo naučili kako fetchat (prenesti) podatke iz oddaljenega repozitorija -- ukaz za to je poimenovan `git fetch`.", + "", + "Opazil boš, da ko posodobimo našo predstavitev oddaljenega repota, se bo naša oddaljena veja posodobila in imela nove spremembe. To se navezuje na prejšnjo lekcijo o oddaljenih repozitorijih" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Preden se spustimo v podrobnosti `git fetch` ga poglejmo v akciji! Tu imamo oddaljen repozitorij, ki vsebuje dva commita, ki jih naš lokalen repozitorij nima." + ], + "afterMarkdowns": [ + "Tako! Commita `C2` in `C3` sta bila prenesena v naš lokalen repozitorij in naš oddaljen branch `o/master` je bil posodobljen, da to odraža." + ], + "command": "git fetch", + "beforeCommand": "git clone; git fakeTeamwork 2" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Kaj fetch naredi", + "", + "`git fetch` naredi dve stvari. In sicer:", + "", + "* prenese commite, ki jih ima oddaljeni repo ampak manjkajo v našem lokalnem in ...", + "* posodobi, kam kaže naš oddaljeni branch (naprimer `o/master`)", + "", + "`git fetch` v bistvu našo lokalno predstavitev oddaljenega repozitorija uskladi z dejanskim stanjem na oddaljenem repozitoriju.", + "", + "Če se spomneš še iz prejšnje lekcije smo rekli, da oddaljeni branchi odsevajo stanje na oddaljenih repozitorijih odkar si komuniciral z njimi. `git fetch` je način, da komuniciraš z njimi! Upam, da je sedaj povezava med oddaljenimi repozitoriji in `git fetch` jasna.", + "", + "`git fetch` ponavadi komunicira z oddaljenimi repozitoriji preko interneta (s protokolom kot sta `http://` ali `git://`).", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Kaj fetch ne naredi", + "", + "`git fetch` ne spremeni ničesar glede tvojega lokalnega stanja. Ne bo posodobil tvojega `master` brancha ali spremenil česarkoli v tvojih datotekah.", + "", + "To je pomembno razumeti, ker veliko razvijalcev misli, da bo `git fetch` posodobil njihovo lokalno stanje s stanjem na oddaljenem repozitoriju. Lahko bo prenesel vse potrebne podatke, da to izvede, ampak v bistvu _ne_ spremeni tvojih datotek. V kasnejših lekcijah se bomo naučili ukaze, ki pa naredijo točno to. :D", + "", + "Torej na koncu dneva, izvajanje `git fetch` si lahko predstavljate kot korak za prenašanje." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Za dokončanje te stopnje uporabi `git fetch` in prenesi vse commite!" + ] + } + } + ] } } }; diff --git a/src/levels/remote/fetchArgs.js b/src/levels/remote/fetchArgs.js index 92dd8016..274484f2 100644 --- a/src/levels/remote/fetchArgs.js +++ b/src/levels/remote/fetchArgs.js @@ -16,7 +16,8 @@ exports.level = { "ru_RU": "Аргументы для fetch", "ko" : "Fetch의 인자들", "uk" : "Аргументи для fetch", - "vi" : "Tham số fetch" + "vi" : "Tham số fetch", + "sl_SI": "Fetch argumenti" }, "hint": { "en_US": "Pay attention how the commit ids may have swapped! You can read slides again with \"help level\"", @@ -32,7 +33,8 @@ exports.level = { "ru_RU": "Обратите внимание на то, как номера коммитов могут меняться! Вы можете прочесть слайды вновь, воспользовавшись командой \"help level\"", "ko" : "커밋 ID가 바뀔수도있으니 주의하세요! \"help level\"을 입력하면 슬라이드들을 다시 읽어볼수 있습니다.", "uk" : "Зверни увагу на те, що номери комітів можуть змінюватися! Слайди уроку можна переглянути ще раз командою \"help level\"", - "vi" : "Lưu ý id của các commit bị tráo đổi, bạn có thể dùng \"help level\" để đọc lại hội thoại" + "vi" : "Lưu ý id của các commit bị tráo đổi, bạn có thể dùng \"help level\" để đọc lại hội thoại", + "sl_SI": "Bodi pozoren kako so se commit id-ji morda zamenjali! Ponovno lahko prebereš navodila z \"help level\"" }, "startDialog": { "en_US": { @@ -1633,6 +1635,129 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git fetch argumenti", + "", + "Torej pravkar smo se naučili vse o git push argumentih, tem kul `` parameteru in celo stolpičnem refspecsu (`:`). Torej uporabimo vse znanje tudi za `git fetch`?", + "", + "Itak! Argumenti za `git fetch` so v bistvu *zelo zelo* podobni tistim za `git push`. Gre za enak koncept ampak uporabljen v nasprotni smeri (ker sedaj prenašamo commite namesto, da jih nalagamo).", + "", + "Pojdimo čez koncepte drug za drugim ..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### `` parameter", + "", + "Če podaš mesto poleg git fetcha kot v naslednjem ukazu:", + "", + "`git fetch origin foo`", + "", + "Bo Git šel na `foo` branch na oddaljenem repotu, pograbil vse commite, katerih lokalno še nimamo in jih dodal na dno lokalnega `o/foo` brancha.", + "", + "Poglejmo to v akciji (samo kot osvežitev)" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Z določanjem mesta ..." + ], + "afterMarkdowns": [ + "Prenesemo samo commite iz `foo` in jih postavimo na `o/foo`" + ], + "command": "git fetch origin foo", + "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Morda se sprašuješ -- zakaj je got dodal te commite na `o/foo` oddaljen branch namesto, da bi jih dodal na moj lokalen `foo` branch? Mislil sem da je `` parameter mesto, ki obstaja in lokalno in na oddaljenem repozitoriju?", + "", + "No, git naredi v tem primeru posebno izjemo, ker imaš morda delo na `foo` branchu, ki ga ne želiš pokvariti!! To se navezuje na prejšnjo lekcij o `git fetch` -- ne posodobi tvojega lokalnega ne-oddaljenega brancha, samo prenense commite (da jih lahko pregledaš / mergaš kasneje).", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "\"Ampak v tem primeru, kaj se zgodi, če posebaj določim izvor in cilj s `:`?\"", + "", + "Če se počutiš dovolj strastno, da bi fetchal commite *direktno* na lokalen branch, potem ja, lahko to definiraš s stolpično referenco. Ne moreš fetchati commitov na branch, ki je checkoutan, ampak v drugih primerih to lahko narediš.", + "", + "Tu je edina zanka -- `` je sedaj mesto na *oddaljenem* in `` je *lokalno* mesto za dodati te commite. Je ravno nasprotje od git pusha in to je logično, saj prenašamo podatke v nasprotni smeri!", + "", + "Glede na to, razvijalci to redko delajo v praksi. To predstavljam zgolj, da si lahko predstavljaš kako sta si `fetch` in `push` kar podobna, ampak v nasprotni smeri." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Poglejmo si to zmešnjavo v praksi:" + ], + "afterMarkdowns": [ + "Wow! Vidiš, git je naredil `foo~1` kot mesto na originu in nato prenesel commite na `bar` (ki je bil lokalen branch). Opazi kako `foo` in `o/foo` nista bila posodobljena, ker smo določili destinacijo." + ], + "command": "git fetch origin foo~1:bar", + "beforeCommand": "git branch foo; git clone; git branch bar; git fakeTeamwork foo 2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Kaj pa če destinacija ne obstaja, preden zaženem ukaz? Poglejmo zadnji primer, vendar brez da bi prej `bar` že obstajal." + ], + "afterMarkdowns": [ + "Vidiš, je TAKO kot git push. Git je naredil destinacijo lokalno pred fetchem, tako kot bo naredil destinacijo na oddaljneme repotu pred pushem (če ne obstaja)." + ], + "command": "git fetch origin foo~1:bar", + "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Ni argumentov?", + "", + "Če `git fetch` ne prejme argumentov, prenese vse commite iz oddaljenega repota na vse oddaljene branche ..." + ], + "afterMarkdowns": [ + "Precej enostavno, ampak vredno, da gremo čez vsaj enkrat." + ], + "command": "git fetch", + "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork master" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ok, dovolj govorjenja! Da zaključiš to stopnjo, fetchaj samo določene commite iz ciljne vizualizacije. Razturaj te ukaze!", + "", + "Določiti boš moral izvor in cilj za oba fetch ukaza. Bodi pozoren na ciljno vizualizacijo, saj so lahko IDji obrnjenji okoli!" + ] + } + } + ] } } }; diff --git a/src/levels/remote/fetchRebase.js b/src/levels/remote/fetchRebase.js index b7528bcf..45716c60 100644 --- a/src/levels/remote/fetchRebase.js +++ b/src/levels/remote/fetchRebase.js @@ -16,7 +16,8 @@ exports.level = { "ru_RU": "Расхождение в истории", "uk" : "Розбіжності в історії", "ko" : "엇갈린 히스토리", - "vi" : "Dị biệt lịch sử" + "vi" : "Dị biệt lịch sử", + "sl_SI": "Razdeljena zgodovina" }, "hint": { "en_US": "check out the ordering from the goal visualization", @@ -32,7 +33,8 @@ exports.level = { "ru_RU": "проверьте сортировку в визуализации цели", "uk" : "перевірте порядок в візуалізації цілі", "ko" : "순서는 goal을 참고하세요", - "vi" : "kiểm tra kỹ thứ tự trên mô hình mục tiêu" + "vi" : "kiểm tra kỹ thứ tự trên mô hình mục tiêu", + "sl_SI": "preveri vrstni red iz ciljne vizualizacije" }, "startDialog": { "en_US": { @@ -2037,6 +2039,149 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Razdeljeno Delo", + "", + "Zaenkrat smo videli kako `pullat` dol commite od ostalih in kako `pushat` naše spremembe. Izgleda dokaj preprosto, vendar kako lahko vseeno to mede ljudi?", + "", + "Težave nastopijo, ko se zgodovina repozitorijev *razdeli*. Preden se lotimo podrobnosti si poglejmo primer ...", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Predstavljaj si da scloniraš repozitorij v ponedeljek in začneš delati na novi fukncionalnosti. V petek si pripravljen da objaviš svoje sprememebe -- ampak o ne! Tvoji sodelavci so napisali goro kode med tednom in tvoja funkcionalnost je postala zastarela. Prav tako so objavili te commite v skupen repozitorij, tako da sedaj *tvoje* delo izhaja iz *stare* verzije projekta, ki ni več taprava.", + "", + "V tem primeru je ukaz `git push` dvoumen. Če bi pognal `git push`, bi git moral spremeniti oddaljeni repozitorij nazaj na stanje iz ponedeljka? Bi moral poizkusiti dodati tvoje delo, brez da odstarani novo kodo? Ali bi moral povsem ignorirati tvoje spremembe, ker so zastarele?", + "", + "Ker je toliko dvomov v tej situaciji (kjer se je zgodovina razdelila), ti git ne pusti, da bi `pushal` svoje spremembe. V bistvu te prisili da vključiš zadnje stanje oddaljenega repozitorija preden lahko deliš svoje delo." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Toliko govorjenja! Poglej stvar v praksi" + ], + "afterMarkdowns": [ + "Vidiš? Nič se ni spremenilo, ker je ukaz spodeletel. `git push` spodleti, ker tvoj zadnji commit `C3` izhaja iz oddaljenega `C1`. Oddaljen repozitorij se je med tem posodbil na `C2`, zato git zavrne tvoj push" + ], + "command": "git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Kako rešiti to zagato? Enostavno je, vse kar moraš narediti je, da spremeniš, da tvoje delo izhaja iz zadnje verzije oddaljenega brancha.", + "", + "Obstaja nekaj načinov, da to narediš, ampak najbol naraven način je, da to narediš z rebaseom. Poglejmo, kako to izgleda." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Če sedaj rebaseamo, namesto da pushamo ..." + ], + "afterMarkdowns": [ + "Boom! Posodobili smo našo lokalno reprezentacijo oddaljenega repozitorija z `git fetch`, rebaseali naše delo, da vsebuje nove spremembe iz oddaljenega repota, nato pa naložili svoje delo z `git push`" + ], + "command": "git fetch; git rebase o/master; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "So še drugi načini, da posodobim svoj delo, ko je bil oddaljen repozitorij posodobljen? Seveda! Poglejmo isto stvar, vendar tokrat z `mergeom`.", + "", + "Čeprav `git merge` ne premakne tvojega dela (ampak naredi samo merge commit), je to način da sporočiš gitu, da si vključil vse spremembe iz oddaljenega repota. To je zato, ker je oddaljen branch sedaj *prednik* tvojega brancha, kar pomeni, da tvoj commit sedaj vsebuje vse commite iz oddaljenega brancha.", + "", + "Poglejmo predstavitev tega ..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Če sedaj uporabimo merge namesto rebasea ..." + ], + "afterMarkdowns": [ + "Boom! Posodobili smo našo lokalno sliko oddaljenega repozitorija z `git fetch`, *zmergali* novo delo v naše delo (kot odraz novih sprememb na oddaljenem branchu) in jih nato naložili z `git push`" + ], + "command": "git fetch; git merge o/master; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Super! A obstaja način, da naredim vse to brez tipkanja toliko ukazov?", + "", + "Seveda -- `git pull` že poznaš in je bližnjica za fetch ter merge. Prikladno je tudi `git pull --rebase` bližnjica za fetch in rebase!", + "", + "Poglejmo te kratke ukaze na delu." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Najprej z `--rebase` ..." + ], + "afterMarkdowns": [ + "Enako kot prej! Le dosti krajše." + ], + "command": "git pull --rebase; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "In sedaj z navadnim `pullom`" + ], + "afterMarkdowns": [ + "Zopet enako kot prej!" + ], + "command": "git pull; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Vse to fetchanje, rebasanje/merganje in pushanje je kar pogosto. V prihodnjih lekcijah bomo preučili težje različice teh postopkov, ampak najprej preizkusimo tega.", + "", + "Da rešiš to stopnjo, izvedi sledeče korake:", + "", + "* Kloniraj svoj repozitorij", + "* Naredi lažni commit ostale ekipe (1 commit)", + "* Commitaj nekaj svojega dela (1 commit)", + "* Objavi svoje delo z *rebaseom*" + ] + } + } + ] } } }; diff --git a/src/levels/remote/lockedMaster.js b/src/levels/remote/lockedMaster.js index 143e90a6..79de89c6 100644 --- a/src/levels/remote/lockedMaster.js +++ b/src/levels/remote/lockedMaster.js @@ -9,7 +9,8 @@ exports.level = { "zh_CN": "从本地的master创建一个feature分支, 然后重置master和origin master保持一致。", "es_ES": "Crea la rama feature desde la rama master en local antes de restablecerlo para que sea el mismo que la rama master de origen", "fr_FR": "Créer la branche feature à partir du master local, avant de la restaurer dans le même état que o/master", - "ko" : "로컬 저장소의 master 브랜치로부터 feature 브랜치를 만드세요. 그리고 o/master와 같아질 수 있도록 로컬 저장소의 master 브랜치를 reset 하세요." + "ko" : "로컬 저장소의 master 브랜치로부터 feature 브랜치를 만드세요. 그리고 o/master와 같아질 수 있도록 로컬 저장소의 master 브랜치를 reset 하세요.", + "sl_SI": "Naredi feature branch iz lokalnega masterja preden ga ponastaviš, da bo enak kot origin master " }, "name": { "en_US": "Locked Master", @@ -18,7 +19,8 @@ exports.level = { "zh_CN": "锁定的Master(Locked Master)", "es_ES": "Master bloqueado", "fr_FR": "Master verrouillé", - "ko" : "잠겨버린 Master" + "ko" : "잠겨버린 Master", + "sl_SI": "Zaklenjen Master" }, "startDialog": { "en_US": { @@ -306,5 +308,45 @@ exports.level = { } ] }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Oddaljena Zavrnitev!", + "", + "Če delaš v veliki ekipi je verjetno, da je master zaklenjen in zahteva Pull Request postopek za merganje sprememb. Če commitaš direktno na master lokalno, poizkusi pushati in dobil boš sporočilo podobno temu:", + "", + "```", + " ! [remote rejected] master -> master (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)", + "```" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Zakaj je bil zavrnjen?", + "", + "Oddaljen repo je zavrnil pushanje commitov direktno na master zaradi politike, da se uporabljajo le pull requesti.", + "", + "Mišljeno je, da slediš temu procesu, da narediš branch, ga pushaš, nato pa narediš pull request, ampak si pozabil in commital direktno na master. Sedaj si zataknjen in ne moreš pushati svojih sprememb." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Rešitev", + "", + "Naredi še en branch imenovan feature in ga pushaj na remote. Prav tako resetiraj master nazaj, da bo v enakem stanju kot na oddaljenem repozitoriju, drugače imaš lahko težave naslednjič, ko boš pullal spremembe in bo konflikt s commitom nekoga drugega." + ] + } + } + ] + } } }; \ No newline at end of file diff --git a/src/levels/remote/mergeManyFeatures.js b/src/levels/remote/mergeManyFeatures.js index cd5c4629..d647051f 100644 --- a/src/levels/remote/mergeManyFeatures.js +++ b/src/levels/remote/mergeManyFeatures.js @@ -16,7 +16,8 @@ exports.level = { "ru_RU": "Слияние с удалённым репозиторием", "ko" : "원격 작업과 merge하기", "uk" : "Мердж з віддаленим репозиторієм", - "vi" : "Hợp nhất nhánh từ xa" + "vi" : "Hợp nhất nhánh từ xa", + "sl_SI": "Merganje z oddaljenim repozitorijem" }, "hint": { "en_US": "Pay attention to the goal tree!", @@ -32,7 +33,8 @@ exports.level = { "ru_RU": "Внимательно посмотрите на цель уровня!", "ko" : "goal을 잘 살펴보세요!", "uk" : "Уважно подивись як має виглядати результат!", - "vi" : "Hãy để ý đến cây mục tiêu!" + "vi" : "Hãy để ý đến cây mục tiêu!", + "sl_SI": "Poglej si ciljno drevo!" }, "compareOnlyMaster": true, "startDialog": { @@ -665,6 +667,51 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Zakaj ne merganje?", + "", + "Da bi poslal nove spremembe na oddaljen repo, je vse kar moraš narediti, da *vključiš* zadnje spremembe iz oddaljenega repota. To pomeni, da lahko rebaseaš *ali* mergeaš v oddaljeni branch (npr. `o/master`).", + "", + "Torej če lahko narediš katero izmed metod, zakaj imeti lekcijo, ki se zaenkrat osredotoča na rebaseanje? Zakaj ni nobene ljubezni do `mergea` pri delanju z oddaljenimi repoti?", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Veliko govora je o kompromisih med merganjem in rebasanjem med razvijalci. Tu so splošne prednosti / slabosti rebaseanja:", + "", + "Prednosti:", + "", + "* Rebasanje naredi tvoje drevo lepo in pregledno, ker je vse v ravni črti", + "", + "Slabosti:", + "", + "* Rebasanje spremeni (navidezno) zgodovino drevesa commitov.", + "", + "Naprimer, commit `C1` je lahko rebasean *mimo* `C3`. Potem izgleda kot da je delo za `C1'` prišlo za `C3`, čeprav je v resnici bilo končano prej.", + "", + "Nekateri razvijalci imajo radi ohranjanje zgodovine in imajo posledično rajše merganje. Drugi (kot jaz) imajo rajši čisto drevo commitov in posledično rebasanje. Na koncu prevlada osebna preferenca :D" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Za to stopnjo, poizkusimo rešiti prešnjo stopnjo z *merganjem*. Mogoče bo malo zakomplicirano, vendar bo lepo ponazorilo poanto." + ] + } + } + ] } } }; diff --git a/src/levels/remote/pull.js b/src/levels/remote/pull.js index a57313af..6651a964 100644 --- a/src/levels/remote/pull.js +++ b/src/levels/remote/pull.js @@ -16,7 +16,8 @@ exports.level = { "ru_RU": "Git pull", "uk" : "Git pull", "ko" : "Git pull", - "vi" : "Git pull" + "vi" : "Git pull", + "sl_SI": "Git pull" }, "hint": { "en_US": "Just run git pull!", @@ -33,6 +34,7 @@ exports.level = { "uk" : "Просто виконай git pull !", "ko" : "그냥 git pull을 하세요!", "vi" : "Đơn giản là gõ git pull!", + "sl_SI": "Samo izvedi git pull!" }, "startDialog": { "en_US": { @@ -860,6 +862,65 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Pull", + "", + "Sedaj, ko smo videli kako pridobiti podatke iz oddaljenega repozitorija z `git fetch`, posodobimo naše delo, da bo odsevalo te sprememebe!", + "", + "V bistvu je več načinov za izvedbo tega -- ko imaš enkrat na lokalno na voljo nove commite, jih lahko vključiš, kot da so normalni commiti na drugem branchu. To pomeni, da lahko izvedeš ukaze, kot so:", + "", + "* `git cherry-pick o/master`", + "* `git rebase o/master`", + "* `git merge o/master`", + "* itd., itd.", + "", + "Pravzaprav je *fetchanje* oddaljenih sprememb in kasneje *merganje* le-teh tako pogosto, da ima git dejansko ukaz, ki naredi oboje! Ukaz je `git pull`." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Poglejmo najprej `fetch` in `merge` izvedena zaporedno" + ], + "afterMarkdowns": [ + "Boom -- prenesli smo `C3` z `fetch` in nato mergali delo z `git merge o/master`. Sedaj naš `master` branch odseva spremembe novega dela iz oddaljenega repoztorija (v tem primeru poimenovan `origin`)" + ], + "command": "git fetch; git merge o/master", + "beforeCommand": "git clone; git commit; git fakeTeamwork" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Kaj bi se zgodilo, če bi namesto tega uporabili `git pull`?" + ], + "afterMarkdowns": [ + "Ista stvar! To bi moralo pokazati, da je `git pull` v bistvu bližnjica za `git fetch`, ki mu sledi merge brancha, ki smo ga ravno fetchali." + ], + "command": "git pull", + "beforeCommand": "git clone; git commit; git fakeTeamwork" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Kasneje bomo raziskali podrobnosti ukaza `git pull` (vključno z opcijami in argumenti), ampak zaenkrat poizkusimo to v tej stopnji.", + "", + "Pomni -- to stopnjo lahko rešiš s `fetch` in `merge`, ampak boš rabil en dodaten ukaz :P" + ] + } + } + ] } } }; diff --git a/src/levels/remote/pullArgs.js b/src/levels/remote/pullArgs.js index f976280e..7586e839 100644 --- a/src/levels/remote/pullArgs.js +++ b/src/levels/remote/pullArgs.js @@ -16,7 +16,8 @@ exports.level = { "ru_RU": "Аргументы для pull", "ko" : "pull 인자들", "uk" : "Аргументи pull", - "vi" : "Tham số pull" + "vi" : "Tham số pull", + "sl_SI": "Pull argumenti" }, "hint": { "en_US": "Remember that you can create new local branches with fetch/pull arguments", @@ -32,7 +33,8 @@ exports.level = { "ru_RU": "Напоминаю, что новые ветки можно создавать и с помощью команд fetch/pull", "ko" : "fetch/pull 과 인자들로 새 로컬 브랜치를 생성할수 있다는것을 기억하세요.", "uk" : "Пам'ятай, що ти можеш створювати нові гілки, використовуючи fetch/pull з аргументами", - "vi" : "Nhớ rằng,bạn có thể tạo nhánh cục bộ mới với tham số của fetch/pull" + "vi" : "Nhớ rằng,bạn có thể tạo nhánh cục bộ mới với tham số của fetch/pull", + "sl_SI": "Zapomni si, da lahko ustvariš nove lokalne branche s fetch/pull argumenti" }, "startDialog": { "en_US": { @@ -996,6 +998,80 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git pull argumenti", + "", + "Sedaj ko veš praktično *vse*, kar je za vedeti o argumentih za `git fetch` in `git push`, ni skoraj ničesar za dodati za `git pull` :)", + "", + "To je zato, ker je git pull konec koncev *res* samo bližnjica za fetch, ki mu sledi merge tega, kar smo fetchali. Predstavljaš si ga lahko kot ukaz git fetch z *istimi* podanimi argumenti in merganjem, *kjer* bodo tisti commite končali.", + "", + "To velja tudi takrat, ko uporabiš noro komplicirane argumente. Poglejmo nekaj primerov:" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Tu je nekaj ukazov v gitu:", + "", + "`git pull origin foo` je enak:", + "", + "`git fetch origin foo; git merge o/foo`", + "", + "In ...", + "", + "`git pull origin bar~1:bugFix` je enak:", + "", + "`git fetch origin bar~1:bugFix; git merge bugFix`", + "", + "Vidiš? Git pull je res bližnjica za fetch + merge. Vse kar zanima git pull je kje bodo commiti končali (`ciljni` argument, ki ga ugotovi med fetchem).", + "", + "Poglejmo primer:" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Če določimo mesto za fetchanje, se vse zgodi kot prej s fetchem ampak tudi zmergamo kar smo pravkar fetchali" + ], + "afterMarkdowns": [ + "Vidiš! Z določitvijo `master` smo prenesli commite na `o/master` kot ponavadi. Potem smo zmergali `o/master` v našo trenutno checkoutano lokacijo, ki *ni* lokalni branch `master`. Zaradi tega razloga je morda celo logično, da izvedemo git pull večkrat (z istimi argumenti) iz drugi lokacij, da posodobimo več branchev." + ], + "command": "git pull origin master", + "beforeCommand": "git clone; go -b bar; git commit; git fakeTeamwork" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Ali deluje tudi z izvorom in ciljem? Itak! Poglejmo to:" + ], + "afterMarkdowns": [ + "Wow, to je pa RES veliko v enem ukazu. Naredili smo nov lokalen branch imenovan `foo`, prenesli commite iz oddaljenega masterja na ta branch `foo` in potem zmergali ta branch v naš trenutno checkoutan branch `bar`. Je več kot 9000!!!" + ], + "command": "git pull origin master:foo", + "beforeCommand": "git clone; git fakeTeamwork; go -b bar; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ok, da zaključiš, pridi v stanje iz ciljne vizualizazcije. Prenesti boš moral neka commitov, narediti nekaj novih branchev in zmergati te branche v druge branche, ampak ne bi smelo zahtevati veliko ukazov :P" + ] + } + } + ] } } }; diff --git a/src/levels/remote/push.js b/src/levels/remote/push.js index 538799b2..864b9b8a 100644 --- a/src/levels/remote/push.js +++ b/src/levels/remote/push.js @@ -19,7 +19,8 @@ exports.level = { "ru_RU": "Git push", "uk" : "Git push", "ko" : "Git push", - "vi" : "Git push" + "vi" : "Git push", + "sl_SI": "Git Push" }, "hint": { "en_US": "Remember you have to clone before you can push!", @@ -34,7 +35,8 @@ exports.level = { "ru_RU": "Помните, что прежде чем push-ить вам нужно склонировать репозиторий!", "uk" : "Пам’ятай, що перед тим як щось push-нути потрібно склонувати репозиторій!", "ko" : "push를 하기전에 clone을 먼저해야 된다는것을 기억하세요!", - "vi" : "Nhớ rằng bạn phải clone trước khi push!" + "vi" : "Nhớ rằng bạn phải clone trước khi push!", + "sl_SI": "Najprej moraš klonirati preden lahko pushaš!" }, "startDialog": { "en_US": { @@ -631,6 +633,49 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Push", + "", + "Ok, sedaj sem fetchal spremembe iz oddaljenega repota in jih vključil v moje lokalno delo. To je že super ... toda kako delim _moje_ super delo z vsemi ostalimi?", + "", + "No, način da naložiš deljeno delo, je ravno nasproten, kot da ga preneseš. In kaj je nasprotje `git pull`? `git push`!", + "", + "`git push` je odgovoren za nalaganje _tvojih_ sprememb na določen oddaljen repozitorij in posodobitev tega repozitorija, da vključi tvoje nove commite. Ko se `git push` izvede, lahko vsi tvoji prijatelji prenesejo tvoje delo iz repozitorija.", + "", + "`git push` si lahko predstavljaš kot ukaz, ki \"objavi\" tvoje delo. Ima kopico majhnih stvari, katere bomo raziskali v kratkem, ampak začnimo z majhnimi koraki ...", + "", + "*opomba -- obnašanje `git push` brez argumentov je odvisno od nastavitev gita imenovanih `push.default`. Privzeta vrednost za to nastavitev je odvisna od različice gita, ki jo uporabljaš, ampak mi bomo uporabljali `upstream` vrednost v naši lekciji. To ni neka velika stvar, ampak jo je vredno preveriti preden pushamo na svojem projektu.*" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Tu imamo nekaj sprememb, ki jih oddaljen repo nima. Dajmo jih naložiti!" + ], + "afterMarkdowns": [ + "Tako je -- oddaljen repo je preje commit `C2`, branch `master` na oddaljenem repotu je bil posodobljen, da kaže na `C2` in naš *lasten* prikaz oddaljenega repota (`o/master`) je bil prav tako posodobljen. Vse je usklajeno!" + ], + "command": "git push", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Za dokončanje te stopnje, preprosto deli dva nova commita z oddaljenim repotom. Nato pa se pripno, ker bodo lekcije postale dosti težje!" + ] + } + } + ] } } }; diff --git a/src/levels/remote/pushArgs.js b/src/levels/remote/pushArgs.js index fcf95676..dd7f974e 100644 --- a/src/levels/remote/pushArgs.js +++ b/src/levels/remote/pushArgs.js @@ -19,7 +19,8 @@ exports.level = { "ru_RU": "Аргументы git push", "ko" : "git push의 인자들", "uk" : "Аргументи git push", - "vi" : "Tham số git push" + "vi" : "Tham số git push", + "sl_SI": "Git push argumenti" }, "hint": { "en_US": "You can always look at the last slide of the dialog with \"objective\"", @@ -35,7 +36,8 @@ exports.level = { "ru_RU": "Вы всегда можете ознакомиться с последним слайдом, воспользовавшись \"objective\".", "ko" : "대화창의 마지막 슬라이드를 \"objective\"로 다시 볼 수 있습니다.", "uk" : "Завжди можна подивитися останній слайд діалогу за допомогою \"objective\"", - "vi" : "Bạn có thể sử dụng \"objective\" để đọc trang cuối của cửa sổ hộp thoại" + "vi" : "Bạn có thể sử dụng \"objective\" để đọc trang cuối của cửa sổ hộp thoại", + "sl_SI": "Vedno lahko pogledaš zadnji dialog z \"objective\"" }, "startDialog": { "en_US": { @@ -991,6 +993,81 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Push argumenti", + "", + "Super! Sedaj, ko poznaš oddaljeno sledenje branchev lahko začnemo odkrivati skrivnosti za git pushem, fetchem in pullom. Napadli bomo en ukaz za drugim, ampak koncepti za njimi so si podobni.", + "", + "Najprej bomo pogledali `git push`. V lekciji o oddaljenem sledenju si spoznal, da je git ugotovil oddaljen repo *in* branch za pushat s tem da je pogledal lastnosti trenutno checkoutanega brancha (oddaljen branch, ki ga \"sledi\"). To je obnašanje brez argumentov, ampak git push lahko sprejme tudi argumente v sledeči obliki:", + "", + "`git push `", + "", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Kaj je `` parameter praviš? Kmalu bomo zaplavali v podrobnosti, ampak najprej primer. Izvedba ukaza:", + "", + "`git push origin master`", + "", + "se v slovenščini prevede v:", + "", + "*Pojdi na branch poimenovan \"master\" na mojem repozitoriju, zgrabi vse commite in nato pojdi na branch \"master\" na oddaljenem repotu poimenovan \"origin\". Postavi vse commite, ki manjkajo na branch in me obvesti, ko končaš.*", + "", + "Z določanjem `masterja` kot \"place\" argument, smo povedali gitu iz kje bodo commiti *prišli* in kam bodo commiti *šli*. V bistvu je to \"mesto\" oziroma \"lokacija\" za uskladitev med dvema repozitorijema.", + "", + "Imej v mislih, da ker smo gitu povedali vse kar mora vedeti (s podajanjem obeh argumentov), git povsem ignorira mesto, kjer smo checkoutani!" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Poglejmo si primer podajanja argumentov. Bodi pozoren na mesto, kjer smo checkoutani v tem primeru." + ], + "afterMarkdowns": [ + "Evo ga! `master` je bil posodobljen na oddaljenem repotu, ker smo podali te argumente." + ], + "command": "git checkout C0; git push origin master", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Kaj če ne bi podali argumentov? Kaj bi se zgodilo?" + ], + "afterMarkdowns": [ + "Ukaz ne uspe (kot lahko vidiš), ker `HEAD` ni checkoutan na branchu, ki ga oddaljeno sledimo." + ], + "command": "git checkout C0; git push", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ok, za to stopnjo posodobimo oba `foo` in `master` na oddaljenem repotu. Trik je, da je `git checkout` onemogočen za to stopnjo!", + "", + "*Opomba: Oddaljeni branchi so označeni z `o/` predpono, ker celotna `origin/` oznaka ne paše v naš prikaz. Ne skrbi ", + "glede tega ... preprosto uporabi `origin` kot ime oddaljenega repota kot ponavadi.*" + ] + } + } + ] } } }; diff --git a/src/levels/remote/pushArgs2.js b/src/levels/remote/pushArgs2.js index a6864401..7f45a36f 100644 --- a/src/levels/remote/pushArgs2.js +++ b/src/levels/remote/pushArgs2.js @@ -16,7 +16,8 @@ exports.level = { "ru_RU": "Аргументы для push -- расширенная версия!", "ko" : "git push 인자 -- 확장판!", "uk" : "Розширені аргументи git push!", - "vi" : "Tham số git push -- bản mở rộng!" + "vi" : "Tham số git push -- bản mở rộng!", + "sl_SI": "Git push argumenti -- Razširjeni!" }, "hint": { "en_US": "Remember you can admit defeat and type in \"show solution\" :P", @@ -32,7 +33,8 @@ exports.level = { "ru_RU": "Помните, Вы всегда можете признать своё поражение, набрав команду \"show solution\" (показать решение) :P", "ko" : "혹시 아세요? 패배를 인정하고 \"show solution\"을 입력할 수 있다는 걸요 :P", "uk" : "Пам'ятай, ти завжди можеш визнати поразку і підглянути рішення командою \"show solution\" :P", - "vi" : "Nhớ rằng, bạn có thể thừa nhận thất bại và gõ \"show solution\" :P" + "vi" : "Nhớ rằng, bạn có thể thừa nhận thất bại và gõ \"show solution\" :P", + "sl_SI": "Vedno se lahko predaš in napišeš \"show solution\" :P" }, "startDialog": { "en_US": { @@ -944,6 +946,76 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Podrobnosti `` argumenta", + "", + "Spomni se prejšnje lekcije, kjer smo določili `master` kot place argument za git push, določili smo *izvor* iz kje bodo commiti prišli in *destinacijo*, kamor bodo commiti odšli.", + "", + "Morda se sprašuješ -- Kaj če želimo, da sta izvor in destinacija različna? Kaj če želiš pushati commite iz lokalnega `foo` brancha na oddaljen `bar` branch?", + "", + "Nažalost to v gitu ni možno ... hecam se! Seveda je možno :) ... git ima ogromno opcij (skoraj preveč).", + "", + "Poglejmo kako v naslednjem razdelku ..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Da bi določili in izvor in destinacijo ``, preprosto združimo oba skupaj z dvopičjem:", + "", + "`git push origin :`", + "", + "To je pogosto omenjeno kot stolpična referenca. Ta referenca je samo ime za lokacijo, ki jo lahko git razvozla (kot je branch `foo` ali samo `HEAD~1`).", + "", + "Ko enkrat določiš izvor in destinacijo neodvisno, lahko oddaljene ukaze uporabljaš zelo natačno in učinkovito. Poglejmo si primer!" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Pomni, `source` je bilokatera lokacija, ki jo git razume:" + ], + "afterMarkdowns": [ + "Woah! To je kar zanimiv ukaz, ampak ima smisel -- git je razrešil `foo^` v lokacijo, naložil commite, ki še niso bili pristoni v oddaljneme repotu in nato posodobil destinacijo." + ], + "command": "git push origin foo^:master", + "beforeCommand": "git clone; go -b foo; git commit; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Kaj če destinacija kamor želiš pushati ne obstaja? Ni problem! Samo podaj ime brancha in git bo naredil branch na oddaljenem repotu zate." + ], + "afterMarkdowns": [ + "Lepa, to je kar kul :D" + ], + "command": "git push origin master:newBranch", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Za to stopnjo poizkusi priti v ciljno stanje, prikazano v vizualizaciji in si zapomni obliko:", + "", + "`:`" + ] + } + } + ] } } }; diff --git a/src/levels/remote/pushManyFeatures.js b/src/levels/remote/pushManyFeatures.js index f5d52c01..e1407bbb 100644 --- a/src/levels/remote/pushManyFeatures.js +++ b/src/levels/remote/pushManyFeatures.js @@ -16,7 +16,8 @@ exports.level = { "ru_RU": "Помни - ты всегда можешь отменить команды с помощью undo или reset", "ko" : "명령어를 undo와 reset으로 되돌릴 수 있다는 것을 잊지마세요", "uk" : "Пам'ятай, ти в будь-який момент можеш використовувати команди undo або reset", - "vi" : "Nhớ rằng bạn luôn luôn có thể hoàn tác hoặc soạn lại câu lệnh " + "vi" : "Nhớ rằng bạn luôn luôn có thể hoàn tác hoặc soạn lại câu lệnh ", + "sl_SI": "Vedno lahko razveljaviš ukaz ali ponastaviš stopnjo" }, "name": { "en_US": "Push Master!", @@ -32,7 +33,8 @@ exports.level = { "ru_RU": "Push Мастер!", "ko" : "Push Master!", "uk" : "Push Maйстер!", - "vi" : "Push Master!" + "vi" : "Push Master!", + "sl_SI": "Push Master!" }, "compareOnlyMasterHashAgnostic": true, "startDialog": { @@ -777,6 +779,59 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Merganje funkcionalnih branchev", + "", + "Sedaj, ko se počutiš udobno s fetchanjem, pullanjem in pushanjem, preizkusimo ta znanja z novimi primeri.", + "", + "Za razvijalce na velikih projektih je pogosto, da delajo vse svoje stvari na funkcionalnih brancih (ne na `master`) in potem vključijo to delo, ko je končano. To je podobno prejšnjim lekcijam (kjer so bili pushani stranski branchi na oddaljen repo), a tu predstavljamo še en korak.", + "", + "Nekateri razvijaci samo pushajo in pullajo na `master` branchu -- zato `master` vedno ostane posodobljen z oddaljenim masterjem (`o/master`).", + "", + "Torej za tak primer uporabe, združimo dve stvari:", + "", + "* vključevanje dela funkcionalnih branchev na `master` in", + "* pushanje in pullanje iz oddaljenega repota" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Osvežimo si na hitro, kako posodobit `master` in pushati delo." + ], + "afterMarkdowns": [ + "Izvedli smo dva ukaza, ki:", + "", + "* rebasata naše delo na nove commite iz oddaljenega repozitorija in", + "* objavita naše delo na oddaljen repozitorij" + ], + "command": "git pull --rebase; git push", + "beforeCommand": "git clone; git commit; git fakeTeamwork" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ta stopnja je kar zajetna -- tu je splošno ideja za rešitev:", + "", + "* Imamo tri branche -- `side1` `side2` in `side3`", + "* Želimo pushati vsako od teh funkcionalnosti po vrstnem redu na oddaljen repo", + "* Oddaljen repo se je umes posodobil, zato bomo morali vključiti tudi to delo", + "", + ":O naporno! Srečno, končanje te stopnje je velik korak." + ] + } + } + ] } } }; diff --git a/src/levels/remote/remoteBranches.js b/src/levels/remote/remoteBranches.js index 47ce8e58..55abdb24 100644 --- a/src/levels/remote/remoteBranches.js +++ b/src/levels/remote/remoteBranches.js @@ -16,7 +16,8 @@ exports.level = { "ru_RU": "Удалённые ветки", "ko" : "원격 브랜치(remote branch)", "uk" : "Віддалені гілки", - "vi" : "Nhánh từ xa" + "vi" : "Nhánh từ xa", + "sl_SI": "Oddaljeni Branchi" }, "hint": { "en_US": "Pay attention to the ordering -- commit on master first!", @@ -32,7 +33,8 @@ exports.level = { "ru_RU": "Уделяйте внимание очерёдности -- сперва commit на master", "ko" : "순서에 주의하세요 -- master에서 먼저 커밋하세요!", "uk" : "Звертайте увагу на послідовність -- спочатку коміт в мастер!", - "vi" : "Chú ý đến thứ tự -- commit trên nhánh master trước!" + "vi" : "Chú ý đến thứ tự -- commit trên nhánh master trước!", + "sl_SI": "Bodi pozoren na vrsti red -- commitaj najprej na master!" }, "startDialog": { "en_US": { @@ -888,6 +890,67 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Oddaljeni Branchi", + "", + "Sedaj ko smo videli `git clone` v praksi se poglobimo v dejanske spremembe.", + "", + "Prva stvar, ki si jo morda opazil je, da se je pojavil nov branch na našem lokalnem repotu imenovan `o/master`. Temu tipu brancha pravimo _oddaljen_(remote) branch; oddaljeni branch ima posebne lastnosti, ker služijo določenim namenom.", + "", + "Oddaljeni branchi odražajo _stanje_ oddaljenega repozitorija (od kar si nazadnje komuniciral z oddaljenim repotom). To ti morda pomaga razumeti razliko med tvojim lokalnim delom in delom, ki je javno -- ključni korak, preden deliš svoje delo z ostalimi.", + "", + "Oddaljeni branchi imajo posebno lastnost, da ko jih checkoutaš, si postavljen v stanje z ločenim `HEAD-om`. Git naredi to zanalašč, ker ne moreš delati neposredno na teh branchih; moreš delati drugje in nato deliti svoje delo z oddaljenim repotom (po tem bodo oddaljeni branchi bili posodobljeni)." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Kaj je `o/`?", + "", + "Morda se sprašuješ, kaj je ta `o/` spredaj pred oddaljenmi branchi. Tudi oddaljeni branchi imajo (zahtevano) pravilo za poimenovanje -- predstavljeni so v sledečm formatu:", + "", + "* `/`", + "", + "Posledično, če pogledamo branch poimenovan `o/master`, je ime brancha `master`, ime oddaljenega repota pa `o`.", + "", + "Večina razvijalcev v bistvu poimenuje njihov glavni oddaljeni repozitorij `origin`, ne `o`. To je takoj pogosto, da git ubistvu nastavi tvoj oddaljen repo z imenom `origin` ko izvedeš `git clone` nad repozitorijem.", + "", + "Nažalost polno ime `origin` ne paše v naš prikaz, zato uporabljamo `o` kot bližnjico :( Samo zapomni si, ko uporabljaš pravi git, bo tvoj oddaljen repo verjetno poimenovan `origin`!", + "", + "To je kar veliko za razumeti, zato si poglejmo stvar v akciji." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Checkoutajmo oddaljen branch in poglejmo kaj se zgodi" + ], + "afterMarkdowns": [ + "Kot lahko vidiš, nas git postavi v stanje ločenega `HEAD-a` in ne posodobi `o/master`, ko dodamo nov commit. To je zato, ker se bo `o/master` posodobil šele ko se bo posodobil oddaljen repo." + ], + "command": "git checkout o/master; git commit", + "beforeCommand": "git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Za dokončanje te stopnje, commitaj enkrat iz `master` in enkrat ko checkoutaš `o/master`. To ti bo pomagalo osvojiti, kako se oddaljeni branchi obnašajo drugače in se posodobijo le da odražajo stanje na oddaljenem repozitoriju." + ] + } + } + ] } } }; diff --git a/src/levels/remote/sourceNothing.js b/src/levels/remote/sourceNothing.js index bcc482a1..5ddc0f25 100644 --- a/src/levels/remote/sourceNothing.js +++ b/src/levels/remote/sourceNothing.js @@ -20,7 +20,8 @@ exports.level = { "ru_RU": "Пустой источник", "ko" : "Source가 없다", "uk" : "Нема джерела", - "vi" : "Không có nguồn" + "vi" : "Không có nguồn", + "sl_SI": "Izvor Ničesar" }, "hint": { "en_US": "The branch command is disabled for this level so you'll have to use fetch!", @@ -36,7 +37,8 @@ exports.level = { "ru_RU": "Команда branch недоступна на этом упражнении, пользуйтесь командой fetch!", "ko" : "branch 명령이 비활성화 되어있습니다. fetch를 사용해야 되요!", "uk" : "Команда branch недоступна на цьому уроці, користуйся командою fetch!", - "vi" : "Lệnh branch đã bị vô hiệu hóa ở cấp độ này nên bạn sẽ phải dùng fetch!" + "vi" : "Lệnh branch đã bị vô hiệu hóa ở cấp độ này nên bạn sẽ phải dùng fetch!", + "sl_SI": "Ukaz za branchanje je v tej stopnji onemogočen, zato boš moral uporabiti fetch!" }, "startDialog": { "en_US": { @@ -727,6 +729,59 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Čudnosti ``", + "", + "Git zlorablja `` parameter na dva čudna načina. Te dve zlorabi nastaneta iz dejstva, da lahko tehnično določiš \"nič\" kot veljaven `izvor` za git push in git fetch. Način, da določiš nič je z uporabo praznega argumenta:", + "", + "* `git push origin :side`", + "* `git fetch origin :bugFix`", + "", + "Poglejmo kaj to naredi ..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Kaj naredi pushanje \"ničesar\" na oddalejn branch? Izbriše ga!" + ], + "afterMarkdowns": [ + "Tako, uspešno smo izbrisali `foo` branch na oddaljenem repotu s konceptom pushanja \"ničesar\" nanj. To ima nekako smisel ..." + ], + "command": "git push origin :foo", + "beforeCommand": "git clone; git push origin master:foo" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "In končno, fetchanje \"ničesar\" lokalno dejansko naredi nov branch" + ], + "afterMarkdowns": [ + "Zelo čudno / bizarno, ampak kakorkoli. Tak je git!" + ], + "command": "git fetch origin :bar", + "beforeCommand": "git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "To je hitra stopnja -- samo izbriši en oddaljen branch in naredi novega z `git fetch` da zaključiš!" + ] + } + } + ] } } }; diff --git a/src/levels/remote/tracking.js b/src/levels/remote/tracking.js index 7c5ba042..880292b4 100644 --- a/src/levels/remote/tracking.js +++ b/src/levels/remote/tracking.js @@ -16,7 +16,8 @@ exports.level = { "ru_RU": "Слежка за удалённым репозиторием", "ko" : "원격 저장소 추적하기", "uk" : "Слідкуємо за віддаленим репозиторієм", - "vi" : "Theo dõi từ xa" + "vi" : "Theo dõi từ xa", + "sl_SI": "Sledenje Oddaljenega Repota" }, "hint": { "en_US": "Remember there are two ways to set remote tracking!", @@ -32,7 +33,8 @@ exports.level = { "ru_RU": "Помни, есть два способа установить слежку за удалённым репозиторием!", "ko" : "원격 추적하기를 설정하는데에는 두가지 방법이 있습니다!", "uk" : "Пам'ятай, є два способи слідкувати за віддаленим репозиорієм!", - "vi" : "Hãy nhớ rằng, có 2 cách để thiết lập theo dõi từ xa!" + "vi" : "Hãy nhớ rằng, có 2 cách để thiết lập theo dõi từ xa!", + "sl_SI": "Spomni se, da obstajata dva načina za sledenje oddaljenega repota" }, "startDialog": { "en_US": { @@ -1689,6 +1691,124 @@ exports.level = { } } ] + }, + "sl_SI": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Sledenje oddaljenih branchev", + "", + "Stvar, ki se je morda zdela \"čarobna\" v zadnjih lekcijah je, da je git vedel, da je `master` branch povezan z `o/master`. Seveda imata brancha podobno ime in morda deluje logično, da se poveže `master` branch na oddaljenem repotu z lokalnim `master` branchem, toda ta povezava je jasno predstavljena v dveh scenarijih:", + "", + "* Med pull operacijo so commiti preneseni na `o/master` in nato *zmergani* v `master` branch. Implicirana tarča merga je določena iz te povezave.", + "* Med push operacijo je delo iz `master` brancha naloženo na oddaljen `master` branch (ki je bil prej predstavljen kot `o/master` lokalno). *Destinacija* pusha je določena iz povezave med `master` in `o/master`.", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Sledenje oddaljenega repota", + "", + "Če povzamem, ta povezava med `master` in `o/master` je preprosto razložena z \"oddaljenim sledenjem\" lastnosti branchev. `master` branch je nastavljen, da sledi `o/master` -- to pomeni, da obstaja impliciran cilj merga in impliciran cilj pusha za `master` branch.", + "", + "Morda se sprašuješ, kako se je nastavila ta lastnost na `master` branchu, čeprav nisi izvedel nobenega ukaza za to. No, ko kloniraš repo z gitom, je ta lastnost v bistvu nastavljena zate avtomatično. ", + "", + "Med kloniranjem git ustvari oddaljen branch za vsak branch na oddaljenem repotu (branchi kot `o/master`). Nato ustvati lokalen branch, ki sledi trenutno aktvinemu branchu na oddaljenem repotu, ki je v večini primerov `master`.", + "", + "Ko git clone zaključi, imaš samo en lokalen branch (da nisi zasipan), ampak lahko vidiš vse različne branche na oddaljenem repotu (če si zelo radoveden). Najboljše iz obeh svetov!", + "", + "To tudi razloži zakaj lahko vidiš sledeč izpis ukaza med kloniranjem:", + "", + " local branch \"master\" set to track remote branch \"o/master\"" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Ali ga lahko določim sam?", + "", + "Seveda se da! Narediš lahko, da bilokater branch sledi `o/master`, v tem primeru bo imel ta branch enak impliciran cilj za push in merge kot `master`. To pomeni, da lahko poženeš `git push` na branchu poimenovanem `splohNiMaster` in pushas svoje delo na `master` branch na oddaljenem repotu!", + "", + "Obstajata dva načina, da nastaviš to lastnost. Prvi je, da checkoutaš nov branch z uporabo oddaljenega brancha kot določena referenca. Izvedba", + "", + "`git checkout -b splohNiMaster o/master`", + "", + "Ustvari nov branch imenovan `splohNiMaster` in nastavi, da sledi `o/master`." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Dovolj besedičenja, poglejmo primer! Checkoutali bomo nov branch poimenovan `foo` in ga nastavili, da sledi `master` na oddaljenem repotu." + ], + "afterMarkdowns": [ + "Kot lahko vidiš, smo uporabili impliciran cilj mergea `o/master`, da posodobi `foo` branch. Opazi, kako se master ne posodobi!!" + ], + "command": "git checkout -b foo o/master; git pull", + "beforeCommand": "git clone; git fakeTeamwork" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "To velja tudi za git push" + ], + "afterMarkdowns": [ + "Boom. Naše delo smo naložili na `master` na oddaljenem repotu, čeprav je ime našega brancha nekaj povsem drugega" + ], + "command": "git checkout -b foo o/master; git commit; git push", + "beforeCommand": "git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Način #2", + "", + "Še en način, da se nastavi oddaljeno sledenje na branchu, je da se uporabi `git branch -u` opcija. Izvedba", + "", + "`git branch -u o/master foo`", + "", + "bo nastavila `foo` branch, da sledi `o/master`. Če je `foo` trenutno checkoutan, ga lahko celo izpustiš:", + "", + "`git branch -u o/master`", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Poglejmo si na hitro še ta drug način določanja oddaljenega sledenja ..." + ], + "afterMarkdowns": [ + "Enako kot prej, le bolj natančno. Lepa!" + ], + "command": "git branch -u o/master foo; git commit; git push", + "beforeCommand": "git clone; git checkout -b foo" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ok! Za to stopnjo pushajmo delo na `master` branch na oddaljenem repotu, medtem ko lokalno *nismo* na `masterju`. Ostalo prepustim tebi, ker je to vseeno napredna stopnja :P" + ] + } + } + ] } } }; From ea30fadf31e3b06f5abf2c7b2557e38e22cb2e0c Mon Sep 17 00:00:00 2001 From: Matic Trebusak Date: Fri, 24 Apr 2020 16:34:52 +0200 Subject: [PATCH 204/359] Polished Slovenian translations --- src/js/dialogs/confirmShowSolution.js | 2 +- src/js/dialogs/sandbox.js | 2 +- src/js/intl/strings.js | 2 +- src/js/stores/LocaleStore.js | 2 +- src/levels/advanced/multipleParents.js | 10 +++++----- src/levels/index.js | 2 +- src/levels/intro/branching.js | 22 +++++++++++----------- src/levels/intro/commits.js | 4 ++-- src/levels/intro/merging.js | 8 ++++---- src/levels/intro/rebasing.js | 10 +++++----- src/levels/mixed/describe.js | 10 +++++----- src/levels/mixed/grabbingOneCommit.js | 8 ++++---- src/levels/mixed/jugglingCommits.js | 12 ++++++------ src/levels/mixed/jugglingCommits2.js | 8 ++++---- src/levels/mixed/tags.js | 6 +++--- src/levels/rampup/cherryPick.js | 6 +++--- src/levels/rampup/detachedHead.js | 14 +++++++------- src/levels/rampup/interactiveRebase.js | 14 +++++++------- src/levels/rampup/relativeRefs.js | 24 ++++++++++++------------ src/levels/rampup/relativeRefs2.js | 6 +++--- src/levels/rampup/reversingChanges.js | 6 +++--- src/levels/rebase/selectiveRebase.js | 6 +++--- src/levels/remote/clone.js | 4 ++-- src/levels/remote/fakeTeamwork.js | 10 +++++----- src/levels/remote/fetch.js | 6 +++--- src/levels/remote/fetchArgs.js | 22 +++++++++++----------- src/levels/remote/fetchRebase.js | 20 ++++++++++---------- src/levels/remote/lockedMaster.js | 2 +- src/levels/remote/mergeManyFeatures.js | 4 ++-- src/levels/remote/pull.js | 10 +++++----- src/levels/remote/pullArgs.js | 12 ++++++------ src/levels/remote/push.js | 8 ++++---- src/levels/remote/pushArgs.js | 4 ++-- src/levels/remote/pushArgs2.js | 8 ++++---- src/levels/remote/pushManyFeatures.js | 10 +++++----- src/levels/remote/remoteBranches.js | 8 ++++---- src/levels/remote/sourceNothing.js | 6 +++--- src/levels/remote/tracking.js | 18 +++++++++--------- 38 files changed, 168 insertions(+), 168 deletions(-) diff --git a/src/js/dialogs/confirmShowSolution.js b/src/js/dialogs/confirmShowSolution.js index 5ed3d7b3..f4b1d50a 100644 --- a/src/js/dialogs/confirmShowSolution.js +++ b/src/js/dialogs/confirmShowSolution.js @@ -141,7 +141,7 @@ exports.dialog = { markdowns: [ '## Si prepričan, da hočeš videti rešitev?', '', - 'Verjamem vate! Maš ti to' + 'Verjamem vate! Maš ti to! Ali pač ne?' ] } }] diff --git a/src/js/dialogs/sandbox.js b/src/js/dialogs/sandbox.js index c84ed2ba..8b7c5224 100644 --- a/src/js/dialogs/sandbox.js +++ b/src/js/dialogs/sandbox.js @@ -653,7 +653,7 @@ exports.dialog = { '', 'Vidiš lahko vse ukaze, ki so na voljo, z ukazom `show commands` v terminalu.', '', - 'PS: Bi rad šel naslednjič naravnost v peskovnik?', + 'PS: Bi šel rad naslednjič naravnost v peskovnik?', 'Poizkusi s', '[to posebno povezavo](https://pcottle.github.io/learnGitBranching/?NODEMO)' ] diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js index 0d46246a..4cd0eccd 100755 --- a/src/js/intl/strings.js +++ b/src/js/intl/strings.js @@ -599,7 +599,7 @@ exports.strings = { 'vi': 'Trạng thái mặc định cho lệnh `reset` của \"Học nhánh Git\" là `--hard`.' + ' Nên khi làm bài nếu bạn thấy gõ tham số này hơi tốn công thì cứ bỏ qua.' + ' Nhưng mà hãy nhớ rằng thực tế thì `--mixed` mới là trạng thái mặc định của `reset`.', - 'sl_SI': 'Privzeto delovanje za reset na LearnGitBranching je --hard, zato lahko to izpustiš. Na pravem gitu je --mixed.' + 'sl_SI': 'Privzeto delovanje za reset na LearnGitBranching je --hard, zato lahko to izpustiš. Na pravem gitu je --mixed.' }, /////////////////////////////////////////////////////////////////////////// 'git-error-staging': { diff --git a/src/js/stores/LocaleStore.js b/src/js/stores/LocaleStore.js index 40a1eabe..8dc1b551 100644 --- a/src/js/stores/LocaleStore.js +++ b/src/js/stores/LocaleStore.js @@ -6,7 +6,7 @@ var util = require('../util'); var EventEmitter = require('events').EventEmitter; var ActionTypes = AppConstants.ActionTypes; -var DEFAULT_LOCALE = 'sl'; +var DEFAULT_LOCALE = 'en_US'; // resolve the messy mapping between browser language // and our supported locales diff --git a/src/levels/advanced/multipleParents.js b/src/levels/advanced/multipleParents.js index 9ecce729..bf97a42a 100644 --- a/src/levels/advanced/multipleParents.js +++ b/src/levels/advanced/multipleParents.js @@ -1266,9 +1266,9 @@ exports.level = { "", "Tako kot `~` modifikator, tudi `^` modifikator sprejme opcijsko število na koncu.", "", - "Raje kot specificiranje število generacij, za katere se hočemo premakniti nazaj (kot pri `~`), modifikator `^` pove kateremu staršu oz. njegovi referenci naj sledi iz commita merga. Zapomni si, da imajo commiti mergev več staršev, zato je pot nejasna.", + "Raje kot podajanje števila generacij, za katere se hočemo premakniti nazaj (kot pri `~`), modifikator `^` pove kateremu staršu oz. njegovi referenci naj sledi iz merge commita. Zapomni si, da imajo merge commiti več staršev, zato je pot nejasna.", "", - "Git bo ponavadi sledil \"prvemu\" staršu navzgor po commitu merga, ampak določitev števila s `^` spremeni privzeto obnašanje.", + "Git bo ponavadi sledil \"prvemu\" staršu navzgor po merge commitu, ampak določitev števila s `^` spremeni privzeto obnašanje.", "", "Dovolj govorjenja, poglejmo stvar v akciji.", "" @@ -1279,12 +1279,12 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Tukaj imamo commit merga. Če checkoutamo `master^` brez modifikatorjev, bomo sledili prvem staršu po commitu merga. ", + "Tukaj imamo merge commit. Če checkoutamo `master^` brez modifikatorjev, bomo sledili prvem staršu po merge commitu. ", "", - "(*V naši vizualizaciji, je postavljen prvi starš direktno nad commitom mergea)" + "(* V naši vizualizaciji, je postavljen prvi starš direktno nad merge commitom.)" ], "afterMarkdowns": [ - "Enostavno -- Tega smo vsi navajeni." + "Enostavno -- tega smo vsi navajeni." ], "command": "git checkout master^", "beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2" diff --git a/src/levels/index.js b/src/levels/index.js index 89c5d8fb..a0614f38 100644 --- a/src/levels/index.js +++ b/src/levels/index.js @@ -251,7 +251,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ru_RU': 'Сборная солянка', 'uk' : 'Всяке', 'vi' : 'Những trò mèo đáng đồng tiền bát gạo', - 'sl_SI': 'Mešana vreča' + 'sl_SI': 'Mešana Vreča' }, about: { 'en_US': 'A mixed bag of Git techniques, tricks, and tips', diff --git a/src/levels/intro/branching.js b/src/levels/intro/branching.js index 883aabcc..4f7267bc 100644 --- a/src/levels/intro/branching.js +++ b/src/levels/intro/branching.js @@ -33,7 +33,7 @@ exports.level = { "ru_RU": "Создай новую ветку при помощи \"git branch [name]\" и перейди на неё при помощи \"git checkout [name]\"", "uk": "Створи нову гілку за допомогою \"git branch [ім’я]\" й перейди на неї за допомогою \"git checkout [ім’я]\"", "vi": "Tạo một nhánh mới với lệnh \"git branch \" và chuyển sang đó với lệnh \"git checkout \"", - "sl_SI": "Naredi nov branch z \"git branch \" in ga checkoutaj z \"git checkout \"" + "sl_SI": "Naredi nov branch z \"git branch [ime-brancha]\" in ga checkoutaj z \"git checkout [ime-brancha]\"" }, "disabledMap": { "git revert": true @@ -1157,9 +1157,9 @@ exports.level = { "branchaj zgodaj in branchaj pogosto", "```", "", - "Ker ustvarjanje večih branchev ne porablja dodatnega spomina ali prostora, je lažje logično razdeliti svoje delo kot imeti velike težke branche.", + "Ker ustvarjanje večih branchev ne porablja dodatnega spomina ali prostora, je lažje logično razdeliti svoje delo kot imeti velike branche.", "", - "Ko začnemo mešati branche in commite, bomo videli kako se te dve funkcionalnosti dopolnjujeta. Za zdaj si zapomni samo to, da branch ubistvu pomeni \"Hočem vključiti delo tega commita in vseh starševskih commitov.\"" + "Ko začnemo mešati branche in commite, bomo videli kako se te dve funkcionalnosti dopolnjujeta. Za zdaj si zapomni samo to, da branch ubistvu pomeni \"Hočem vključiti delo tega commita in commite vseh njegovih staršev.\"" ] } }, @@ -1167,7 +1167,7 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Poglejmo kako branchi zgledajo v praksi.", + "Poglejmo kako branchi izgledajo v praksi.", "", "Tu bomo ustvarili nov branch imenovan `newImage`" ], @@ -1185,7 +1185,7 @@ exports.level = { "Poizkusimo dodati nekaj dela na ta nov branch. Pristisni gumb spodaj" ], "afterMarkdowns": [ - "O ne! `master` branch se je premaknil ampak `newImage` branch se pa ni! To je zato, ker nismo bili \"na\" novem branchu, kot smo lahko videli z označeno zvezdico (*) na `master` branchu" + "O ne! `master` branch se je premaknil ampak `newImage` branch se pa ni! To je zato, ker nismo bili \"na\" novem branchu, kot smo lahko videli z označeno zvezdico (*) na `master` branchu." ], "command": "git commit", "beforeCommand": "git branch newImage" @@ -1195,16 +1195,16 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Povejmo gitu da želimo checkoutat branch z", + "Povejmo gitu, da želimo checkoutat branch z", "", "```", - "git checkout ", + "git checkout ", "```", "", - "To nas bo postavilo na nov branch pred commitanjem sprememb" + "To nas bo postavilo na nov branch pred commitanjem sprememb." ], "afterMarkdowns": [ - "Tako je! Naše sprememebe so zabeležene na novem branchu" + "Tako je! Naše sprememebe so zabeležene na novem branchu." ], "command": "git checkout newImage; git commit", "beforeCommand": "git branch newImage" @@ -1214,12 +1214,12 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Ok! Pripravljen si da začneš branchat. Ko se to okno zapre, ", + "Ok! Pripravljen si, da začneš branchat. Ko se to okno zapre, ", "ustvari nov branch z imenom `bugFix` in preklopi na ta branch.", "", "Mimogrede, tu je bližnjica: če hočeš narediti nov ", "branch IN ga hkrati checkoutati, lahko enostavno ", - "natipkaš `git checkout -b [yourbranchname]`." + "natipkaš `git checkout -b [imeTvojegaBrancha]`." ] } } diff --git a/src/levels/intro/commits.js b/src/levels/intro/commits.js index 84ed3ef3..3bcf983d 100644 --- a/src/levels/intro/commits.js +++ b/src/levels/intro/commits.js @@ -647,11 +647,11 @@ exports.level = { "## Git Commits", "Commit v git repozitoriju zabeleži stanje vseh datotek v tvoji mapi. Deluje kot tak velik 'Izreži in Prilepi', vendar še bolje!", "", - "Git hoče commite ohraniti majhne kot se da, tako da ne skopira vsakič kar vseh datotek ob commitu. Lahko (kadar je možno) stisne commit le kot množico sprememb oziroma kot \"delto\" sprememb med eno in drugo različico v repozitoriju.", + "Git hoče commite ohraniti majhne kot se le da, tako da ne skopira vsakič kar vseh datotek ob commitu. Lahko (kadar je možno) stisne commit le kot množico sprememb oziroma kot \"delto\" sprememb med eno in drugo različico v repozitoriju.", "", "Git vodi tudi zgodovino o tem, kdaj je bil kateri commit narejen. Zato ima večina commitov nad seboj svoje prednike -- to je v vizualizaciji predstavljeno s puščicami. Vzdrževanje zgodovine je uporabno za vse, ki delajo na projektu!", "", - "Veliko je za dojeti na začetku ampak za zdaj si lahko predstavljaš commite kot posnetek projekta v določenem času. Commiti so zelo majhni in prehajanje med njimi je noro hitro!" + "Veliko je za dojeti na začetku, ampak za zdaj si lahko predstavljaš commite kot posnetek projekta v določenem času. Commiti so zelo majhni in prehajanje med njimi je noro hitro!" ] } }, diff --git a/src/levels/intro/merging.js b/src/levels/intro/merging.js index 7f35c095..7a74e5f0 100644 --- a/src/levels/intro/merging.js +++ b/src/levels/intro/merging.js @@ -1013,11 +1013,11 @@ exports.level = { "markdowns": [ "## Branchi in Merganje", "", - "Odlično! Sedaj znamo commitati in branchati. Naslednja stvar je da se naučimo združiti delo iz dveh različnih branchev. To nam bo omogočilo, da naredimo branch, razvijemo novo funkcionalnost in jo združimo nazaj.", + "Odlično! Sedaj znamo commitati in branchati. Naslednja stvar je, da se naučimo združiti delo iz dveh različnih branchev. To nam bo omogočilo, da naredimo branch, razvijemo novo funkcionalnost in jo združimo nazaj.", "", - "Prva metoda za združevanje dela, ki jo bomo preučili je `git merge`. Merganje v Gitu naredi poseben commit, ki ima dva edinstvena starša. Commit z dvema staršema vbistvu pomeni \"Hočem vključiti vso delo iz tega starša tukaj in iz tega tu *ter* vse delo iz njunih staršev\"", + "Prva metoda za združevanje dela, ki jo bomo preučili je `git merge`. Merganje v Gitu naredi poseben commit, ki ima dva edinstvena starša. Commit z dvema staršema v bistvu pomeni \"Hočem vključiti vso delo iz tega starša tukaj in iz tega tu *ter* vse delo iz njunih staršev\".", "", - "Vizualizacija je enostavnejša, poglejmo v naslednjem oknu" + "Vizualizacija je enostavnejša, poglejmo v naslednjem oknu." ] } }, @@ -1032,7 +1032,7 @@ exports.level = { "afterMarkdowns": [ "Woah! Si videl to? `master` sedaj kaže na commit, ki ima dva starša. Če slediš puščicam po drevesu commitov iz `master`, boš našel vsak commit po poti do roota. To pomeni, da `master` sedaj vsebuje vso delo iz repozitorija.", "", - "Tudi, vidiš kako so se barve commitov spremenile? V pomoč pri učenju, sem vključil še nekaj barvne pomoči. Vsak branch ima svojo barvo. Vsak commit spremeni barvo v kombinirano barvo vseh branchev, ki imajo ta commit.", + "Opaziš tudi, kako so se barve commitov spremenile? V pomoč pri učenju, sem vključil še nekaj barvne pomoči. Vsak branch ima svojo barvo. Vsak commit spremeni barvo v kombinirano barvo vseh branchev, ki imajo ta commit.", "", "Torej tukaj vidimo, da je `master` branch barva zmešana v vseh commitih, `bugFix` barva pa ne. Popravimo to ..." ], diff --git a/src/levels/intro/rebasing.js b/src/levels/intro/rebasing.js index e5230978..b5182673 100644 --- a/src/levels/intro/rebasing.js +++ b/src/levels/intro/rebasing.js @@ -33,7 +33,7 @@ exports.level = { "ru_RU": "Убедись, что сделал коммит в ветке bugFix", "uk": "Впевнись, що зробив коміт в гілці bugFix", "vi": "Hãy chắc chắn rằng bạn commit từ bugFix trước", - 'sl_SI': 'Prepričaj se, da si najprej commital bugFix' + 'sl_SI': 'Prepričaj se, da si najprej commital bugFix.' }, "disabledMap": { "git revert": true @@ -999,7 +999,7 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Tu imamo spet dva brancha; trenutno izbran je bugFix branch (zvezdica)", + "Tu imamo spet dva brancha; trenutno izbran je branch bugFix (zvezdica).", "", "Radi bi prestavili naše delo iz bugFix direktno na delo iz masterja. Tako bi izgledalo, kot da sta bili ti dve funkcionalnosti razviti zaporedno, v resnici pa sta bili razviti vzporedno.", "", @@ -1008,7 +1008,7 @@ exports.level = { "afterMarkdowns": [ "Super! Sedaj je naše delo iz bugFix brancha na vrhu masterja in imamo lepo zaporedje commitov.", "", - "Omenimo, da commit C3 še vedno obstaja nekje (v drevesu je zbledel), in C3' je vbistvu \"kopija\", ki smo jo rebaseali na master.", + "Omenimo, da commit C3 še vedno obstaja nekje (v drevesu je zbledel), in C3' je v bistvu \"kopija\", ki smo jo rebaseali na master.", "", "Edini problem je, da tudi master ni bil posodobljen, naredimo to sedaj ..." ], @@ -1033,11 +1033,11 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Da zaključiš to stopnjo, naredi naslednje", + "Da zaključiš to stopnjo, naredi naslednje:", "", "* Checkoutaj nov branch poimenovan `bugFix`", "* Enkrat commitaj", - "* Pojdni nazaj na master in commita ponovno", + "* Pojdi nazaj na master in commitaj ponovno", "* Ponovno checkoutaj bugFix in ga rebaseaj na master", "", "Srečno!" diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js index 1681f243..e638579b 100644 --- a/src/levels/mixed/describe.js +++ b/src/levels/mixed/describe.js @@ -34,7 +34,7 @@ exports.level = { "ko" : "다음으로 넘어가고 싶으면 bugFix를 한번 커밋하면 됩니다.", "uk" : "Просто зроби один коміт в bugFix коли ти будеш готовий іти далі", "vi": "Đơn giản là hãy commit một lẩn ở bugFix là xong rồi", - "sl_SI": "Commitaj enkrat na bugFix, ko boš pripravljen za nadaljevanje" + "sl_SI": "Commitaj enkrat na bugFix, ko boš pripravljen za nadaljevanje." }, "startDialog": { "en_US": { @@ -931,9 +931,9 @@ exports.level = { "markdowns": [ "### Git Describe", "", - "Ker tagi služijo kot tako odlična \"sidra\" v kodi, ima git ukaz za *opis* kje si, relativno glede na najbližije \"sidro\" (aka tag). Temu ukazu se reče `git describe`!", + "Ker tagi služijo kot tako odlična \"sidra\" v kodi, ima git ukaz za *opis* kje si, relativno glede na najbližje \"sidro\" (aka tag). Temu ukazu se reče `git describe`!", "", - "Git describe se ti lahko pomaga orientirati, če si premikal veliko commitov naprej in nazaj po zgodovini; to se lahko zgodi, če si končal git bisekcijo (iskanje kot debuggiranje) ali če se usedeš za sodelavčev računalnik, ko je prišel iz dopusta." + "Git describe se ti lahko pomaga orientirati, če si premikal veliko commitov naprej in nazaj po zgodovini; to se lahko zgodi, če si končal git bisekcijo (iskanje kot debuggiranje) ali če se usedeš za sodelavčev računalnik, ko je ravno prišel z dopusta." ] } }, @@ -962,7 +962,7 @@ exports.level = { "Poglejmo hiter primer. Za drevo spodaj:" ], "afterMarkdowns": [ - "Ukaz `git describe master` bi izpisal:", + "Bi ukaz `git describe master` izpisal:", "", "`v1_2_gC2`", "", @@ -978,7 +978,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "To je približno vse, kar se tiče git describe! Poizkusi za občutek opisati nekaj lokacij v tej stopnji.", + "To je približno vse, kar se tiče git describe-a! Poizkusi za občutek opisati nekaj lokacij v tej stopnji.", "", "Ko si pripravljen, samo enkrat commitaj, da zaključiš stopnjo. Tole ti častimo :P" ] diff --git a/src/levels/mixed/grabbingOneCommit.js b/src/levels/mixed/grabbingOneCommit.js index 4db8d067..d82b8386 100644 --- a/src/levels/mixed/grabbingOneCommit.js +++ b/src/levels/mixed/grabbingOneCommit.js @@ -45,7 +45,7 @@ exports.level = { "ru_RU": "Не забывай, что интерактивный rebase и cherry-pick – это твои друзья!", "uk": "Не забувай, що інтерактивний rebase та cherry-pick -- це твої друзі!", "vi": "Hãy nhớ 2 anh bạn tương tác rebase và cherry-pick!", - "sl_SI": "Pomni, interactive rebase ali cherry-pick sta tu tvoja prijatelja" + "sl_SI": "Pomni, interaktivni rebase ali cherry-pick sta tu tvoja prijatelja." }, "startDialog": { "en_US": { @@ -606,7 +606,7 @@ exports.level = { "", "Vsi te ukazi za debuggiranje / izpisovanje so v svojih commitih. Končno odkrijem bug, ga popravim in se veselim!", "", - "Edini problem je, da morem sedaj spraviti moj `bugFix` nazaj v `master` branch. Če uporabim samo fast-forwarded na `masterju`, potem bi `master` vseboval vse moje debug vrstice, česar si ne želim. Mora obstajati še neka druga pot ..." + "Edini problem je, da morem sedaj spraviti moj `bugFix` nazaj v `master` branch. Če uporabim samo fast-forward na `masterju`, potem bi `master` vseboval vse moje debug vrstice, česar si ne želim. Mora obstajati še neka druga pot ..." ] } }, @@ -619,7 +619,7 @@ exports.level = { "* `git rebase -i`", "* `git cherry-pick`", "", - "Da dosežemo ta cilj." + "da dosežemo ta cilj." ] } }, @@ -627,7 +627,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Tebi prepuščamo, da se odločiš, kateri ukaz boš uporabil da končaš stopnjo. Poskrbi samo, da `master` dobi commit, na katerega kaže `bugFix` referenca." + "Tebi prepuščam, da se odločiš, kateri ukaz boš uporabil, da končaš stopnjo. Poskrbi samo, da `master` dobi commit na katerega kaže `bugFix` referenca." ] } } diff --git a/src/levels/mixed/jugglingCommits.js b/src/levels/mixed/jugglingCommits.js index 083fadcb..78fe230c 100644 --- a/src/levels/mixed/jugglingCommits.js +++ b/src/levels/mixed/jugglingCommits.js @@ -49,7 +49,7 @@ exports.level = { "ru_RU": "Первой командой должна быть git rebase -i HEAD~2", "uk": "Перша команда має бути git rebase -i HEAD~2", "vi": "Lệnh đầu tiên là git rebase -i HEAD~2", - "sl_SI": "Prvi ukaz je git rebase -i HEAD~2" + "sl_SI": "Prvi ukaz je git rebase -i HEAD~2." }, "startDialog": { "en_US": { @@ -552,15 +552,15 @@ exports.level = { "markdowns": [ "Ta izziv bomo rešili takole:", "", - "* Preuredili bomo commite tako, da bo tisti, ki ga želimo spremeniti na vrhu z `git rebase -i`", - "* Izvedli bomo `commit --amend` da naredimo naš popravek", - "* Nato bomo preuderili commite nazaj v začetno stanje z `git rebase -i`", + "* Preuredili bomo commite tako, da bo tisti, ki ga želimo spremeniti, na vrhu z `git rebase -i`", + "* Izvedli bomo `commit --amend`, da naredimo naš popravek", + "* Nato bomo preuredili commite nazaj v začetno stanje z `git rebase -i`", "* Za konec bomo premaknili master na ta posodobljen del drevesa, da zaključimo stopnjo (z metodo po tvoji izbiri)", "", "Obstaja več načinov, da dosežemo ta cilj (vidim te kako gledaš cherry-pick) s katerimi se bomo ukvarjali kasneje, ampak za zdaj se osredotočimo na to tehniko.", - "In nenazadnje, bodi pozoren na ciljno stanje -- ker premaknemo commit dvakrat, oba dobita pripeto vejico zgoraj. Še ena je dodana za ammendan commit, torej skupno tri ", + "In nenazadnje, bodi pozoren na ciljno stanje -- ker premaknemo commit dvakrat, oba dobita pripet opuščaj zgoraj. Še eden je dodan za ammendan commit, torej skupno tri.", "", - "Sedaj lahko primerjam stopnje po strukturi in relativni spremembi vejic. Dokler ima `master` branch na tvojem drevesu enako strukturo in število vejic, dobiš vse točke" + "Sedaj lahko primerjam stopnje po strukturi in relativni spremembi opuščajev. Dokler ima `master` branch na tvojem drevesu enako strukturo in število opuščajev, dobiš vse točke." ] } } diff --git a/src/levels/mixed/jugglingCommits2.js b/src/levels/mixed/jugglingCommits2.js index 46c2e6b2..8086db49 100644 --- a/src/levels/mixed/jugglingCommits2.js +++ b/src/levels/mixed/jugglingCommits2.js @@ -48,7 +48,7 @@ exports.level = { "ru_RU": "Не забудь переместить master на последние изменения.", "uk": "Не забудь перемістити master на останні зміни!", "vi": "Đừng quên đẩy nhánh master lên cập nhật mới nhất!", - "sl_SI": "Ne pozabi prestaviti master naprej na posodobljene spremembe" + "sl_SI": "Ne pozabi prestaviti master naprej na posodobljene spremembe." }, "startDialog": { "en_US": { @@ -655,11 +655,11 @@ exports.level = { "markdowns": [ "## Žongliranje s Commiti #2", "", - "* Če še nisi končal Žongliranje s Commiti #1 (prejšnjo stopnjo), jo končaj pred nadaljevanjem*", + "Če še nisi končal Žongliranje s Commiti #1 (prejšnjo stopnjo), jo končaj pred nadaljevanjem", "", "Kot si videl v prejšnji stopnji, smo uporabili `rebase -i` za preureditev commitov. Ko je bil commit, ki smo ga želeli spremeniti, na vrhu, smo preprosto uporabili --amend in preuredili nazaj v naše željeno stanje.", "", - "Edini problem tu je, da je veliko prerazporejanja, kar lahko povzroči rebase konflikte. Poglejmo si še eno drugo tehniko `git cherry-pick`" + "Edini problem tu je, da je veliko prerazporejanja, kar lahko povzroči rebase konflikte. Poglejmo si še eno drugo tehniko imenovano `git cherry-pick`." ] } }, @@ -684,7 +684,7 @@ exports.level = { "markdowns": [ "Torej v tej stopnji bi radi enako spremenili `C2`, ampak tokrat brez uporabe `rebase -i`. Kako to narediti, prepustim tebi! :D", "", - "Točno število zgornjih vejic (') na commitu ni pomembno, pomembna je samo relativna sprememba. Naprimer, vse točko bom dal tudi za drevo, ki ustreza ciljenmu drevesu, a ima povsod dodatno vejico" + "Točno število opuščajev (') na commitu ni pomembno, pomembna je samo relativna sprememba. Naprimer, vse točko bom dal tudi za drevo, ki ustreza ciljenmu drevesu, a ima povsod dodaten opuščaj." ] } } diff --git a/src/levels/mixed/tags.js b/src/levels/mixed/tags.js index 6d6bf551..cfac302e 100644 --- a/src/levels/mixed/tags.js +++ b/src/levels/mixed/tags.js @@ -796,10 +796,10 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Poizkusimo narediti tag na `C1`, ki je recimo naša prva verzija prototipa" + "Poizkusimo narediti tag na `C1`, ki je recimo naša prva različica prototipa." ], "afterMarkdowns": [ - "Tako! Kar enostavno. Tag smo poimenovali `v1` in se sklicuje na commit `C1`. Če ne navedeš commit, bo git postavil tag tam, kjer je trenutno `HEAD`" + "Tako! Kar enostavno. Tag smo poimenovali `v1` in se sklicuje na commit `C1`. Če ne navedeš commita, bo git postavil tag tam, kjer je trenutno `HEAD`." ], "command": "git tag v1 C1", "beforeCommand": "git commit" @@ -809,7 +809,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Za to stopnjo ustvari tage kot so določeni na ciljnem prikazu in nato checkoutaj `v1`. Opazil boš, kako prideš v detached `HEAD` stanje -- to je zato, ker ne moreš commitat direktno na `v1` tag.", + "Za to stopnjo ustvari tage kot so določeni na ciljnem prikazu in nato checkoutaj `v1`. Opazil boš, kako prideš v stanje ločenega `HEAD-a` -- to je zato, ker ne moreš commitat direktno na `v1` tag.", "", "V naslednji stopnji si bomo pogledali zanimivejši primer za uporabo tagov." ] diff --git a/src/levels/rampup/cherryPick.js b/src/levels/rampup/cherryPick.js index f16ca41e..8b35c9ea 100644 --- a/src/levels/rampup/cherryPick.js +++ b/src/levels/rampup/cherryPick.js @@ -21,7 +21,7 @@ exports.level = { "ko" : "Cherry-pick 소개", "uk": "Знайомство з cherry-pick", "vi" : "Giới thiệu về cherry-pick", - "sl_SI": "Uvod v cherry-pick" + "sl_SI": "Uvod v Cherry-pick" }, "hint": { "fr_FR": "git cherry-pick suivi par les noms de commits", @@ -38,7 +38,7 @@ exports.level = { "ko" : "커밋의 이름들로 git cherry-pick 하세요!", "uk": "git cherry-pick базується на іменах комітів!", "vi" : "git cherry-pick sau đó là tên commit!", - "sl_SI": "git cherry-pick nato pa imena commitov" + "sl_SI": "git cherry-pick nato pa imena commitov." }, "startDialog": { "en_US": { @@ -888,7 +888,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Za končanje te stopnje, enostavno skopiraj nekaj dela iz predstavljenih treh branchev v master. Vidiš lako, katere commite želimo, v priloženi vizualizaciji.", + "Za končanje te stopnje enostavno skopiraj nekaj dela iz predstavljenih treh branchev v master. V priloženi vizualizaciji lahko vidiš katere commite.", "" ] } diff --git a/src/levels/rampup/detachedHead.js b/src/levels/rampup/detachedHead.js index 153e6050..7373bae0 100644 --- a/src/levels/rampup/detachedHead.js +++ b/src/levels/rampup/detachedHead.js @@ -17,7 +17,7 @@ exports.level = { "ko" : "HEAD 분리하기", "uk": "Втрачаємо голову чи detached HEAD", 'vi': "Tháo đầu cái nào", - "sl_SI": "Odstranjevanje tvoje glave - HEAD" + "sl_SI": "Ločevanje tvoje glave - HEAD-a" }, "hint": { "en_US": "Use the label (hash) on the commit for help!", @@ -1133,7 +1133,7 @@ exports.level = { "markdowns": [ "## Premikanje po Gitu", "", - "Preden se lotimo nekaj naprednejših funkcij Gita, je pomembno da razumemo različne načine premikanja po drevesu commitov, ki predstavljajo tvoj projekt.", + "Preden se lotimo nekaj naprednejših funkcij Gita je pomembno, da razumemo različne načine premikanja po drevesu commitov, ki predstavljajo tvoj projekt.", "", "Ko ti je enkrat premikanje po drevesu domače, bodo tvoje sposobnosti z ostalimi git ukazi še močnejše!", "", @@ -1150,7 +1150,7 @@ exports.level = { "markdowns": [ "## HEAD", "", - "Najprej moramo spozanti \"HEAD\". HEAD (glava) je simbolično ime za trenutno checkoutan commit -- v bistvu povemo nad katerim commitu bomo nadaljevali.", + "Najprej moramo spozanti \"HEAD\". HEAD (glava) je simbolično ime za trenutno checkoutan commit -- v bistvu povemo na katerem commitom bomo nadaljevali.", "", "HEAD vedno kaže na zadnji commit na trenutnem drevesu. Večina git ukazov, ki spreminjajo to delovno drevo, bo začelo s spremembo HEAD-a.", "", @@ -1175,15 +1175,15 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "### Odstranjevanje HEAD-a", + "### Ločevanje HEAD-a", "", - "Odstranjevanje HEAD-a pomeni samo, da ga namestno na branch sedaj pripnemo na commit. Tako je zgledalo prej:", + "Ločevanje HEAD-a pomeni samo, da ga namestno na branch sedaj pripnemo na commit. Tako je izgledalo prej:", "", "HEAD -> master -> C1", "" ], "afterMarkdowns": [ - "Sedaj pa takole", + "Sedaj pa je takole:", "", "HEAD -> C1" ], @@ -1195,7 +1195,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Za dokončanje te stopnje, odstranimo HEAD iz `bugFix` in ga pritrdimo raje na commit.", + "Za dokončanje te stopnje odstranimo HEAD iz `bugFix` in ga pritrdimo raje na commit.", "", "Določi ta commit z njegovim hash-om. Hash za vsak commit je predstavljen v krogu, ki predstavlja commit." ] diff --git a/src/levels/rampup/interactiveRebase.js b/src/levels/rampup/interactiveRebase.js index 6ecd83b3..70856b1e 100644 --- a/src/levels/rampup/interactiveRebase.js +++ b/src/levels/rampup/interactiveRebase.js @@ -21,7 +21,7 @@ exports.level = { "ko" : "리베이스할 타겟으로 브랜치나 상대 참조(HEAD~)를 사용할 수 있습니다", "uk" : "ти можеш використовувати гілки чи відносні посилання (HEAD~) щоб вказувати ціль для rebase", "vi": "bạn có thể sử dụng tham chiếu tương đối (HEAD~) hoặc nhánh để chỉ định mục tiêu rebase", - "sl_SI": "uporabiš lahko bilokater branch ali relativen ref (HEAD~), da določiš cilj za rebase" + "sl_SI": "Uporabiš lahko bilokateri branch ali relativno referenco (HEAD~), da določiš cilj za rebase." }, "name": { "en_US": "Interactive Rebase Intro", @@ -961,9 +961,9 @@ exports.level = { "", "Git cherry-pick je odličen način, ko veš katere commite bi rad (in poznaš njihove hashe) -- težko je premagati njegovo enostavnost.", "", - "Ampak kaj pa situacija, ko ne veš katere commite želiš? K sreči ima git pokrit tudi to! Uporabimo lahko interaktivni rebase -- gre za najboljši način za pregled commitov, ki jih želiš rebaseati.", + "Ampak kaj pa situacija, ko ne veš katere commite želiš? K sreči ima git pokrito tudi to! Uporabimo lahko interaktivni rebase -- gre za najboljši način za pregled commitov, ki jih želiš rebaseati.", "", - "Spustimo se v podrobnosti..." + "Spustimo se v podrobnosti ..." ] } }, @@ -975,7 +975,7 @@ exports.level = { "", "Če vključiš to opcijo, bo git odprl okno, da ti pokaže, kateri commiti bodo skopirani pod naš ciljni commit rebaseanja. Prav tako pokaže tudi njihove hashe in sporočila, kar je super za razumevanje kaj je kaj.", "", - "Za \"pravi\" git, odprte oknja pomeni odprtje datoteke v urejevalniku kot je `vim`. Za naš namen sem zgradil majhno okno, ki se obnaša enako." + "Za \"pravi\" git, odpiranje okna pomeni odpiranje datoteke v urejevalniku kot je `vim`. Za naš namen sem zgradil majhno okno, ki se obnaša enako." ] } }, @@ -986,7 +986,7 @@ exports.level = { "Ko se odpre okno za interaktivno rebaseanje, imaš možnost narediti 3 stvari:", "", "* Enostavno lahko preurediš commite v vrstni red, ki ga želiš (v našem oknu to dosežeš kar s klikom in vlečenjem miške).", - "* Odločiš se lahko, da čisto izpustiš nekatere commite. To je omogočeno z `pick` -- izklop `pick` opcije pomeni, da bi rad commit izpustil.", + "* Odločiš se lahko, da čisto izpustiš nekatere commite. To je omogočeno s `pick` -- izklop `pick` opcije pomeni, da bi rad commit izpustil.", "* Nenazadnje, commite lahko tudi stisnemo. Nažalost naše stopnje tega ne podpirajo zaradi logističnih razlogov, zato bom preskočil podrobnosti tega. Toda če povzamem -- omogoča združevanje commitov.", "", "Super! Poglejmo primer." @@ -997,10 +997,10 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Ko pritisneš gumb, se bo pojavilo interaktivno okno. Prerazporedi nekaj commitov okoli (ali pa jih odstrani z pick) in poglej rezultat!" + "Ko pritisneš gumb, se bo pojavilo interaktivno okno. Prerazporedi nekaj commitov okoli (ali pa jih odstrani z omit) in poglej rezultat!" ], "afterMarkdowns": [ - "Boom! Git je na dno skopiral commite v točno takšnem vrstnem redu, kot si ga določil v oknu" + "Boom! Git je na dno skopiral commite v točno takšnem vrstnem redu, kot si ga določil v oknu." ], "command": "git rebase -i HEAD~4 --aboveAll", "beforeCommand": "git commit; git commit; git commit; git commit" diff --git a/src/levels/rampup/relativeRefs.js b/src/levels/rampup/relativeRefs.js index a7c991c3..ae1d758f 100644 --- a/src/levels/rampup/relativeRefs.js +++ b/src/levels/rampup/relativeRefs.js @@ -1097,9 +1097,9 @@ exports.level = { "", "Premikanje po Gitu z določanjem hashev commitov je lahko včasih nerodno. V praksi ne boš imel na voljo lepe vizualizacije drevesa zraven ukaznega terminala, zato boš moral uporabljati `git log`, da boš videl hashe.", "", - "Nadaljne, hashi so ponavadi v praksi tudi veliko daljši. Naprimer, hash commita predstavljenega v prejšnji stopnji je `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Ni ravno preprosto za izgovoriti ...", + "Hashi so ponavadi v praksi tudi veliko daljši. Naprimer, hash commita, predstavljenega v prejšnji stopnji, je `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Ni ravno preprosto za izgovoriti ...", "", - "Pozitivna stran je, da je Git pameten glede hashev. Zahteva, da napišeš le toliko znakov hasha, da lahko prepozna unikaten commit. Tako lahko napišem `fed2` namesto dolge verzije zgoraj." + "Pozitivna stran je, da je Git pameten glede hashev. Zahteva, da napišeš le toliko znakov hasha, da lahko prepozna unikaten commit. Tako lahko napišem `fed2`, namesto dolge verzije zgoraj." ] } }, @@ -1107,14 +1107,14 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Kot sem rekel, izbiranje commitov po njihovih commitih ni ravno najpriročnejša stvar na svetu, zato ima Git relativne reference. In te so super!", + "Kot sem rekel, izbiranje commitov po njihovih hashih ni ravno najpriročnejša stvar na svetu, zato ima Git relativne reference. In te so super!", "", - "Z relativni referencami, lahko izhajaš iz nekje (npr. branch `bugFix` ali `HEAD`) in delaš od tam.", + "Z relativni referencami lahko izhajaš iz nekje (npr. branch `bugFix` ali `HEAD`) in delaš od tam.", "", - "Relativni commiti so mogočni, ampak tu bomo predstavili dva preprosta:", + "Relativni commiti so močni in obsegajoči, ampak tu bomo predstavili dva preprosta:", "", "* Premikanje navzgor en commit naenkrat z `^`", - "* Premikanje navzgor num-krat z `~`" + "* Premikanje navzgor n-krat z `~`" ] } }, @@ -1122,16 +1122,16 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Pogljemo najprej operator `^`. Vsakič, ko pripneš to imenu reference, poveš Gitu naj najde starša tega commita.", + "Poglejmo najprej operator `^`. Vsakič, ko pripneš to imenu reference, poveš Gitu, naj najde starša tega commita.", "", "Torej `master^` je isto kot \"prvi starš brancha `master`\".", "", - "`master^^` je stari starš (prednik druge generacije) `master`", + "`master^^` je stari starš (prednik druge generacije) `master`.", "", - "Checkoutajmo sedaj commit nad masterjem" + "Checkoutajmo sedaj commit nad masterjem." ], "afterMarkdowns": [ - "Boom! Narejeno. Veliko enostavneje kot tipkanje hasha commita" + "Boom! Narejeno. Veliko enostavneje kot tipkanje hasha commita." ], "command": "git checkout master^", "beforeCommand": "git commit" @@ -1144,7 +1144,7 @@ exports.level = { "Prav tako se lahko sklicuješ na `HEAD` kot relativno referenco. Uporabimo to nekajkrat, da se pomakenmo višje po drevesu commitov" ], "afterMarkdowns": [ - "Enostavno! Lahko potujemo nazaj v čas z `HEAD^`" + "Enostavno! Lahko potujemo nazaj v čas z `HEAD^`." ], "command": "git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^", "beforeCommand": "git commit; git commit" @@ -1154,7 +1154,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Za dokončanje te stopnje, checkoutaj starša commita `bugFix`. To bo razdružilo `HEAD`.", + "Za dokončanje te stopnje, checkoutaj starša commita `bugFix`. To bo ločilo `HEAD`.", "", "Hash lahko določiš, če želiš, ampak probaj raje z relativnimi referencami!" ] diff --git a/src/levels/rampup/relativeRefs2.js b/src/levels/rampup/relativeRefs2.js index 43187202..985e9678 100644 --- a/src/levels/rampup/relativeRefs2.js +++ b/src/levels/rampup/relativeRefs2.js @@ -17,7 +17,7 @@ exports.level = { "ko" : "이번 레벨을 완료하려면 최소 한번은 직접 참조(해시)를 사용해야 합니다.", "uk": "Тобі потрібно використати як мінімум одне пряме посилання (хеш) щоб пройти цей рівень", "vi": "Bạn sẽ cần dùng ít nhất một tham chiếu trực tiếp (mã băm) để hoàn thành cấp độ này", - "sl_SI": "Moral boš uporabiti vsaj eno direktno referenco (hash) za dokončanje te stopnje" + "sl_SI": "Moral boš uporabiti vsaj eno direktno referenco (hash) za dokončanje te stopnje." }, "name": { "en_US": "Relative Refs #2 (~)", @@ -997,7 +997,7 @@ exports.level = { "Recimo, da se želiš premakniti veliko stopenj višje po drevesu commitov. Malo je nerodno večkrat tipkati `^`, zato ima Git tudi tilda (~) operator.", "", "", - "Tild operator (opcijsko) sprejme številko, ki določi, koliko staršev bi se rad povzpel po drevesu. Poglejmo to v praksi" + "Tilda operator (opcijsko) sprejme številko, ki določi, koliko staršev bi se rad povzpel po drevesu. Poglejmo to v praksi." ] } }, @@ -1037,7 +1037,7 @@ exports.level = { "Poglejmo si prejšnji ukaz v praksi." ], "afterMarkdowns": [ - "Tako ja! Relativne reference so nam dale jedrnat način s katerim se lakho nanašamo na `C1` in branch force-anje (`-f`) nam je omogočilo, da hitro prestavimo branch na to lokacijo." + "Tako ja! Relativne reference so nam dale jedrnat način s katerim se lahko nanašamo na `C1` in branch force-anje (`-f`) nam je omogočilo, da hitro prestavimo branch na to lokacijo." ], "command": "git branch -f master HEAD~3", "beforeCommand": "git commit; git commit; git commit; git checkout -b bugFix" diff --git a/src/levels/rampup/reversingChanges.js b/src/levels/rampup/reversingChanges.js index 9ee409be..08b06449 100644 --- a/src/levels/rampup/reversingChanges.js +++ b/src/levels/rampup/reversingChanges.js @@ -35,7 +35,7 @@ exports.level = { "ru_RU": "Обрати внимание, что revert и reset принимают разные параметры.", "uk": "Зверни увагу на те що revert та reset приймають різні параметри", "vi": "Lưu ý rằng hoàn tác(revert) và đặt lại(reset) có những đối số khác nhau.", - "sl_SI": "Revert in reset sprejmeta različne argumente" + "sl_SI": "Revert in reset sprejmeta različne argumente." }, "startDialog": { "en_US": { @@ -943,7 +943,7 @@ exports.level = { "beforeMarkdowns": [ "## Git Reset", "", - "`git reset` povrne spremembe tako, da prestavi referenco brancha na starejši commit. Lahko si predstavljaš kot \"pisanje zgodovine na novo;\" `git reset` bo prestavil branch nazaj, kot da se commiti sploh niso zgodili.", + "`git reset` povrne spremembe tako, da prestavi referenco brancha na starejši commit. Lahko si predstavljaš kot \"pisanje zgodovine na novo\"; `git reset` bo prestavil branch nazaj, kot da se commiti sploh niso zgodili.", "", "Poglejmo kako to izgleda:" ], @@ -962,7 +962,7 @@ exports.level = { "", "Medtem ko ponastavljanje z reset deluje super na lokalnih brancih na tvoji mašini, njegova metoda \"prepisovanja zgodovina\" ne deluje na remote brancih, ki jih uporabljajo drugi.", "", - "Če želimo ponastaviti spremembe in *deliti* te ponastavitve z drugimi, moramo uporabiti `git revert`. Poglejmo si to v praksi" + "Če želimo ponastaviti spremembe in *deliti* te ponastavitve z drugimi, moramo uporabiti `git revert`. Poglejmo si to v praksi." ], "afterMarkdowns": [ "Čudno, nov commit se je naredil pod commitom, ki smo ga želeli reversati. To je zato, ker ta nov commit `C2'` uvede *spremembe* -- spremembe so pač v tem primeru točno nasprotne od `C2`.", diff --git a/src/levels/rebase/selectiveRebase.js b/src/levels/rebase/selectiveRebase.js index 00720f09..86ec93c2 100644 --- a/src/levels/rebase/selectiveRebase.js +++ b/src/levels/rebase/selectiveRebase.js @@ -38,7 +38,7 @@ exports.level = { "ru_RU": "Убедись, что у нас всё по порядку! Сначала ветка `one`, потом `two` и только потом `three`", "uk": "Переконайся, що все йде за порядком! Спершу гілка `one`, потім `two`, і тільки потім `three`", "vi": "Hãy chắc chắn rằng bạn làm đúng thứ tự! Nhánh `one` trước, rồi `two`, rồi mới đến `three`", - "sl_SI": "Glej da boš vse opravil v pravilnem vrstnem redu! Najprej branch ena, nato pa dva in tri" + "sl_SI": "Glej da boš vse opravil v pravilnem vrstnem redu! Najprej branch ena, nato pa dva in tri." }, "startDialog": { "en_US": { @@ -330,11 +330,11 @@ exports.level = { "", "WOAHHHhhh Miško! Ta stopnja bo pa pravi izziv.", "", - "Tu imamo `master`, ki je nekaj commitov pred branchi `one`, `two` in `three`. Iz neznanega razloga moramo posodbiti te tri druge branche z modificiranimi različicami zadnjih nekaj commitov na masterju.", + "Tu imamo `master`, ki je nekaj commitov pred branchi `one`, `two` in `three`. Iz neznanega razloga moramo posodobiti te tri druge branche z modificiranimi različicami zadnjih nekaj commitov na masterju.", "", "Branch `one` potrebuje prerazporeditev in izbris `C5`. `two` rabi samo prerazporeditev, `three` pa potrebuje samo en commit!", "", - "Prepustili ti bomo da ugotovi kako tole rešiti -- vseeno lahko na koncu preveriš našo rešitev s `show solution`. " + "Prepustili ti bomo, da sam ugotoviš, kako tole rešiti -- vseeno lahko na koncu preveriš našo rešitev s `show solution`. " ] } } diff --git a/src/levels/remote/clone.js b/src/levels/remote/clone.js index fc54f41d..84734d43 100644 --- a/src/levels/remote/clone.js +++ b/src/levels/remote/clone.js @@ -857,7 +857,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "## Naši Ukazi za kreiranje oddaljenih repozitorijev", + "## Naši ukazi za kreiranje oddaljenih repozitorijev", "", "Do te točke, se je Learn Git Branching osredotočil na učenje osnov dela na lokalnih repozitorijih (branching, merging, rebasing, itd). Ampak sedaj, ko se hočemo naučiti še o delu na oddaljenih repozitorijih, potrebujemo ukaz, da postavi okolje za te lekcije. `git clone` bo ta ukaz.", "", @@ -874,7 +874,7 @@ exports.level = { "" ], "afterMarkdowns": [ - "Evo ga! Sedaj imamo oddaljen repozitorij našega projekta. Izgleda precej podoben razen nekaj vizalnih sprememb, da se opazi razlika -- v kasnejših stopnjah boš spoznal, kako si delimo delo preko teh repozitorijev." + "Evo ga! Sedaj imamo oddaljen repozitorij našega projekta. Izgleda precej podoben razen nekaj vizualnih sprememb, da se opazi razlika -- v kasnejših stopnjah boš spoznal, kako si delimo delo preko teh repozitorijev." ], "command": "git clone", "beforeCommand": "" diff --git a/src/levels/remote/fakeTeamwork.js b/src/levels/remote/fakeTeamwork.js index a9789817..113daef1 100644 --- a/src/levels/remote/fakeTeamwork.js +++ b/src/levels/remote/fakeTeamwork.js @@ -34,7 +34,7 @@ exports.level = { "uk" : "пам’ятай що ти можеш вказати кількість фейкових комітів", "ko" : "가장할 커밋의 갯수를 조절할 수 있습니다.", "vi" : "Nhớ rằng bạn có thể chỉ định số lượng commit để giả lập.", - "sl_SI": "pomni da lahko določiš število lažnih commitov" + "sl_SI": "Spomni se, da lahko določiš število lažnih commitov." }, "startDialog": { "en_US": { @@ -803,7 +803,7 @@ exports.level = { "markdowns": [ "## Simulacija sodelovanja", "", - "Tule imamo izziv -- za nekaj naslednjih lekcij te moramo naučiti kako potegniti dol spremembe, ki so bile narejene na oddaljenem repozitoriju.", + "Tule imamo izziv -- za nekaj naslednjih lekcij te moramo naučiti, kako potegniti dol spremembe, ki so bile narejene na oddaljenem repozitoriju.", "", "To pomeni, da se moramo pravzaprav \"pretvarjati\", da je oddaljen branch posodobil kak sodelavec, včasih na določenem branchu ali določeno število commitov.", "", @@ -815,7 +815,7 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Privzeto delovanje `fakeTeamwork` je, da samo doda commit na master" + "Privzeto delovanje `fakeTeamwork` je, da samo doda commit na master:" ], "afterMarkdowns": [ "Tako -- oddaljen repo je bil posodobljen z novim commitom, katerega še nismo potegnili k sebi, ker še nismo pognali ukaza `git fetch`." @@ -828,10 +828,10 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Prav tako lahko določimo tudi število commtiov ali ime brancha tako, da jih dodamo na koncu" + "Prav tako lahko določimo tudi število commitov ali ime brancha tako, da jih dodamo na koncu:" ], "afterMarkdowns": [ - "Z enim ukazom smo simulirali sodelavca, ki je dodal tri commite na `foo` branch na našem oddaljnem repotu" + "Z enim ukazom smo simulirali sodelavca, ki je dodal tri commite na `foo` branch na našem oddaljnem repotu." ], "command": "git fakeTeamwork foo 3", "beforeCommand": "git branch foo; git clone" diff --git a/src/levels/remote/fetch.js b/src/levels/remote/fetch.js index c92ec6d3..20448998 100644 --- a/src/levels/remote/fetch.js +++ b/src/levels/remote/fetch.js @@ -34,7 +34,7 @@ exports.level = { "uk" : "Просто виконай git fetch!", "ko" : "그냥 git fetch를 하세요!", "vi" : "Gõ git fetch là được!", - "sl_SI": "le izvedi git fetch!" + "sl_SI": "Le izvedi git fetch!" }, "startDialog": { "en_US": { @@ -1071,7 +1071,7 @@ exports.level = { "", "V tej lekciji se bomo naučili kako fetchat (prenesti) podatke iz oddaljenega repozitorija -- ukaz za to je poimenovan `git fetch`.", "", - "Opazil boš, da ko posodobimo našo predstavitev oddaljenega repota, se bo naša oddaljena veja posodobila in imela nove spremembe. To se navezuje na prejšnjo lekcijo o oddaljenih repozitorijih" + "Opazil boš, da ko posodobimo našo predstavitev oddaljenega repota, se bo naš oddaljen branch posodobil in imel nove spremembe. To se navezuje na prejšnjo lekcijo o oddaljenih repozitorijih." ] } }, @@ -1101,7 +1101,7 @@ exports.level = { "", "`git fetch` v bistvu našo lokalno predstavitev oddaljenega repozitorija uskladi z dejanskim stanjem na oddaljenem repozitoriju.", "", - "Če se spomneš še iz prejšnje lekcije smo rekli, da oddaljeni branchi odsevajo stanje na oddaljenih repozitorijih odkar si komuniciral z njimi. `git fetch` je način, da komuniciraš z njimi! Upam, da je sedaj povezava med oddaljenimi repozitoriji in `git fetch` jasna.", + "Če se spomneš še iz prejšnje lekcije smo rekli, da oddaljeni branchi odsevajo stanje na oddaljenih repozitorijih, odkar si komuniciral z njimi. `git fetch` je način, da komuniciraš z njimi! Upam, da je sedaj povezava med oddaljenimi repozitoriji in `git fetch` jasna.", "", "`git fetch` ponavadi komunicira z oddaljenimi repozitoriji preko interneta (s protokolom kot sta `http://` ali `git://`).", "" diff --git a/src/levels/remote/fetchArgs.js b/src/levels/remote/fetchArgs.js index 274484f2..ff148002 100644 --- a/src/levels/remote/fetchArgs.js +++ b/src/levels/remote/fetchArgs.js @@ -34,7 +34,7 @@ exports.level = { "ko" : "커밋 ID가 바뀔수도있으니 주의하세요! \"help level\"을 입력하면 슬라이드들을 다시 읽어볼수 있습니다.", "uk" : "Зверни увагу на те, що номери комітів можуть змінюватися! Слайди уроку можна переглянути ще раз командою \"help level\"", "vi" : "Lưu ý id của các commit bị tráo đổi, bạn có thể dùng \"help level\" để đọc lại hội thoại", - "sl_SI": "Bodi pozoren kako so se commit id-ji morda zamenjali! Ponovno lahko prebereš navodila z \"help level\"" + "sl_SI": "Bodi pozoren kako so se commit id-ji morda zamenjali! Ponovno lahko prebereš navodila z \"help level\"." }, "startDialog": { "en_US": { @@ -1644,9 +1644,9 @@ exports.level = { "markdowns": [ "## Git fetch argumenti", "", - "Torej pravkar smo se naučili vse o git push argumentih, tem kul `` parameteru in celo stolpičnem refspecsu (`:`). Torej uporabimo vse znanje tudi za `git fetch`?", + "Torej pravkar smo se naučili vse o git push argumentih ter kul `` parameteru in celo dvopični referenci (`:`). Torej uporabimo vse znanje tudi za `git fetch`?", "", - "Itak! Argumenti za `git fetch` so v bistvu *zelo zelo* podobni tistim za `git push`. Gre za enak koncept ampak uporabljen v nasprotni smeri (ker sedaj prenašamo commite namesto, da jih nalagamo).", + "Itak! Argumenti za `git fetch` so v bistvu *zelo zelo* podobni tistim za `git push`. Gre za enak koncept, ampak uporabljen v nasprotni smeri (ker sedaj prenašamo commite, namesto da jih nalagamo).", "", "Pojdimo čez koncepte drug za drugim ..." ] @@ -1664,7 +1664,7 @@ exports.level = { "", "Bo Git šel na `foo` branch na oddaljenem repotu, pograbil vse commite, katerih lokalno še nimamo in jih dodal na dno lokalnega `o/foo` brancha.", "", - "Poglejmo to v akciji (samo kot osvežitev)" + "Poglejmo to v akciji (samo kot osvežitev)." ] } }, @@ -1675,7 +1675,7 @@ exports.level = { "Z določanjem mesta ..." ], "afterMarkdowns": [ - "Prenesemo samo commite iz `foo` in jih postavimo na `o/foo`" + "Prenesemo samo commite iz `foo` in jih postavimo na `o/foo`." ], "command": "git fetch origin foo", "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2" @@ -1685,9 +1685,9 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Morda se sprašuješ -- zakaj je got dodal te commite na `o/foo` oddaljen branch namesto, da bi jih dodal na moj lokalen `foo` branch? Mislil sem da je `` parameter mesto, ki obstaja in lokalno in na oddaljenem repozitoriju?", + "Morda se sprašuješ -- zakaj je git dodal te commite na `o/foo` oddaljen branch namesto, da bi jih dodal na moj lokalen `foo` branch? Mislil sem, da je `` parameter mesto, ki obstaja in lokalno in na oddaljenem repozitoriju?", "", - "No, git naredi v tem primeru posebno izjemo, ker imaš morda delo na `foo` branchu, ki ga ne želiš pokvariti!! To se navezuje na prejšnjo lekcij o `git fetch` -- ne posodobi tvojega lokalnega ne-oddaljenega brancha, samo prenense commite (da jih lahko pregledaš / mergaš kasneje).", + "No, git naredi v tem primeru posebno izjemo, ker imaš morda delo na `foo` branchu, ki ga ne želiš pokvariti!! To se navezuje na prejšnjo lekcijo o `git fetch` -- ne posodobi tvojega lokalnega ne-oddaljenega brancha, samo prenese commite (da jih lahko pregledaš / mergaš kasneje).", "" ] } @@ -1698,11 +1698,11 @@ exports.level = { "markdowns": [ "\"Ampak v tem primeru, kaj se zgodi, če posebaj določim izvor in cilj s `:`?\"", "", - "Če se počutiš dovolj strastno, da bi fetchal commite *direktno* na lokalen branch, potem ja, lahko to definiraš s stolpično referenco. Ne moreš fetchati commitov na branch, ki je checkoutan, ampak v drugih primerih to lahko narediš.", + "Če se počutiš dovolj strastno, da bi fetchal commite *direktno* na lokalen branch, potem ja, lahko to definiraš z dvopično referenco. Ne moreš fetchati commitov na branch, ki je checkoutan, ampak v drugih primerih to lahko narediš.", "", "Tu je edina zanka -- `` je sedaj mesto na *oddaljenem* in `` je *lokalno* mesto za dodati te commite. Je ravno nasprotje od git pusha in to je logično, saj prenašamo podatke v nasprotni smeri!", "", - "Glede na to, razvijalci to redko delajo v praksi. To predstavljam zgolj, da si lahko predstavljaš kako sta si `fetch` in `push` kar podobna, ampak v nasprotni smeri." + "Glede na to, razvijalci to redko delajo v praksi, to predstavljam zgolj, da si lahko predstavljaš, kako sta si `fetch` in `push` kar podobna, ampak v nasprotni smeri." ] } }, @@ -1713,7 +1713,7 @@ exports.level = { "Poglejmo si to zmešnjavo v praksi:" ], "afterMarkdowns": [ - "Wow! Vidiš, git je naredil `foo~1` kot mesto na originu in nato prenesel commite na `bar` (ki je bil lokalen branch). Opazi kako `foo` in `o/foo` nista bila posodobljena, ker smo določili destinacijo." + "Wow! Vidiš, git je naredil `foo~1` kot mesto na originu in nato prenesel commite na `bar` (ki je bil lokalen branch). Opazi, kako `foo` in `o/foo` nista bila posodobljena, ker smo določili destinacijo." ], "command": "git fetch origin foo~1:bar", "beforeCommand": "git branch foo; git clone; git branch bar; git fakeTeamwork foo 2" @@ -1723,7 +1723,7 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Kaj pa če destinacija ne obstaja, preden zaženem ukaz? Poglejmo zadnji primer, vendar brez da bi prej `bar` že obstajal." + "Kaj pa, če destinacija ne obstaja, preden zaženem ukaz? Poglejmo zadnji primer, vendar brez da bi prej `bar` že obstajal." ], "afterMarkdowns": [ "Vidiš, je TAKO kot git push. Git je naredil destinacijo lokalno pred fetchem, tako kot bo naredil destinacijo na oddaljneme repotu pred pushem (če ne obstaja)." diff --git a/src/levels/remote/fetchRebase.js b/src/levels/remote/fetchRebase.js index 45716c60..c9312a80 100644 --- a/src/levels/remote/fetchRebase.js +++ b/src/levels/remote/fetchRebase.js @@ -17,7 +17,7 @@ exports.level = { "uk" : "Розбіжності в історії", "ko" : "엇갈린 히스토리", "vi" : "Dị biệt lịch sử", - "sl_SI": "Razdeljena zgodovina" + "sl_SI": "Razdeljena Zgodovina" }, "hint": { "en_US": "check out the ordering from the goal visualization", @@ -34,7 +34,7 @@ exports.level = { "uk" : "перевірте порядок в візуалізації цілі", "ko" : "순서는 goal을 참고하세요", "vi" : "kiểm tra kỹ thứ tự trên mô hình mục tiêu", - "sl_SI": "preveri vrstni red iz ciljne vizualizacije" + "sl_SI": "Preveri vrstni red iz ciljne vizualizacije." }, "startDialog": { "en_US": { @@ -2059,11 +2059,11 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Predstavljaj si da scloniraš repozitorij v ponedeljek in začneš delati na novi fukncionalnosti. V petek si pripravljen da objaviš svoje sprememebe -- ampak o ne! Tvoji sodelavci so napisali goro kode med tednom in tvoja funkcionalnost je postala zastarela. Prav tako so objavili te commite v skupen repozitorij, tako da sedaj *tvoje* delo izhaja iz *stare* verzije projekta, ki ni več taprava.", + "Predstavljaj si, da skloniraš repozitorij v ponedeljek in začneš delati na novi funkcionalnosti. V petek si pripravljen, da objaviš svoje spremembe -- ampak o ne! Tvoji sodelavci so napisali goro kode med tednom in tvoja funkcionalnost je postala zastarela. Prav tako so objavili te commite v skupen repozitorij, tako da sedaj *tvoje* delo izhaja iz *stare* verzije projekta, ki ni več taprava.", "", "V tem primeru je ukaz `git push` dvoumen. Če bi pognal `git push`, bi git moral spremeniti oddaljeni repozitorij nazaj na stanje iz ponedeljka? Bi moral poizkusiti dodati tvoje delo, brez da odstarani novo kodo? Ali bi moral povsem ignorirati tvoje spremembe, ker so zastarele?", "", - "Ker je toliko dvomov v tej situaciji (kjer se je zgodovina razdelila), ti git ne pusti, da bi `pushal` svoje spremembe. V bistvu te prisili da vključiš zadnje stanje oddaljenega repozitorija preden lahko deliš svoje delo." + "Ker je toliko dvomov v tej situaciji (kjer se je zgodovina razdelila), ti git ne pusti, da bi `pushal` svoje spremembe. V bistvu te prisili, da vključiš zadnje stanje oddaljenega repozitorija, preden lahko deliš svoje delo." ] } }, @@ -2071,10 +2071,10 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Toliko govorjenja! Poglej stvar v praksi" + "Toliko govorjenja! Poglejmo stvar v praksi." ], "afterMarkdowns": [ - "Vidiš? Nič se ni spremenilo, ker je ukaz spodeletel. `git push` spodleti, ker tvoj zadnji commit `C3` izhaja iz oddaljenega `C1`. Oddaljen repozitorij se je med tem posodbil na `C2`, zato git zavrne tvoj push" + "Vidiš? Nič se ni spremenilo, ker je ukaz spodeletel. `git push` spodleti, ker tvoj zadnji commit `C3` izhaja iz oddaljenega `C1`. Oddaljen repozitorij se je med tem posodobil na `C2`, zato git zavrne tvoj push." ], "command": "git push", "beforeCommand": "git clone; git fakeTeamwork; git commit" @@ -2086,7 +2086,7 @@ exports.level = { "markdowns": [ "Kako rešiti to zagato? Enostavno je, vse kar moraš narediti je, da spremeniš, da tvoje delo izhaja iz zadnje verzije oddaljenega brancha.", "", - "Obstaja nekaj načinov, da to narediš, ampak najbol naraven način je, da to narediš z rebaseom. Poglejmo, kako to izgleda." + "Obstaja nekaj načinov, da to narediš, ampak najnaravnejši način je, da to narediš z rebaseom. Poglejmo, kako to izgleda." ] } }, @@ -2097,7 +2097,7 @@ exports.level = { "Če sedaj rebaseamo, namesto da pushamo ..." ], "afterMarkdowns": [ - "Boom! Posodobili smo našo lokalno reprezentacijo oddaljenega repozitorija z `git fetch`, rebaseali naše delo, da vsebuje nove spremembe iz oddaljenega repota, nato pa naložili svoje delo z `git push`" + "Boom! Posodobili smo našo lokalno reprezentacijo oddaljenega repozitorija z `git fetch`, rebaseali naše delo, da vsebuje nove spremembe iz oddaljenega repota, nato pa naložili svoje delo z `git push`." ], "command": "git fetch; git rebase o/master; git push", "beforeCommand": "git clone; git fakeTeamwork; git commit" @@ -2122,7 +2122,7 @@ exports.level = { "Če sedaj uporabimo merge namesto rebasea ..." ], "afterMarkdowns": [ - "Boom! Posodobili smo našo lokalno sliko oddaljenega repozitorija z `git fetch`, *zmergali* novo delo v naše delo (kot odraz novih sprememb na oddaljenem branchu) in jih nato naložili z `git push`" + "Boom! Posodobili smo našo lokalno sliko oddaljenega repozitorija z `git fetch`, *zmergali* novo delo v naše delo (kot odraz novih sprememb na oddaljenem branchu) in jih nato naložili z `git push`." ], "command": "git fetch; git merge o/master; git push", "beforeCommand": "git clone; git fakeTeamwork; git commit" @@ -2157,7 +2157,7 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "In sedaj z navadnim `pullom`" + "In sedaj z navadnim `pullom` ..." ], "afterMarkdowns": [ "Zopet enako kot prej!" diff --git a/src/levels/remote/lockedMaster.js b/src/levels/remote/lockedMaster.js index 79de89c6..29a6742d 100644 --- a/src/levels/remote/lockedMaster.js +++ b/src/levels/remote/lockedMaster.js @@ -10,7 +10,7 @@ exports.level = { "es_ES": "Crea la rama feature desde la rama master en local antes de restablecerlo para que sea el mismo que la rama master de origen", "fr_FR": "Créer la branche feature à partir du master local, avant de la restaurer dans le même état que o/master", "ko" : "로컬 저장소의 master 브랜치로부터 feature 브랜치를 만드세요. 그리고 o/master와 같아질 수 있도록 로컬 저장소의 master 브랜치를 reset 하세요.", - "sl_SI": "Naredi feature branch iz lokalnega masterja preden ga ponastaviš, da bo enak kot origin master " + "sl_SI": "Naredi feature branch iz lokalnega masterja preden ga ponastaviš, da bo enak kot origin master." }, "name": { "en_US": "Locked Master", diff --git a/src/levels/remote/mergeManyFeatures.js b/src/levels/remote/mergeManyFeatures.js index d647051f..dc1a5c55 100644 --- a/src/levels/remote/mergeManyFeatures.js +++ b/src/levels/remote/mergeManyFeatures.js @@ -697,9 +697,9 @@ exports.level = { "", "* Rebasanje spremeni (navidezno) zgodovino drevesa commitov.", "", - "Naprimer, commit `C1` je lahko rebasean *mimo* `C3`. Potem izgleda kot da je delo za `C1'` prišlo za `C3`, čeprav je v resnici bilo končano prej.", + "Naprimer, commit `C1` je lahko rebasean *mimo* `C3`. Potem izgleda, kot da je delo za `C1'` prišlo za `C3`, čeprav je v resnici bilo končano prej.", "", - "Nekateri razvijalci imajo radi ohranjanje zgodovine in imajo posledično rajše merganje. Drugi (kot jaz) imajo rajši čisto drevo commitov in posledično rebasanje. Na koncu prevlada osebna preferenca :D" + "Nekateri razvijalci imajo radi ohranjanje zgodovine in imajo posledično rajši merganje. Drugi (kot jaz) imajo rajši čisto drevo commitov in posledično rebasanje. Na koncu prevlada osebna preferenca. :D" ] } }, diff --git a/src/levels/remote/pull.js b/src/levels/remote/pull.js index 6651a964..d59d1aa0 100644 --- a/src/levels/remote/pull.js +++ b/src/levels/remote/pull.js @@ -17,7 +17,7 @@ exports.level = { "uk" : "Git pull", "ko" : "Git pull", "vi" : "Git pull", - "sl_SI": "Git pull" + "sl_SI": "Git Pull" }, "hint": { "en_US": "Just run git pull!", @@ -873,7 +873,7 @@ exports.level = { "", "Sedaj, ko smo videli kako pridobiti podatke iz oddaljenega repozitorija z `git fetch`, posodobimo naše delo, da bo odsevalo te sprememebe!", "", - "V bistvu je več načinov za izvedbo tega -- ko imaš enkrat na lokalno na voljo nove commite, jih lahko vključiš, kot da so normalni commiti na drugem branchu. To pomeni, da lahko izvedeš ukaze, kot so:", + "V bistvu je več načinov za izvedbo tega -- ko imaš enkrat lokalno na voljo nove commite, jih lahko vključiš, kot da so normalni commiti na drugem branchu. To pomeni, da lahko izvedeš ukaze, kot so:", "", "* `git cherry-pick o/master`", "* `git rebase o/master`", @@ -888,10 +888,10 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Poglejmo najprej `fetch` in `merge` izvedena zaporedno" + "Poglejmo najprej `fetch` in `merge` izvedena zaporedno:" ], "afterMarkdowns": [ - "Boom -- prenesli smo `C3` z `fetch` in nato mergali delo z `git merge o/master`. Sedaj naš `master` branch odseva spremembe novega dela iz oddaljenega repoztorija (v tem primeru poimenovan `origin`)" + "Boom -- prenesli smo `C3` s `fetch` in nato mergali delo z `git merge o/master`. Sedaj naš `master` branch odseva spremembe novega dela iz oddaljenega repoztorija (v tem primeru poimenovan `origin`)." ], "command": "git fetch; git merge o/master", "beforeCommand": "git clone; git commit; git fakeTeamwork" @@ -914,7 +914,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Kasneje bomo raziskali podrobnosti ukaza `git pull` (vključno z opcijami in argumenti), ampak zaenkrat poizkusimo to v tej stopnji.", + "Kasneje bomo raziskali podrobnosti ukaza `git pull` (vključno z opcijami in argumenti), ampak zaenkrat poizkusimo brez v tej stopnji.", "", "Pomni -- to stopnjo lahko rešiš s `fetch` in `merge`, ampak boš rabil en dodaten ukaz :P" ] diff --git a/src/levels/remote/pullArgs.js b/src/levels/remote/pullArgs.js index 7586e839..b11083fb 100644 --- a/src/levels/remote/pullArgs.js +++ b/src/levels/remote/pullArgs.js @@ -34,7 +34,7 @@ exports.level = { "ko" : "fetch/pull 과 인자들로 새 로컬 브랜치를 생성할수 있다는것을 기억하세요.", "uk" : "Пам'ятай, що ти можеш створювати нові гілки, використовуючи fetch/pull з аргументами", "vi" : "Nhớ rằng,bạn có thể tạo nhánh cục bộ mới với tham số của fetch/pull", - "sl_SI": "Zapomni si, da lahko ustvariš nove lokalne branche s fetch/pull argumenti" + "sl_SI": "Zapomni si, da lahko ustvariš nove lokalne branche s fetch/pull argumenti." }, "startDialog": { "en_US": { @@ -1007,9 +1007,9 @@ exports.level = { "markdowns": [ "## Git pull argumenti", "", - "Sedaj ko veš praktično *vse*, kar je za vedeti o argumentih za `git fetch` in `git push`, ni skoraj ničesar za dodati za `git pull` :)", + "Sedaj, ko veš praktično *vse*, kar je za vedeti o argumentih za `git fetch` in `git push`, ni skoraj ničesar za dodati za `git pull` :)", "", - "To je zato, ker je git pull konec koncev *res* samo bližnjica za fetch, ki mu sledi merge tega, kar smo fetchali. Predstavljaš si ga lahko kot ukaz git fetch z *istimi* podanimi argumenti in merganjem, *kjer* bodo tisti commite končali.", + "To je zato, ker je git pull konec koncev *res* samo bližnjica za fetch, ki mu sledi merge tega, kar smo fetchali. Predstavljaš si ga lahko kot ukaz git fetch z *istimi* podanimi argumenti in merganjem, *kjer* bodo tisti commiti končali.", "", "To velja tudi takrat, ko uporabiš noro komplicirane argumente. Poglejmo nekaj primerov:" ] @@ -1031,7 +1031,7 @@ exports.level = { "", "`git fetch origin bar~1:bugFix; git merge bugFix`", "", - "Vidiš? Git pull je res bližnjica za fetch + merge. Vse kar zanima git pull je kje bodo commiti končali (`ciljni` argument, ki ga ugotovi med fetchem).", + "Vidiš? Git pull je res bližnjica za fetch + merge. Vse kar zanima git pull je, kje bodo commiti končali (`ciljni` argument, ki ga ugotovi med fetchem).", "", "Poglejmo primer:" ] @@ -1041,7 +1041,7 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Če določimo mesto za fetchanje, se vse zgodi kot prej s fetchem ampak tudi zmergamo kar smo pravkar fetchali" + "Če določimo mesto za fetchanje, se zgodi vse kot prej s fetchem, ampak tudi zmergamo, kar smo pravkar fetchali." ], "afterMarkdowns": [ "Vidiš! Z določitvijo `master` smo prenesli commite na `o/master` kot ponavadi. Potem smo zmergali `o/master` v našo trenutno checkoutano lokacijo, ki *ni* lokalni branch `master`. Zaradi tega razloga je morda celo logično, da izvedemo git pull večkrat (z istimi argumenti) iz drugi lokacij, da posodobimo več branchev." @@ -1067,7 +1067,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Ok, da zaključiš, pridi v stanje iz ciljne vizualizazcije. Prenesti boš moral neka commitov, narediti nekaj novih branchev in zmergati te branche v druge branche, ampak ne bi smelo zahtevati veliko ukazov :P" + "Ok, da zaključiš, pridi v stanje iz ciljne vizualizacije. Prenesti boš moral nekaj commitov, narediti nekaj novih branchev in zmergati te branche v druge branche, ampak ne bi smelo zahtevati veliko ukazov. :P" ] } } diff --git a/src/levels/remote/push.js b/src/levels/remote/push.js index 864b9b8a..87e96e8e 100644 --- a/src/levels/remote/push.js +++ b/src/levels/remote/push.js @@ -36,7 +36,7 @@ exports.level = { "uk" : "Пам’ятай, що перед тим як щось push-нути потрібно склонувати репозиторій!", "ko" : "push를 하기전에 clone을 먼저해야 된다는것을 기억하세요!", "vi" : "Nhớ rằng bạn phải clone trước khi push!", - "sl_SI": "Najprej moraš klonirati preden lahko pushaš!" + "sl_SI": "Najprej moraš klonirati, preden lahko pushaš!" }, "startDialog": { "en_US": { @@ -650,7 +650,7 @@ exports.level = { "", "`git push` si lahko predstavljaš kot ukaz, ki \"objavi\" tvoje delo. Ima kopico majhnih stvari, katere bomo raziskali v kratkem, ampak začnimo z majhnimi koraki ...", "", - "*opomba -- obnašanje `git push` brez argumentov je odvisno od nastavitev gita imenovanih `push.default`. Privzeta vrednost za to nastavitev je odvisna od različice gita, ki jo uporabljaš, ampak mi bomo uporabljali `upstream` vrednost v naši lekciji. To ni neka velika stvar, ampak jo je vredno preveriti preden pushamo na svojem projektu.*" + "*Opomba -- obnašanje `git push` brez argumentov je odvisno od nastavitev gita imenovanih `push.default`. Privzeta vrednost za to nastavitev je odvisna od različice gita, ki jo uporabljaš, ampak mi bomo uporabljali `upstream` vrednost v naši lekciji. To ni neka velika stvar, ampak jo je vredno preveriti, preden pushamo na svojem projektu.*" ] } }, @@ -661,7 +661,7 @@ exports.level = { "Tu imamo nekaj sprememb, ki jih oddaljen repo nima. Dajmo jih naložiti!" ], "afterMarkdowns": [ - "Tako je -- oddaljen repo je preje commit `C2`, branch `master` na oddaljenem repotu je bil posodobljen, da kaže na `C2` in naš *lasten* prikaz oddaljenega repota (`o/master`) je bil prav tako posodobljen. Vse je usklajeno!" + "Tako je -- oddaljen repo je prejel commit `C2`, branch `master` na oddaljenem repotu je bil posodobljen, da kaže na `C2` in naš *lasten* prikaz oddaljenega repota (`o/master`) je bil prav tako posodobljen. Vse je usklajeno!" ], "command": "git push", "beforeCommand": "git clone; git commit" @@ -671,7 +671,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Za dokončanje te stopnje, preprosto deli dva nova commita z oddaljenim repotom. Nato pa se pripno, ker bodo lekcije postale dosti težje!" + "Za dokončanje te stopnje, preprosto deli dva nova commita z oddaljenim repotom. Nato pa se pripni, ker bodo lekcije postale dosti težje!" ] } } diff --git a/src/levels/remote/pushArgs.js b/src/levels/remote/pushArgs.js index dd7f974e..832cb14f 100644 --- a/src/levels/remote/pushArgs.js +++ b/src/levels/remote/pushArgs.js @@ -37,7 +37,7 @@ exports.level = { "ko" : "대화창의 마지막 슬라이드를 \"objective\"로 다시 볼 수 있습니다.", "uk" : "Завжди можна подивитися останній слайд діалогу за допомогою \"objective\"", "vi" : "Bạn có thể sử dụng \"objective\" để đọc trang cuối của cửa sổ hộp thoại", - "sl_SI": "Vedno lahko pogledaš zadnji dialog z \"objective\"" + "sl_SI": "Vedno lahko pogledaš zadnji dialog z \"objective\"." }, "startDialog": { "en_US": { @@ -1022,7 +1022,7 @@ exports.level = { "", "se v slovenščini prevede v:", "", - "*Pojdi na branch poimenovan \"master\" na mojem repozitoriju, zgrabi vse commite in nato pojdi na branch \"master\" na oddaljenem repotu poimenovan \"origin\". Postavi vse commite, ki manjkajo na branch in me obvesti, ko končaš.*", + "*Pojdi na branch poimenovan \"master\" na mojem repozitoriju, zgrabi vse commite in nato pojdi na branch \"master\" na oddaljenem repotu poimenovanem \"origin\". Postavi vse commite, ki manjkajo na branch in me obvesti, ko končaš.*", "", "Z določanjem `masterja` kot \"place\" argument, smo povedali gitu iz kje bodo commiti *prišli* in kam bodo commiti *šli*. V bistvu je to \"mesto\" oziroma \"lokacija\" za uskladitev med dvema repozitorijema.", "", diff --git a/src/levels/remote/pushArgs2.js b/src/levels/remote/pushArgs2.js index 7f45a36f..e9f212b8 100644 --- a/src/levels/remote/pushArgs2.js +++ b/src/levels/remote/pushArgs2.js @@ -34,7 +34,7 @@ exports.level = { "ko" : "혹시 아세요? 패배를 인정하고 \"show solution\"을 입력할 수 있다는 걸요 :P", "uk" : "Пам'ятай, ти завжди можеш визнати поразку і підглянути рішення командою \"show solution\" :P", "vi" : "Nhớ rằng, bạn có thể thừa nhận thất bại và gõ \"show solution\" :P", - "sl_SI": "Vedno se lahko predaš in napišeš \"show solution\" :P" + "sl_SI": "Vedno se lahko predaš in napišeš \"show solution\". :P" }, "startDialog": { "en_US": { @@ -957,7 +957,7 @@ exports.level = { "", "Spomni se prejšnje lekcije, kjer smo določili `master` kot place argument za git push, določili smo *izvor* iz kje bodo commiti prišli in *destinacijo*, kamor bodo commiti odšli.", "", - "Morda se sprašuješ -- Kaj če želimo, da sta izvor in destinacija različna? Kaj če želiš pushati commite iz lokalnega `foo` brancha na oddaljen `bar` branch?", + "Morda se sprašuješ -- kaj če želimo, da sta izvor in destinacija različna? Kaj če želiš pushati commite iz lokalnega `foo` brancha na oddaljen `bar` branch?", "", "Nažalost to v gitu ni možno ... hecam se! Seveda je možno :) ... git ima ogromno opcij (skoraj preveč).", "", @@ -973,7 +973,7 @@ exports.level = { "", "`git push origin :`", "", - "To je pogosto omenjeno kot stolpična referenca. Ta referenca je samo ime za lokacijo, ki jo lahko git razvozla (kot je branch `foo` ali samo `HEAD~1`).", + "To je pogosto omenjeno kot dvopična referenca. Ta referenca je samo ime za lokacijo, ki jo lahko git razvozla (kot je branch `foo` ali samo `HEAD~1`).", "", "Ko enkrat določiš izvor in destinacijo neodvisno, lahko oddaljene ukaze uporabljaš zelo natačno in učinkovito. Poglejmo si primer!" ] @@ -986,7 +986,7 @@ exports.level = { "Pomni, `source` je bilokatera lokacija, ki jo git razume:" ], "afterMarkdowns": [ - "Woah! To je kar zanimiv ukaz, ampak ima smisel -- git je razrešil `foo^` v lokacijo, naložil commite, ki še niso bili pristoni v oddaljneme repotu in nato posodobil destinacijo." + "Woah! To je kar zanimiv ukaz, ampak ima smisel -- git je razrešil `foo^` v lokacijo, naložil commite, ki še niso bili prisotni v oddaljenem repotu in nato posodobil destinacijo." ], "command": "git push origin foo^:master", "beforeCommand": "git clone; go -b foo; git commit; git commit" diff --git a/src/levels/remote/pushManyFeatures.js b/src/levels/remote/pushManyFeatures.js index e1407bbb..395916b2 100644 --- a/src/levels/remote/pushManyFeatures.js +++ b/src/levels/remote/pushManyFeatures.js @@ -17,7 +17,7 @@ exports.level = { "ko" : "명령어를 undo와 reset으로 되돌릴 수 있다는 것을 잊지마세요", "uk" : "Пам'ятай, ти в будь-який момент можеш використовувати команди undo або reset", "vi" : "Nhớ rằng bạn luôn luôn có thể hoàn tác hoặc soạn lại câu lệnh ", - "sl_SI": "Vedno lahko razveljaviš ukaz ali ponastaviš stopnjo" + "sl_SI": "Vedno lahko razveljaviš ukaz ali ponastaviš stopnjo." }, "name": { "en_US": "Push Master!", @@ -805,7 +805,7 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Osvežimo si na hitro, kako posodobit `master` in pushati delo." + "Osvežimo si na hitro, kako posodobiti `master` in pushati delo." ], "afterMarkdowns": [ "Izvedli smo dva ukaza, ki:", @@ -823,11 +823,11 @@ exports.level = { "markdowns": [ "Ta stopnja je kar zajetna -- tu je splošno ideja za rešitev:", "", - "* Imamo tri branche -- `side1` `side2` in `side3`", + "* Imamo tri branche -- `side1`, `side2` in `side3`", "* Želimo pushati vsako od teh funkcionalnosti po vrstnem redu na oddaljen repo", - "* Oddaljen repo se je umes posodobil, zato bomo morali vključiti tudi to delo", + "* Oddaljen repo se je medtem posodobil, zato bomo morali vključiti tudi to delo", "", - ":O naporno! Srečno, končanje te stopnje je velik korak." + ":O Naporno! Srečno, končanje te stopnje je velik korak." ] } } diff --git a/src/levels/remote/remoteBranches.js b/src/levels/remote/remoteBranches.js index 55abdb24..f53ba513 100644 --- a/src/levels/remote/remoteBranches.js +++ b/src/levels/remote/remoteBranches.js @@ -901,7 +901,7 @@ exports.level = { "", "Sedaj ko smo videli `git clone` v praksi se poglobimo v dejanske spremembe.", "", - "Prva stvar, ki si jo morda opazil je, da se je pojavil nov branch na našem lokalnem repotu imenovan `o/master`. Temu tipu brancha pravimo _oddaljen_(remote) branch; oddaljeni branch ima posebne lastnosti, ker služijo določenim namenom.", + "Prva stvar, ki si jo morda opazil je, da se je pojavil nov branch na našem lokalnem repotu imenovan `o/master`. Temu tipu brancha pravimo _oddaljen_ (remote) branch; oddaljeni branchi imajo posebne lastnosti, ker služijo določenim namenom.", "", "Oddaljeni branchi odražajo _stanje_ oddaljenega repozitorija (od kar si nazadnje komuniciral z oddaljenim repotom). To ti morda pomaga razumeti razliko med tvojim lokalnim delom in delom, ki je javno -- ključni korak, preden deliš svoje delo z ostalimi.", "", @@ -915,7 +915,7 @@ exports.level = { "markdowns": [ "### Kaj je `o/`?", "", - "Morda se sprašuješ, kaj je ta `o/` spredaj pred oddaljenmi branchi. Tudi oddaljeni branchi imajo (zahtevano) pravilo za poimenovanje -- predstavljeni so v sledečm formatu:", + "Morda se sprašuješ, kaj je ta `o/` spredaj pred oddaljenmi branchi. Tudi oddaljeni branchi imajo (zahtevano) pravilo za poimenovanje -- predstavljeni so v sledečem formatu:", "", "* `/`", "", @@ -936,7 +936,7 @@ exports.level = { "Checkoutajmo oddaljen branch in poglejmo kaj se zgodi" ], "afterMarkdowns": [ - "Kot lahko vidiš, nas git postavi v stanje ločenega `HEAD-a` in ne posodobi `o/master`, ko dodamo nov commit. To je zato, ker se bo `o/master` posodobil šele ko se bo posodobil oddaljen repo." + "Kot lahko vidiš, nas git postavi v stanje ločenega `HEAD-a` in ne posodobi `o/master`, ko dodamo nov commit. To je zato, ker se bo `o/master` posodobil šele, ko se bo posodobil oddaljen repo." ], "command": "git checkout o/master; git commit", "beforeCommand": "git clone" @@ -946,7 +946,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "Za dokončanje te stopnje, commitaj enkrat iz `master` in enkrat ko checkoutaš `o/master`. To ti bo pomagalo osvojiti, kako se oddaljeni branchi obnašajo drugače in se posodobijo le da odražajo stanje na oddaljenem repozitoriju." + "Za dokončanje te stopnje, commitaj enkrat iz `master` in enkrat, ko checkoutaš `o/master`. To ti bo pomagalo osvojiti, kako se oddaljeni branchi obnašajo drugače in se posodobijo le da odražajo stanje na oddaljenem repozitoriju." ] } } diff --git a/src/levels/remote/sourceNothing.js b/src/levels/remote/sourceNothing.js index 5ddc0f25..2f4b2862 100644 --- a/src/levels/remote/sourceNothing.js +++ b/src/levels/remote/sourceNothing.js @@ -743,7 +743,7 @@ exports.level = { "* `git push origin :side`", "* `git fetch origin :bugFix`", "", - "Poglejmo kaj to naredi ..." + "Poglejmo, kaj to naredi ..." ] } }, @@ -751,7 +751,7 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "Kaj naredi pushanje \"ničesar\" na oddalejn branch? Izbriše ga!" + "Kaj naredi pushanje \"ničesar\" na oddaljen branch? Izbriše ga!" ], "afterMarkdowns": [ "Tako, uspešno smo izbrisali `foo` branch na oddaljenem repotu s konceptom pushanja \"ničesar\" nanj. To ima nekako smisel ..." @@ -777,7 +777,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "To je hitra stopnja -- samo izbriši en oddaljen branch in naredi novega z `git fetch` da zaključiš!" + "To je hitra stopnja -- samo izbriši en oddaljen branch in naredi novega z `git fetch`, da zaključiš!" ] } } diff --git a/src/levels/remote/tracking.js b/src/levels/remote/tracking.js index 880292b4..793dd7c0 100644 --- a/src/levels/remote/tracking.js +++ b/src/levels/remote/tracking.js @@ -34,7 +34,7 @@ exports.level = { "ko" : "원격 추적하기를 설정하는데에는 두가지 방법이 있습니다!", "uk" : "Пам'ятай, є два способи слідкувати за віддаленим репозиорієм!", "vi" : "Hãy nhớ rằng, có 2 cách để thiết lập theo dõi từ xa!", - "sl_SI": "Spomni se, da obstajata dva načina za sledenje oddaljenega repota" + "sl_SI": "Spomni se, da obstajata dva načina za sledenje oddaljenega repota." }, "startDialog": { "en_US": { @@ -1714,15 +1714,15 @@ exports.level = { "markdowns": [ "## Sledenje oddaljenega repota", "", - "Če povzamem, ta povezava med `master` in `o/master` je preprosto razložena z \"oddaljenim sledenjem\" lastnosti branchev. `master` branch je nastavljen, da sledi `o/master` -- to pomeni, da obstaja impliciran cilj merga in impliciran cilj pusha za `master` branch.", + "Če povzamem, ta povezava med `master` in `o/master` je preprosto razložena z lastnostnjo \"oddaljenega sledenja\" branchev. `master` branch je nastavljen, da sledi `o/master` -- to pomeni, da obstaja impliciran cilj merga in impliciran cilj pusha za `master` branch.", "", "Morda se sprašuješ, kako se je nastavila ta lastnost na `master` branchu, čeprav nisi izvedel nobenega ukaza za to. No, ko kloniraš repo z gitom, je ta lastnost v bistvu nastavljena zate avtomatično. ", "", - "Med kloniranjem git ustvari oddaljen branch za vsak branch na oddaljenem repotu (branchi kot `o/master`). Nato ustvati lokalen branch, ki sledi trenutno aktvinemu branchu na oddaljenem repotu, ki je v večini primerov `master`.", + "Med kloniranjem git ustvari oddaljen branch za vsak branch na oddaljenem repotu (branchi kot `o/master`). Nato ustvari lokalen branch, ki sledi trenutno aktivnemu branchu na oddaljenem repotu, ki je v večini primerov `master`.", "", "Ko git clone zaključi, imaš samo en lokalen branch (da nisi zasipan), ampak lahko vidiš vse različne branche na oddaljenem repotu (če si zelo radoveden). Najboljše iz obeh svetov!", "", - "To tudi razloži zakaj lahko vidiš sledeč izpis ukaza med kloniranjem:", + "To tudi razloži, zakaj lahko vidiš sledeč izpis ukaza med kloniranjem:", "", " local branch \"master\" set to track remote branch \"o/master\"" ] @@ -1734,9 +1734,9 @@ exports.level = { "markdowns": [ "### Ali ga lahko določim sam?", "", - "Seveda se da! Narediš lahko, da bilokater branch sledi `o/master`, v tem primeru bo imel ta branch enak impliciran cilj za push in merge kot `master`. To pomeni, da lahko poženeš `git push` na branchu poimenovanem `splohNiMaster` in pushas svoje delo na `master` branch na oddaljenem repotu!", + "Seveda se da! Narediš lahko, da bilokateri branch sledi `o/master`. V tem primeru bo imel ta branch enak impliciran cilj za push in merge kot `master`. To pomeni, da lahko poženeš `git push` na branchu poimenovanem `splohNiMaster` in pushas svoje delo na `master` branch na oddaljenem repotu!", "", - "Obstajata dva načina, da nastaviš to lastnost. Prvi je, da checkoutaš nov branch z uporabo oddaljenega brancha kot določena referenca. Izvedba", + "Obstajata dva načina, da nastaviš to lastnost. Prvi je, da checkoutaš nov branch z uporabo oddaljenega brancha kot določeno referenca. Izvedba", "", "`git checkout -b splohNiMaster o/master`", "", @@ -1764,7 +1764,7 @@ exports.level = { "To velja tudi za git push" ], "afterMarkdowns": [ - "Boom. Naše delo smo naložili na `master` na oddaljenem repotu, čeprav je ime našega brancha nekaj povsem drugega" + "Boom. Naše delo smo naložili na `master` na oddaljenem repotu, čeprav je ime našega brancha nekaj povsem drugega." ], "command": "git checkout -b foo o/master; git commit; git push", "beforeCommand": "git clone" @@ -1776,11 +1776,11 @@ exports.level = { "markdowns": [ "### Način #2", "", - "Še en način, da se nastavi oddaljeno sledenje na branchu, je da se uporabi `git branch -u` opcija. Izvedba", + "Še en način, da se nastavi oddaljeno sledenje na branchu, je, da se uporabi `git branch -u` opcija. Izvedba", "", "`git branch -u o/master foo`", "", - "bo nastavila `foo` branch, da sledi `o/master`. Če je `foo` trenutno checkoutan, ga lahko celo izpustiš:", + "bo nastavila `foo` branch, da sledi `o/master`. Če je `foo` trenutno checkoutan, ga lahko celo izpustiš", "", "`git branch -u o/master`", "" From 8aeaf9a1a4fd32a3f4534d9848b876a7bf04adb3 Mon Sep 17 00:00:00 2001 From: 0xflotus <0xflotus@gmail.com> Date: Fri, 24 Apr 2020 16:54:43 +0200 Subject: [PATCH 205/359] (ger): updatet grammar in some translations --- src/js/intl/strings.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js index 5e97cc93..bf4a4e96 100755 --- a/src/js/intl/strings.js +++ b/src/js/intl/strings.js @@ -513,7 +513,7 @@ exports.strings = { 'git-error-already-exists': { '__desc__': 'One of the error messages for git', 'en_US': 'The commit {commit} already exists in your changes set, aborting!', - 'de_DE': 'Der Commit {commit} existiert bereit, Abbruch!', + 'de_DE': 'Der Commit {commit} existiert bereits, Abbruch!', 'zh_CN': '{commit} 提交已经存在于你的改动集里,已忽略!', 'zh_TW': 'commit {commit} 已經在你的修改的集合裡,正在停止!', 'es_AR': 'El commit {commit} ya existe en tus cambios, ¡abortando!', @@ -674,7 +674,7 @@ exports.strings = { 'learn-git-branching': { '__desc__': 'The title of the app, with spaces', 'en_US': 'Learn Git Branching', - 'de_DE': 'Learn Git Branching', + 'de_DE': 'Lerne Git Branching', 'ja': '日本語版リポジトリ', 'zh_CN': '学习 Git 分支', 'zh_TW': '學習 git 分支', @@ -873,6 +873,7 @@ exports.strings = { 'flip-tree-command': { '__desc__': 'when the tree is being flipped', 'en_US': 'Flipping tree...', + 'de_DE': 'Flipping Baum...', 'zh_CN': '翻转树中...', 'zh_TW': '翻轉樹中...', 'es_AR': 'Invirtiendo el árbol...', @@ -959,7 +960,7 @@ exports.strings = { 'en_US': 'Here is a list of all the commmands available:', 'zh_TW': '這份清單列出所有可用指令:', 'zh_CN': '该列表列出了所有可用的指令:', - 'de_DE': 'Hier ist eine Liste aller verfügbarer Befehle:', + 'de_DE': 'Hier ist eine Liste aller verfügbaren Befehle:', 'es_AR': 'Esta es una lista de los comandos disponibles:', 'es_ES': 'Esta es una lista de todos los comandos disponibles:', 'pt_BR': 'Esta é uma lista dos comandos disponíveis:', @@ -974,7 +975,7 @@ exports.strings = { 'cd-command': { '__desc__': 'dummy command output for the command in the key', 'en_US': 'Directory changed to "/directories/dont/matter/in/this/demo"', - 'de_DE': 'Verzeichnis gewechselt zu "/verzeichnisse/sind/in/dieser/demo/latte"', + 'de_DE': 'Verzeichnis gewechselt zu "/verzeichnisse/sind/in/dieser/demo/irrelevant"', 'zh_CN': '目录切换到 "/directories/dont/matter/in/this/demo"', 'zh_TW': '目錄切換到 "/directories/dont/matter/in/this/demo"', 'es_AR': 'Directorio cambiado a "/los/directorios/no/importan/en/esta/demo"', @@ -1007,7 +1008,7 @@ exports.strings = { 'mobile-alert': { '__desc__': 'When someone comes to the site on a mobile device, they can not input commands so this is a nasty alert to tell them', 'en_US': 'LGB can\'t receive input on mobile, visit on desktop! it\'s worth it :D', - 'de_DE': 'LGB ist nicht mit mobilen Endgeräten kompatibel, nutz es vom Desktop! Es lohnt sich :D', + 'de_DE': 'LGB ist nicht mit mobilen Endgeräten kompatibel, benutz es vom Desktop! Es lohnt sich :D', 'zh_CN': '无法在移动设备/平板上调出键盘 :( 请试试桌面版 :D', 'zh_TW': '無法在行動裝置上叫出鍵盤,請改用桌面版!', 'es_AR': 'LGB no puede recibir comandos en dispositivos móviles. Visitanos desde una desktop, ¡lo vale! :D', @@ -1276,7 +1277,7 @@ exports.strings = { 'define-start-warning': { '__desc__': 'When you define the start point again, it overwrites the solution and goal so we add a warning', 'en_US': 'Defining start point... solution and goal will be overwritten if they were defined earlier', - 'de_DE': 'Lege Start fest ... Auflösung und Ziel werden gelößcht, falls sie schon festgelegt worden waren', + 'de_DE': 'Lege Startpunkt fest ... Auflösung und Ziel werden überschrieben, falls sie schon festgelegt waren', 'zh_CN': '定义开始点... 解决方法和目标会被新的替代', 'zh_TW': '正在定義起始點...先前定義的解法和目標會被覆蓋掉', 'es_AR': 'Estableciendo el punto de inicio... La solución y el objetivo serán sobreescritos si ya habían sido definidos', @@ -1391,7 +1392,7 @@ exports.strings = { 'goal-to-reach': { '__desc__': 'title of window that shoes the goal tree to reach', 'en_US': 'Goal To Reach', - 'de_DE': 'Ziel', + 'de_DE': 'Zu erreichendes Ziel', 'zh_CN': '目标', 'zh_TW': '目標', 'es_AR': 'Objetivo a cumplir', @@ -1517,7 +1518,7 @@ exports.strings = { 'error-untranslated-key': { '__desc__': 'This error happens when we are trying to translate a specific key and the locale version is mission', 'en_US': 'The translation for {key} does not exist yet :( Please hop on github and offer up a translation!', - 'de_DE': 'Die Übersetzung für {key} existiert noch nicht :( Falls du eine hast, bitte teil sie mit auf Github mit!', + 'de_DE': 'Die Übersetzung für {key} existiert noch nicht :( Falls du eine hast, bitte teile sie mir auf Github mit!', 'zh_CN': '还没翻译 {key} :( 请在 Github 上贡献您的翻译!', 'zh_TW': '還沒翻譯 {key} :( 請在 Github 上貢獻您的翻譯!', 'es_AR': 'Aún no hay traducción para {key} :( ¡Metete en Github y sugerí una! :)', @@ -1535,7 +1536,7 @@ exports.strings = { 'error-untranslated': { '__desc__': 'The general error when we encounter a dialog that is not translated', 'en_US': 'This dialog or text is not yet translated in your locale :( Hop on github to aid in translation!', - 'de_DE': 'Dieser Dialog oder Text ist noch nicht in deine Sprache übersetzt. :( Schau auf Github vorbei um bei der Übersetzung zu helfen!', + 'de_DE': 'Dieser Dialog oder Text ist noch nicht in deiner Sprache verfügbar. :( Schau auf Github vorbei um bei der Übersetzung zu helfen!', 'zh_CN': '这段对话还没有被翻译成您的语言 :( 欢迎在 Github 上贡献您的翻译!', 'zh_TW': '這段對話尚未翻成您的語言 :( 歡迎到 Github 貢獻翻譯!', 'es_AR': 'Este mensaje o texto aún no fue traducido a tu idioma :( ¡Metete en Github y ayudanos a traducirlo!', From aa33fa35e27610ccf1bc048b0227b7b990a54636 Mon Sep 17 00:00:00 2001 From: 0xflotus <0xflotus@gmail.com> Date: Fri, 24 Apr 2020 17:01:50 +0200 Subject: [PATCH 206/359] fixed grammar --- src/levels/intro/commits.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/intro/commits.js b/src/levels/intro/commits.js index 47de7043..0e4e99d4 100644 --- a/src/levels/intro/commits.js +++ b/src/levels/intro/commits.js @@ -87,7 +87,7 @@ exports.level = { "options": { "markdowns": [ "## Git Commits", - "Ein Commit in ein Git-Repository speichert einen Abbildung aller Dateien in deinem Projektverzeichnis. Es ist wie ein riesiges Kopieren und Einfügen, nur besser.", + "Ein Commit in ein Git-Repository speichert eine Abbildung aller Dateien in deinem Projektverzeichnis. Es ist wie ein riesiges Kopieren und Einfügen, nur besser.", "", "Allerdings will Git die Commits so schlank wie möglich halten, also kopiert es nicht einfach stur das ganze Verzeichnis jedes Mal wenn du committest. Es kann (wenn möglich) Commits als Menge von Änderungen zusammenpacken, von einer Version des Repositorys zur nächsten.", "", From a3ab4065b31b5b69eed850df7f7cbdd1361f526e Mon Sep 17 00:00:00 2001 From: CuFa Date: Tue, 14 Apr 2020 02:22:25 +0000 Subject: [PATCH 207/359] es_AR translation & es_ES corrections --- src/levels/remote/lockedMaster.js | 54 +++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/src/levels/remote/lockedMaster.js b/src/levels/remote/lockedMaster.js index 29a6742d..b96cfb10 100644 --- a/src/levels/remote/lockedMaster.js +++ b/src/levels/remote/lockedMaster.js @@ -10,7 +10,8 @@ exports.level = { "es_ES": "Crea la rama feature desde la rama master en local antes de restablecerlo para que sea el mismo que la rama master de origen", "fr_FR": "Créer la branche feature à partir du master local, avant de la restaurer dans le même état que o/master", "ko" : "로컬 저장소의 master 브랜치로부터 feature 브랜치를 만드세요. 그리고 o/master와 같아질 수 있도록 로컬 저장소의 master 브랜치를 reset 하세요.", - "sl_SI": "Naredi feature branch iz lokalnega masterja preden ga ponastaviš, da bo enak kot origin master." + "sl_SI": "Naredi feature branch iz lokalnega masterja preden ga ponastaviš, da bo enak kot origin master.", + "es_AR": "Crea la rama feature desde la rama master en local antes de restablecerlo para que sea el mismo que la rama master de origen" }, "name": { "en_US": "Locked Master", @@ -20,7 +21,8 @@ exports.level = { "es_ES": "Master bloqueado", "fr_FR": "Master verrouillé", "ko" : "잠겨버린 Master", - "sl_SI": "Zaklenjen Master" + "sl_SI": "Zaklenjen Master", + "es_AR": "Master bloqueado" }, "startDialog": { "en_US": { @@ -195,7 +197,7 @@ exports.level = { "markdowns": [ "## Remote Rejected!", "", - "Si trabajas en un equipo colaborativo, es probable que la rama `master` esté bloqueada y requiera algún proceso de `Pull Request` para poder `mergear` los cambios. Si haces `commit` directamente a `master e intentas realizar `push`, recibirás un mensaje similar a este:", + "Si trabajas en un equipo colaborativo, es probable que la rama `master` esté bloqueada y requiera algún proceso de `Pull Request` para poder `mergear` los cambios. Si haces `commit` directamente a `master` e intentas realizar `push`, recibirás un mensaje similar a este:", "", "```", " ! [remote rejected] master -> master (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)", @@ -209,9 +211,9 @@ exports.level = { "markdowns": [ "## ¿Por qué fue rechazado?", "", - + "Se rechazó el `push` del `commit` a la rama `master` debido a la política en la rama `master` que requiere el uso de `Pull Requests`.", + "Se rechazó el `push` del `commit` a la rama `master` debido a la política en la rama `master` que requiere el uso de `Pull Requests`.", "", - "Trataste de crear una rama y luego hacer `pushs` creando una `Pull Request`, pero te olvidaste e hiciste `commit` directamente a `master`. Ahora estás atascado y no puedes hacer `push` de tus cambios." + "Trataste de crear una rama y luego hacer `pushs` creando un `Pull Request`, pero te olvidaste e hiciste `commit` directamente a `master`. Ahora estás atascado y no puedes hacer `push` de tus cambios." ] } @@ -220,7 +222,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "## The solution", + "## La solución", "", "Crea otra rama llamada `feature` y haz `push` a remoto. También restablece su rama `master` nuevamente para que esté sincronizado con el repositorio remoto; de lo contrario, puedes tener problemas la próxima vez que realices un `pull` y el `commit` de otra persona entre en conflicto con el tuyo." ] @@ -308,6 +310,46 @@ exports.level = { } ] }, + "es_AR": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Remote Rejected!", + "", + "Si trabajas en un equipo colaborativo, es probable que la rama `master` esté bloqueada y requiera algún proceso de `Pull Request` para poder `mergear` los cambios. Si haces `commit` directamente a `master` e intentas realizar `push`, recibirás un mensaje similar a este:", + "", + "```", + " ! [remote rejected] master -> master (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)", + "```" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## ¿Por qué fue rechazado?", + "", + "Se rechazó el `push` del `commit` a la rama `master` debido a la política en la rama `master` que requiere el uso de `Pull Requests`.", + "", + "Trataste de crear una rama y luego hacer `pushs` creando un `Pull Request`, pero te olvidaste e hiciste `commit` directamente a `master`. Ahora estás atascado y no puedes hacer `push` de tus cambios." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## La solución", + "", + "Crea otra rama llamada `feature` y haz `push` a remoto. También restablece su rama `master` nuevamente para que esté sincronizado con el repositorio remoto; de lo contrario, puedes tener problemas la próxima vez que realices un `pull` y el `commit` de otra persona entre en conflicto con el tuyo." + ] + } + } + ] + }, "sl_SI": { "childViews": [ { From 7e9520664bf2d42a36767397dc4b73d62e47179b Mon Sep 17 00:00:00 2001 From: MrMcKracken <42273441+MrMcKracken@users.noreply.github.com> Date: Thu, 16 Apr 2020 07:26:35 +0200 Subject: [PATCH 208/359] Fixed typo in german translation (_ohne_ ihne vorher ...) --> (_ohne_ ihn vorher ...) --- src/levels/rampup/relativeRefs2.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/levels/rampup/relativeRefs2.js b/src/levels/rampup/relativeRefs2.js index 985e9678..0e752b95 100644 --- a/src/levels/rampup/relativeRefs2.js +++ b/src/levels/rampup/relativeRefs2.js @@ -486,7 +486,7 @@ exports.level = { "", "Du bist jetzt Experte in Sachen relative Referenzen, also lass sie uns mal richtig einsetzen.", "", - "Das Verschieben von Branches ist einer der häufigsten Anwendungsfälle dafür. Du kannst einen Branchnamen direkt auf einen bestimmten Commit setzen (_ohne_ ihne vorher ausgecheckt haben zu müssen!) indem du den Parameter `-f` benutzt. So in etwa:", + "Das Verschieben von Branches ist einer der häufigsten Anwendungsfälle dafür. Du kannst einen Branchnamen direkt auf einen bestimmten Commit setzen (_ohne_ ihn vorher ausgecheckt haben zu müssen!) indem du den Parameter `-f` benutzt. So in etwa:", "", "`git branch -f master HEAD~3`", "", From d5ba50c97da0e4f409d43872e3cd842f6225aafa Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Mon, 27 Apr 2020 19:32:03 -0700 Subject: [PATCH 209/359] Iterate on #698 to solve #697 --- src/js/graph/treeCompare.js | 117 ++++++++++++++++++------------------ 1 file changed, 59 insertions(+), 58 deletions(-) diff --git a/src/js/graph/treeCompare.js b/src/js/graph/treeCompare.js index ad3324f4..8652f172 100644 --- a/src/js/graph/treeCompare.js +++ b/src/js/graph/treeCompare.js @@ -78,82 +78,83 @@ TreeCompare.dispatchShallow = function(levelBlob, goalTreeString, treeToCompare) }; // would love to have copy properties here.. :( -TreeCompare.compareAllBranchesWithinTreesAndHEAD = function(treeA, treeB) { - treeA = this.convertTreeSafe(treeA); - treeB = this.convertTreeSafe(treeB); +TreeCompare.compareAllBranchesWithinTreesAndHEAD = function(treeToCompare, goalTree) { + treeToCompare = this.convertTreeSafe(treeToCompare); + goalTree = this.convertTreeSafe(goalTree); // also compare tags!! for just one level - return treeA.HEAD.target === treeB.HEAD.target && - this.compareAllBranchesWithinTrees(treeA, treeB) && - this.compareAllTagsWithinTrees(treeA, treeB); + return treeToCompare.HEAD.target === goalTree.HEAD.target && + this.compareAllBranchesWithinTrees(treeToCompare, goalTree) && + this.compareAllTagsWithinTrees(treeToCompare, goalTree); }; -TreeCompare.compareAllBranchesWithinTrees = function(treeA, treeB) { - treeA = this.convertTreeSafe(treeA); - treeB = this.convertTreeSafe(treeB); +TreeCompare.compareAllBranchesWithinTrees = function(treeToCompare, goalTree) { + treeToCompare = this.convertTreeSafe(treeToCompare); + goalTree = this.convertTreeSafe(goalTree); - var allBranches = Object.assign( - {}, - treeA.branches, - treeB.branches - ); - - return Object.keys(allBranches).every(function(branch) { - return this.compareBranchWithinTrees(treeA, treeB, branch); + /** + * Disclaimer / reminder!! We only care about branches in the goal tree; + * if you have extra branches in your source tree thats ok. but that means + * the arguments here are important -- always call this function with + * goalTree being the latter argument, since we will discard extra branches + * from treeToCompare (the first argument). + */ + return Object.keys(goalTree.branches).every(function(branch) { + return this.compareBranchWithinTrees(treeToCompare, goalTree, branch); }.bind(this)); }; -TreeCompare.compareAllTagsWithinTrees = function(treeA, treeB) { - treeA = this.convertTreeSafe(treeA); - treeB = this.convertTreeSafe(treeB); - this.reduceTreeFields([treeA, treeB]); +TreeCompare.compareAllTagsWithinTrees = function(treeToCompare, goalTree) { + treeToCompare = this.convertTreeSafe(treeToCompare); + goalTree = this.convertTreeSafe(goalTree); + this.reduceTreeFields([treeToCompare, goalTree]); - return _.isEqual(treeA.tags, treeB.tags); + return _.isEqual(treeToCompare.tags, goalTree.tags); }; -TreeCompare.compareBranchesWithinTrees = function(treeA, treeB, branches) { +TreeCompare.compareBranchesWithinTrees = function(treeToCompare, goalTree, branches) { var result = true; branches.forEach(function(branchName) { - result = result && this.compareBranchWithinTrees(treeA, treeB, branchName); + result = result && this.compareBranchWithinTrees(treeToCompare, goalTree, branchName); }, this); return result; }; -TreeCompare.compareBranchWithinTrees = function(treeA, treeB, branchName) { - treeA = this.convertTreeSafe(treeA); - treeB = this.convertTreeSafe(treeB); - this.reduceTreeFields([treeA, treeB]); +TreeCompare.compareBranchWithinTrees = function(treeToCompare, goalTree, branchName) { + treeToCompare = this.convertTreeSafe(treeToCompare); + goalTree = this.convertTreeSafe(goalTree); + this.reduceTreeFields([treeToCompare, goalTree]); - var recurseCompare = this.getRecurseCompare(treeA, treeB); - var branchA = treeA.branches[branchName]; - var branchB = treeB.branches[branchName]; + var recurseCompare = this.getRecurseCompare(treeToCompare, goalTree); + var branchA = treeToCompare.branches[branchName]; + var branchB = goalTree.branches[branchName]; return _.isEqual(branchA, branchB) && - recurseCompare(treeA.commits[branchA.target], treeB.commits[branchB.target]); + recurseCompare(treeToCompare.commits[branchA.target], goalTree.commits[branchB.target]); }; -TreeCompare.compareAllBranchesWithinTreesHashAgnostic = function(treeA, treeB) { - treeA = this.convertTreeSafe(treeA); - treeB = this.convertTreeSafe(treeB); - this.reduceTreeFields([treeA, treeB]); +TreeCompare.compareAllBranchesWithinTreesHashAgnostic = function(treeToCompare, goalTree) { + treeToCompare = this.convertTreeSafe(treeToCompare); + goalTree = this.convertTreeSafe(goalTree); + this.reduceTreeFields([treeToCompare, goalTree]); var allBranches = Object.assign( {}, - treeA.branches, - treeB.branches + treeToCompare.branches, + goalTree.branches ); var branchNames = Object.keys(allBranches || {}); - return this.compareBranchesWithinTreesHashAgnostic(treeA, treeB, branchNames); + return this.compareBranchesWithinTreesHashAgnostic(treeToCompare, goalTree, branchNames); }; -TreeCompare.compareBranchesWithinTreesHashAgnostic = function(treeA, treeB, branches) { +TreeCompare.compareBranchesWithinTreesHashAgnostic = function(treeToCompare, goalTree, branches) { // we can't DRY unfortunately here because we need a special _.isEqual function // for both the recursive compare and the branch compare - treeA = this.convertTreeSafe(treeA); - treeB = this.convertTreeSafe(treeB); - this.reduceTreeFields([treeA, treeB]); + treeToCompare = this.convertTreeSafe(treeToCompare); + goalTree = this.convertTreeSafe(goalTree); + this.reduceTreeFields([treeToCompare, goalTree]); // get a function to compare branch objects without hashes var compareBranchObjs = function(branchA, branchB) { @@ -170,15 +171,15 @@ TreeCompare.compareBranchesWithinTreesHashAgnostic = function(treeA, treeB, bran return _.isEqual(branchA, branchB); }.bind(this); // and a function to compare recursively without worrying about hashes - var recurseCompare = this.getRecurseCompareHashAgnostic(treeA, treeB); + var recurseCompare = this.getRecurseCompareHashAgnostic(treeToCompare, goalTree); var result = true; branches.forEach(function(branchName) { - var branchA = treeA.branches[branchName]; - var branchB = treeB.branches[branchName]; + var branchA = treeToCompare.branches[branchName]; + var branchB = goalTree.branches[branchName]; result = result && compareBranchObjs(branchA, branchB) && - recurseCompare(treeA.commits[branchA.target], treeB.commits[branchB.target]); + recurseCompare(treeToCompare.commits[branchA.target], goalTree.commits[branchB.target]); }, this); return result; }; @@ -261,7 +262,7 @@ TreeCompare.getBaseRef = function(ref) { return 'C' + bits[1]; }; -TreeCompare.getRecurseCompareHashAgnostic = function(treeA, treeB) { +TreeCompare.getRecurseCompareHashAgnostic = function(treeToCompare, goalTree) { // here we pass in a special comparison function to pass into the base // recursive compare. @@ -284,10 +285,10 @@ TreeCompare.getRecurseCompareHashAgnostic = function(treeA, treeB) { getStrippedCommitCopy(commitB) ); }; - return this.getRecurseCompare(treeA, treeB, {isEqual: isEqual}); + return this.getRecurseCompare(treeToCompare, goalTree, {isEqual: isEqual}); }; -TreeCompare.getRecurseCompare = function(treeA, treeB, options) { +TreeCompare.getRecurseCompare = function(treeToCompare, goalTree, options) { options = options || {}; // we need a recursive comparison function to bubble up the branch @@ -307,10 +308,10 @@ TreeCompare.getRecurseCompare = function(treeA, treeB, options) { var pAid = commitA.parents[index]; var pBid = commitB.parents[index]; - // if treeA or treeB doesn't have this parent, + // if treeToCompare or goalTree doesn't have this parent, // then we get an undefined child which is fine when we pass into _.isEqual - var childA = treeA.commits[pAid]; - var childB = treeB.commits[pBid]; + var childA = treeToCompare.commits[pAid]; + var childB = goalTree.commits[pBid]; result = result && recurseCompare(childA, childB); } @@ -426,15 +427,15 @@ TreeCompare.reduceTreeFields = function(trees) { }, this); }; -TreeCompare.compareTrees = function(treeA, treeB) { - treeA = this.convertTreeSafe(treeA); - treeB = this.convertTreeSafe(treeB); +TreeCompare.compareTrees = function(treeToCompare, goalTree) { + treeToCompare = this.convertTreeSafe(treeToCompare); + goalTree = this.convertTreeSafe(goalTree); // now we need to strip out the fields we don't care about, aka things // like createTime, message, author - this.reduceTreeFields([treeA, treeB]); + this.reduceTreeFields([treeToCompare, goalTree]); - return _.isEqual(treeA, treeB); + return _.isEqual(treeToCompare, goalTree); }; module.exports = TreeCompare; From 76a61ec0ae01a549b00e9b50cf3a4fd8a0367d33 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Mon, 27 Apr 2020 19:45:10 -0700 Subject: [PATCH 210/359] Closes #696 -- remove FB pixels --- src/template.index.html | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/src/template.index.html b/src/template.index.html index 4cfd03be..8b3af18a 100644 --- a/src/template.index.html +++ b/src/template.index.html @@ -456,29 +456,7 @@ - - - + Google analytics :-/ -->