From 8fbeef957045a9dfbc3b30ec0c1646afdc0cb437 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Fr=C4=85cz?= Date: Sun, 22 Mar 2015 11:49:15 +0100 Subject: [PATCH 01/83] Exercise base --- start.sh | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 start.sh diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..20d602b --- /dev/null +++ b/start.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash + From 042b95b5dcb7d34605bc3088c515fd77e4f33f21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Fr=C4=85cz?= Date: Fri, 20 Mar 2015 23:26:06 +0100 Subject: [PATCH 02/83] Git exercises - introduction --- README.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ configure.sh | 16 ++++++++++++++++ start.sh | 3 +++ 3 files changed, 66 insertions(+) create mode 100755 configure.sh diff --git a/README.md b/README.md index 72fd09b..2f8cb8c 100644 --- a/README.md +++ b/README.md @@ -1 +1,48 @@ # git-exercises + +This repository contains problems that you may encounter in everyday work with Git. Each problem resides in its own +branch which you can checkout and verify your git-skills. In general, all exercises assume that you know basics of Git +(i.e. how to commit a file and what the working and staging area is). + +The `README.md` file always contains an explanation of the problem and the expected repository state that should be +achieved. A special git command `git start` has been prepared for the purpose of preparing your local commit history +and working area for the task. + +In fact, you are currently on `master` branch that contains the first exercise. + +## Prerequisites + + * make sure you can run `.sh` scripts; you get it out of the box in unix systems; on Windows, you can use Git Bash that + is shipped with Windows version of Git + * introduce yourself by executing `git config user.name "Your Name"` and `git config user.email "your@email.com"` + commands in the repo directory after you have cloned it + * execute the `./configure.sh` script; it will add a few git aliases that will ease working with these exercises + (this WILL NOT affect your global Git settings) + +## Exercise - Commit a file + +The first exercise is to push a commit that is created when you run the `git start` command. + +## Verifying results + +When you think you are ready with the exercise, just execute the `git verify` command. It will try to push your changes +to the remote repository and tell you if the provided solution is correct. + +There may be situation when the `git verify` tells you that the exercise name is invalid. This means that you have +probably changed the branch name during work. In such cases, you need to tell what exercise you are currently trying to +solve with `git verify exercise-name` command. + +## How to find the next exercise? + +When you pass the exercise successfully, output of `git verify` command will tell you the next exercise name as well as +the command you need to execute in order to be in the right place (that is `git start exercise-name`). + +You can also jump to any of the exercises at any moment. To display list of them, execute the `git exercises` command. + +## How to reset exercise and start from the beginning? + +Each time you got lost you can discard all changes you made in an exercise and start from scratch with executing +`git start` command without any arguments. + +This will work only if you are on an exercise branch. If not, tell git which task you want to start with by executing +`git start exercise-name`. diff --git a/configure.sh b/configure.sh new file mode 100755 index 0000000..31c11ec --- /dev/null +++ b/configure.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +# Configure "git start" local alias for starting the exercise of user's choice of restarting the current one. +git config alias.start "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; git show origin/\$exercise:start.sh >/dev/null 2>&1 && git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null 2>&1 && echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1 && echo \"Exercise \$exercise started! Read the README.md for instructions.\" || echo \"Invalid exercise: \$exercise\"; }; f" + +# Add "git verify" local alias for submitting exercises solutions. +git config alias.verify "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; git show origin/\$exercise:start.sh >/dev/null 2>&1 && echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v \"\\*\\*\" || echo \"Invalid exercise: \$exercise\"; }; f" + +# Add "git exercises" alias that shows list of available exercises +git config alias.exercises "! echo \"Available exercises (alphabetically, use git start to switch): \" && git branch -r | grep origin | grep -v /HEAD | grep -v verifications | sed 's/origin\///g'" + +# Make sure you have a "current" push strategy set; this will allow you to push only current exercise with simple git +# push command instead of pushing all matching branches (default in Git < 2.0) +git config push.default current + +echo "OK" diff --git a/start.sh b/start.sh index 20d602b..643a64d 100755 --- a/start.sh +++ b/start.sh @@ -1,2 +1,5 @@ #!/usr/bin/env bash +echo 'test' > 'test.txt' +git add test.txt +git commit -m "This is first exercise commit." From 22f1fd9fb5f0894a70df673d850731ccb5822155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Fr=C4=85cz?= Date: Sat, 27 Feb 2016 00:22:57 +0100 Subject: [PATCH 03/83] Remove unnecessary info from master --- README.md | 46 +--------------------------------------------- 1 file changed, 1 insertion(+), 45 deletions(-) diff --git a/README.md b/README.md index 2f8cb8c..7fe00c6 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,4 @@ -# git-exercises - -This repository contains problems that you may encounter in everyday work with Git. Each problem resides in its own -branch which you can checkout and verify your git-skills. In general, all exercises assume that you know basics of Git -(i.e. how to commit a file and what the working and staging area is). - -The `README.md` file always contains an explanation of the problem and the expected repository state that should be -achieved. A special git command `git start` has been prepared for the purpose of preparing your local commit history -and working area for the task. - -In fact, you are currently on `master` branch that contains the first exercise. - -## Prerequisites - - * make sure you can run `.sh` scripts; you get it out of the box in unix systems; on Windows, you can use Git Bash that - is shipped with Windows version of Git - * introduce yourself by executing `git config user.name "Your Name"` and `git config user.email "your@email.com"` - commands in the repo directory after you have cloned it - * execute the `./configure.sh` script; it will add a few git aliases that will ease working with these exercises - (this WILL NOT affect your global Git settings) - -## Exercise - Commit a file +## Push a commit you have made The first exercise is to push a commit that is created when you run the `git start` command. -## Verifying results - -When you think you are ready with the exercise, just execute the `git verify` command. It will try to push your changes -to the remote repository and tell you if the provided solution is correct. - -There may be situation when the `git verify` tells you that the exercise name is invalid. This means that you have -probably changed the branch name during work. In such cases, you need to tell what exercise you are currently trying to -solve with `git verify exercise-name` command. - -## How to find the next exercise? - -When you pass the exercise successfully, output of `git verify` command will tell you the next exercise name as well as -the command you need to execute in order to be in the right place (that is `git start exercise-name`). - -You can also jump to any of the exercises at any moment. To display list of them, execute the `git exercises` command. - -## How to reset exercise and start from the beginning? - -Each time you got lost you can discard all changes you made in an exercise and start from scratch with executing -`git start` command without any arguments. - -This will work only if you are on an exercise branch. If not, tell git which task you want to start with by executing -`git start exercise-name`. From a13b3774a9e64d800e8e68ce1980c6b9cae6ec65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Fr=C4=85cz?= Date: Sat, 27 Feb 2016 13:45:56 +0100 Subject: [PATCH 04/83] Sed-out remote: prefix from git response --- configure.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.sh b/configure.sh index 31c11ec..32d2734 100755 --- a/configure.sh +++ b/configure.sh @@ -4,7 +4,7 @@ git config alias.start "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; git show origin/\$exercise:start.sh >/dev/null 2>&1 && git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null 2>&1 && echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1 && echo \"Exercise \$exercise started! Read the README.md for instructions.\" || echo \"Invalid exercise: \$exercise\"; }; f" # Add "git verify" local alias for submitting exercises solutions. -git config alias.verify "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; git show origin/\$exercise:start.sh >/dev/null 2>&1 && echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v \"\\*\\*\" || echo \"Invalid exercise: \$exercise\"; }; f" +git config alias.verify "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; git show origin/\$exercise:start.sh >/dev/null 2>&1 && echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v \"\\*\\*\" | sed 's/remote: //g' || echo \"Invalid exercise: \$exercise\"; }; f" # Add "git exercises" alias that shows list of available exercises git config alias.exercises "! echo \"Available exercises (alphabetically, use git start to switch): \" && git branch -r | grep origin | grep -v /HEAD | grep -v verifications | sed 's/origin\///g'" From 2dc0c83d33260d3ff3a1ac3af20fabd1b709cfd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Fr=C4=85cz?= Date: Sat, 27 Feb 2016 17:47:40 +0100 Subject: [PATCH 05/83] New exercises alias --- configure.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.sh b/configure.sh index 32d2734..72c209f 100755 --- a/configure.sh +++ b/configure.sh @@ -7,7 +7,7 @@ git config alias.start "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD git config alias.verify "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; git show origin/\$exercise:start.sh >/dev/null 2>&1 && echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v \"\\*\\*\" | sed 's/remote: //g' || echo \"Invalid exercise: \$exercise\"; }; f" # Add "git exercises" alias that shows list of available exercises -git config alias.exercises "! echo \"Available exercises (alphabetically, use git start to switch): \" && git branch -r | grep origin | grep -v /HEAD | grep -v verifications | sed 's/origin\///g'" +git config alias.exercises "! git push origin HEAD:exercises 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g'" # Make sure you have a "current" push strategy set; this will allow you to push only current exercise with simple git # push command instead of pushing all matching branches (default in Git < 2.0) From 1bc64249433a7bfc4449f36ac8e17b39e9734e5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Fr=C4=85cz?= Date: Sun, 28 Feb 2016 21:51:39 +0100 Subject: [PATCH 06/83] Enhance git verify alias --- configure.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.sh b/configure.sh index 72c209f..ca7e0f0 100755 --- a/configure.sh +++ b/configure.sh @@ -4,7 +4,7 @@ git config alias.start "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; git show origin/\$exercise:start.sh >/dev/null 2>&1 && git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null 2>&1 && echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1 && echo \"Exercise \$exercise started! Read the README.md for instructions.\" || echo \"Invalid exercise: \$exercise\"; }; f" # Add "git verify" local alias for submitting exercises solutions. -git config alias.verify "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; git show origin/\$exercise:start.sh >/dev/null 2>&1 && echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v \"\\*\\*\" | sed 's/remote: //g' || echo \"Invalid exercise: \$exercise\"; }; f" +git config alias.verify "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git status | grep ahead >/dev/null 2>&1 ; then if echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | sed 's/remote: //g' | grep -v \"\\*\\*\" ; then : ; else echo 'Solution could not be verified - push failed.' && echo 'Do you have an internet connection?'; fi else echo \"You haven't made any progress on exercise \$exercise.\" && echo 'Did you forget to commit your changes?'; fi else echo \"Invalid exercise: \$exercise\"; fi }; f" # Add "git exercises" alias that shows list of available exercises git config alias.exercises "! git push origin HEAD:exercises 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g'" From 23aeacdf6f99fe7ab1a48e365c622f2785dbe7ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Fr=C4=85cz?= Date: Sun, 28 Feb 2016 22:13:24 +0100 Subject: [PATCH 07/83] Enhance git start command --- configure.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.sh b/configure.sh index ca7e0f0..8576b29 100755 --- a/configure.sh +++ b/configure.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # Configure "git start" local alias for starting the exercise of user's choice of restarting the current one. -git config alias.start "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; git show origin/\$exercise:start.sh >/dev/null 2>&1 && git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null 2>&1 && echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1 && echo \"Exercise \$exercise started! Read the README.md for instructions.\" || echo \"Invalid exercise: \$exercise\"; }; f" +git config alias.start "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null ; then echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1 && echo \"Exercise \$exercise started!\" && echo 'Read the README.md for instructions or view them in browser:' && echo \"http://gitexercises.fracz.com/e/\$exercise\" ; else echo 'Could not clean the working directory.' && echo 'Make sure that none of the files inside the working directory' && echo 'is used by another process and run git start again.'; fi else echo \"Invalid exercise: \$exercise\"; fi }; f" # Add "git verify" local alias for submitting exercises solutions. git config alias.verify "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git status | grep ahead >/dev/null 2>&1 ; then if echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | sed 's/remote: //g' | grep -v \"\\*\\*\" ; then : ; else echo 'Solution could not be verified - push failed.' && echo 'Do you have an internet connection?'; fi else echo \"You haven't made any progress on exercise \$exercise.\" && echo 'Did you forget to commit your changes?'; fi else echo \"Invalid exercise: \$exercise\"; fi }; f" From a1f208bb4e5a0173157aaaea0157664a260944c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Fr=C4=85cz?= Date: Mon, 29 Feb 2016 09:18:50 +0100 Subject: [PATCH 08/83] Allow to git verify in detached HEAD --- configure.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.sh b/configure.sh index 8576b29..7d40016 100755 --- a/configure.sh +++ b/configure.sh @@ -4,7 +4,7 @@ git config alias.start "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null ; then echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1 && echo \"Exercise \$exercise started!\" && echo 'Read the README.md for instructions or view them in browser:' && echo \"http://gitexercises.fracz.com/e/\$exercise\" ; else echo 'Could not clean the working directory.' && echo 'Make sure that none of the files inside the working directory' && echo 'is used by another process and run git start again.'; fi else echo \"Invalid exercise: \$exercise\"; fi }; f" # Add "git verify" local alias for submitting exercises solutions. -git config alias.verify "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git status | grep ahead >/dev/null 2>&1 ; then if echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | sed 's/remote: //g' | grep -v \"\\*\\*\" ; then : ; else echo 'Solution could not be verified - push failed.' && echo 'Do you have an internet connection?'; fi else echo \"You haven't made any progress on exercise \$exercise.\" && echo 'Did you forget to commit your changes?'; fi else echo \"Invalid exercise: \$exercise\"; fi }; f" +git config alias.verify "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git status | grep -E 'ahead|detached' >/dev/null 2>&1 ; then if echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | sed 's/remote: //g' | grep -v \"\\*\\*\" ; then : ; else echo 'Solution could not be verified - push failed.' && echo 'Do you have an internet connection?'; fi else echo \"You haven't made any progress on exercise \$exercise.\" && echo 'Did you forget to commit your changes?'; fi else echo \"Invalid exercise: \$exercise\"; fi }; f" # Add "git exercises" alias that shows list of available exercises git config alias.exercises "! git push origin HEAD:exercises 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g'" From 257aa3396b50bb245f3af0dee4c718c09f7b75fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Fr=C4=85cz?= Date: Mon, 29 Feb 2016 09:38:15 +0100 Subject: [PATCH 09/83] More info in detached HEAD --- configure.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/configure.sh b/configure.sh index 7d40016..09a18bf 100755 --- a/configure.sh +++ b/configure.sh @@ -1,12 +1,12 @@ #!/usr/bin/env bash -# Configure "git start" local alias for starting the exercise of user's choice of restarting the current one. -git config alias.start "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null ; then echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1 && echo \"Exercise \$exercise started!\" && echo 'Read the README.md for instructions or view them in browser:' && echo \"http://gitexercises.fracz.com/e/\$exercise\" ; else echo 'Could not clean the working directory.' && echo 'Make sure that none of the files inside the working directory' && echo 'is used by another process and run git start again.'; fi else echo \"Invalid exercise: \$exercise\"; fi }; f" +# Configure "git start" local alias for starting the exercise of user's choice and restarting the current one. +git config alias.start "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null ; then echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1 && echo \"Exercise \$exercise started!\" && echo 'Read the README.md for instructions or view them in browser:' && echo \"http://gitexercises.fracz.com/e/\$exercise\" ; else echo 'Could not clean the working directory.' && echo 'Make sure that none of the files inside the working directory' && echo 'is used by another process and run git start again.'; fi else echo \"Invalid exercise: \$exercise\"; fi else echo 'You need to use git start in detached HEAD'; fi }; f" # Add "git verify" local alias for submitting exercises solutions. -git config alias.verify "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git status | grep -E 'ahead|detached' >/dev/null 2>&1 ; then if echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | sed 's/remote: //g' | grep -v \"\\*\\*\" ; then : ; else echo 'Solution could not be verified - push failed.' && echo 'Do you have an internet connection?'; fi else echo \"You haven't made any progress on exercise \$exercise.\" && echo 'Did you forget to commit your changes?'; fi else echo \"Invalid exercise: \$exercise\"; fi }; f" +git config alias.verify "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git status | grep -E 'ahead|detached' >/dev/null 2>&1 ; then if echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | sed 's/remote: //g' | grep -v \"\\*\\*\" ; then : ; else echo 'Solution could not be verified - push failed.' && echo 'Do you have an internet connection?'; fi else echo \"You haven't made any progress on exercise \$exercise.\" && echo 'Did you forget to commit your changes?'; fi else echo \"Invalid exercise: \$exercise\"; fi else echo 'You need to use git verify in detached HEAD'; fi }; f" -# Add "git exercises" alias that shows list of available exercises +# Add "git exercises" alias that shows list of available exercises. git config alias.exercises "! git push origin HEAD:exercises 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g'" # Make sure you have a "current" push strategy set; this will allow you to push only current exercise with simple git From 83880e4b1865cb79a3c6a9e103a824ab27d0549b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Fr=C4=85cz?= Date: Sun, 6 Mar 2016 22:53:36 +0100 Subject: [PATCH 10/83] More info on git start when ./start.sh fails --- configure.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.sh b/configure.sh index 09a18bf..10d2a56 100755 --- a/configure.sh +++ b/configure.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # Configure "git start" local alias for starting the exercise of user's choice and restarting the current one. -git config alias.start "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null ; then echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1 && echo \"Exercise \$exercise started!\" && echo 'Read the README.md for instructions or view them in browser:' && echo \"http://gitexercises.fracz.com/e/\$exercise\" ; else echo 'Could not clean the working directory.' && echo 'Make sure that none of the files inside the working directory' && echo 'is used by another process and run git start again.'; fi else echo \"Invalid exercise: \$exercise\"; fi else echo 'You need to use git start in detached HEAD'; fi }; f" +git config alias.start "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null ; then if echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1; then echo \"Exercise \$exercise started!\" && echo 'Read the README.md for instructions or view them in browser:' && echo \"http://gitexercises.fracz.com/e/\$exercise\" ; else echo 'Could not execute the start script.' && echo 'Try running the ./start.sh script yourself.' ; fi else echo 'Could not clean the working directory.' && echo 'Make sure that none of the files inside the working directory' && echo 'is used by another process and run git start again.'; fi else echo \"Invalid exercise: \$exercise\"; fi else echo 'You need to use git start in detached HEAD'; fi }; f" # Add "git verify" local alias for submitting exercises solutions. git config alias.verify "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git status | grep -E 'ahead|detached' >/dev/null 2>&1 ; then if echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | sed 's/remote: //g' | grep -v \"\\*\\*\" ; then : ; else echo 'Solution could not be verified - push failed.' && echo 'Do you have an internet connection?'; fi else echo \"You haven't made any progress on exercise \$exercise.\" && echo 'Did you forget to commit your changes?'; fi else echo \"Invalid exercise: \$exercise\"; fi else echo 'You need to use git verify in detached HEAD'; fi }; f" From 439b4229575c0b5e63c1c17724a35a54dd02805c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Fr=C4=85cz?= Date: Mon, 14 Mar 2016 21:00:04 +0100 Subject: [PATCH 11/83] Add git start next command --- configure.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.sh b/configure.sh index 10d2a56..bf31d80 100755 --- a/configure.sh +++ b/configure.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # Configure "git start" local alias for starting the exercise of user's choice and restarting the current one. -git config alias.start "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null ; then if echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1; then echo \"Exercise \$exercise started!\" && echo 'Read the README.md for instructions or view them in browser:' && echo \"http://gitexercises.fracz.com/e/\$exercise\" ; else echo 'Could not execute the start script.' && echo 'Try running the ./start.sh script yourself.' ; fi else echo 'Could not clean the working directory.' && echo 'Make sure that none of the files inside the working directory' && echo 'is used by another process and run git start again.'; fi else echo \"Invalid exercise: \$exercise\"; fi else echo 'You need to use git start in detached HEAD'; fi }; f" +git config alias.start "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if [ \$exercise != next ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null ; then if echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1; then echo \"Exercise \$exercise started!\" && echo 'Read the README.md for instructions or view them in browser:' && echo \"http://gitexercises.fracz.com/e/\$exercise\" ; else echo 'Could not execute the start script.' && echo 'Try running the ./start.sh script yourself.' ; fi else echo 'Could not clean the working directory.' && echo 'Make sure that none of the files inside the working directory' && echo 'is used by another process and run git start again.'; fi else echo \"Invalid exercise: \$exercise\" && false; fi else git push origin HEAD:next-exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g' | xargs git start | grep -v Invalid || echo 'You have passed all exercises!'; fi else echo 'You need to use git start in detached HEAD'; fi }; f" # Add "git verify" local alias for submitting exercises solutions. git config alias.verify "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git status | grep -E 'ahead|detached' >/dev/null 2>&1 ; then if echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | sed 's/remote: //g' | grep -v \"\\*\\*\" ; then : ; else echo 'Solution could not be verified - push failed.' && echo 'Do you have an internet connection?'; fi else echo \"You haven't made any progress on exercise \$exercise.\" && echo 'Did you forget to commit your changes?'; fi else echo \"Invalid exercise: \$exercise\"; fi else echo 'You need to use git verify in detached HEAD'; fi }; f" From a3ed55d2740234bc1c81b210a0595ea5ed473c9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Fr=C4=85cz?= Date: Wed, 20 Mar 2019 21:50:38 +0100 Subject: [PATCH 12/83] Clear instruction to start with git verify --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7fe00c6..359bca4 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,5 @@ The first exercise is to push a commit that is created when you run the `git start` command. +Just try `git verify` after you have initialized the exercises and be proud of passing the first one :-) + From 4252cf9a9d7ebda97b59f5e8619be6bb805d6d2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Fr=C4=85cz?= Date: Thu, 5 Mar 2020 23:47:46 +0100 Subject: [PATCH 13/83] Enhance git verify alias (do not fail if on not-tracked branch) --- configure.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.sh b/configure.sh index bf31d80..7027e19 100755 --- a/configure.sh +++ b/configure.sh @@ -4,7 +4,7 @@ git config alias.start "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if [ \$exercise != next ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null ; then if echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1; then echo \"Exercise \$exercise started!\" && echo 'Read the README.md for instructions or view them in browser:' && echo \"http://gitexercises.fracz.com/e/\$exercise\" ; else echo 'Could not execute the start script.' && echo 'Try running the ./start.sh script yourself.' ; fi else echo 'Could not clean the working directory.' && echo 'Make sure that none of the files inside the working directory' && echo 'is used by another process and run git start again.'; fi else echo \"Invalid exercise: \$exercise\" && false; fi else git push origin HEAD:next-exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g' | xargs git start | grep -v Invalid || echo 'You have passed all exercises!'; fi else echo 'You need to use git start in detached HEAD'; fi }; f" # Add "git verify" local alias for submitting exercises solutions. -git config alias.verify "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git status | grep -E 'ahead|detached' >/dev/null 2>&1 ; then if echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | sed 's/remote: //g' | grep -v \"\\*\\*\" ; then : ; else echo 'Solution could not be verified - push failed.' && echo 'Do you have an internet connection?'; fi else echo \"You haven't made any progress on exercise \$exercise.\" && echo 'Did you forget to commit your changes?'; fi else echo \"Invalid exercise: \$exercise\"; fi else echo 'You need to use git verify in detached HEAD'; fi }; f" +git config alias.verify "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if ! git status | grep 'up-to-date' >/dev/null 2>&1 ; then if echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | sed 's/remote: //g' | grep -v \"\\*\\*\" ; then : ; else echo 'Solution could not be verified - push failed.' && echo 'Do you have an internet connection?'; fi else echo \"You haven't made any progress on exercise \$exercise.\" && echo 'Did you forget to commit your changes?'; fi else echo \"Invalid exercise: \$exercise\"; fi else echo 'You need to use git verify in detached HEAD'; fi }; f" # Add "git exercises" alias that shows list of available exercises. git config alias.exercises "! git push origin HEAD:exercises 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g'" From 47d5549b6f14accdeec561b902274bf8543edcca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Fr=C4=85cz?= Date: Thu, 5 Mar 2020 23:47:54 +0100 Subject: [PATCH 14/83] Fix git start next command (always check from master) --- configure.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.sh b/configure.sh index 7027e19..6f6ab9f 100755 --- a/configure.sh +++ b/configure.sh @@ -1,13 +1,13 @@ #!/usr/bin/env bash # Configure "git start" local alias for starting the exercise of user's choice and restarting the current one. -git config alias.start "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if [ \$exercise != next ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null ; then if echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1; then echo \"Exercise \$exercise started!\" && echo 'Read the README.md for instructions or view them in browser:' && echo \"http://gitexercises.fracz.com/e/\$exercise\" ; else echo 'Could not execute the start script.' && echo 'Try running the ./start.sh script yourself.' ; fi else echo 'Could not clean the working directory.' && echo 'Make sure that none of the files inside the working directory' && echo 'is used by another process and run git start again.'; fi else echo \"Invalid exercise: \$exercise\" && false; fi else git push origin HEAD:next-exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g' | xargs git start | grep -v Invalid || echo 'You have passed all exercises!'; fi else echo 'You need to use git start in detached HEAD'; fi }; f" +git config alias.start "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if [ \$exercise != next ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null ; then if echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1; then echo \"Exercise \$exercise started!\" && echo 'Read the README.md for instructions or view them in browser:' && echo \"http://gitexercises.fracz.com/e/\$exercise\" ; else echo 'Could not execute the start script.' && echo 'Try running the ./start.sh script yourself.' ; fi else echo 'Could not clean the working directory.' && echo 'Make sure that none of the files inside the working directory' && echo 'is used by another process and run git start again.'; fi else echo \"Invalid exercise: \$exercise\" && false; fi else git push origin master:next-exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g' | xargs git start | grep -v Invalid || echo 'You have passed all exercises!'; fi else echo 'You need to use git start in detached HEAD'; fi }; f" # Add "git verify" local alias for submitting exercises solutions. git config alias.verify "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if ! git status | grep 'up-to-date' >/dev/null 2>&1 ; then if echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | sed 's/remote: //g' | grep -v \"\\*\\*\" ; then : ; else echo 'Solution could not be verified - push failed.' && echo 'Do you have an internet connection?'; fi else echo \"You haven't made any progress on exercise \$exercise.\" && echo 'Did you forget to commit your changes?'; fi else echo \"Invalid exercise: \$exercise\"; fi else echo 'You need to use git verify in detached HEAD'; fi }; f" # Add "git exercises" alias that shows list of available exercises. -git config alias.exercises "! git push origin HEAD:exercises 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g'" +git config alias.exercises "! git push origin master:exercises 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g'" # Make sure you have a "current" push strategy set; this will allow you to push only current exercise with simple git # push command instead of pushing all matching branches (default in Git < 2.0) From a798646756526d260eb7a9838f185985a069de4a Mon Sep 17 00:00:00 2001 From: marijnl Date: Thu, 3 Sep 2020 13:59:44 +0200 Subject: [PATCH 15/83] Making it run on local machine Among changes: - dockerfile triggers build of frontend and backend - php more configurable from docker/.env - removed some unused stuff - small readme on how to run --- README.md | 70 + backend/.gitignore | 1 - backend/composer.lock | 118 - backend/config.php | 9 + backend/config.sample.php | 9 - backend/hook/hints/MergeConflict-solution.txt | 6 +- backend/hook/hints/MergeConflict-summary.md | 22 +- backend/hook/hook.php | 6 +- backend/schema/gitexercises.mwb | Bin 10213 -> 0 bytes docker/.env | 18 + docker/.env.sample | 16 - docker/Dockerfile | 30 +- docker/apache-conf/000-default.conf | 4 +- docker/docker-compose.dbnetwork.yml | 14 - docker/docker-compose.letsencrypt.yml | 22 - docker/docker-compose.yml | 14 +- frontend/package-lock.json | 6336 ----------------- frontend/public/.htaccess | 6 - 18 files changed, 150 insertions(+), 6551 deletions(-) delete mode 100644 backend/composer.lock create mode 100644 backend/config.php delete mode 100644 backend/config.sample.php delete mode 100644 backend/schema/gitexercises.mwb create mode 100644 docker/.env delete mode 100644 docker/.env.sample delete mode 100644 docker/docker-compose.dbnetwork.yml delete mode 100644 docker/docker-compose.letsencrypt.yml delete mode 100644 frontend/package-lock.json diff --git a/README.md b/README.md index 872d449..276e026 100644 --- a/README.md +++ b/README.md @@ -3,3 +3,73 @@ This repository contains the source code of the [git-exercises](https://gitexercises.fracz.com/) platform for practising git. ![git-exercises](frontend/public/images/intro.gif) + +## Overview + +This project consists of two docker images: mysql and an apache server. + +## Setup + +*Windows 10*: +``` +Docker desktop community 2.3.0.3 + - docker-compose version 1.25.5, build 8a1c60f6 + - Docker version 19.03.8, build afacb8b +MySQL Workbench 8.0 +``` + +*Ubuntu 18.04.5*: +``` +docker-compose version 1.17.1, build unknown +Docker version 19.03.6, build 369ce74a3c +mysql-client-core-5.7 +``` + +## Configuration + +The only file you need to update is `docker/.env` + +## How to build + +In directory `/docker` run +``` +docker-compose build +``` + +Make sure the default branch of your repo is `verifications` + +## How to run + +In directory `/docker` run +``` +docker-compose run +``` + +## Database schema initialization + +First time you need to run `backend/schema/gitexercises.sql` + +To execute these instructions do + +```bash +# login to mysql running in docker container +mysql -h localhost -P 3306 --protocol=tcp -u root +# run the sql file +source 'backend/schema/gitexercises.sql' + +``` + +## Start exercising + +Assuming you run on localhost, this is how you start with exercise 1 + +```bash +git clone http://localhost/git/exercises.git git-exercises +cd git-exercises +./configure.sh +git start +``` + +## Adding new exercises + +See [CONTRIBUTING.md](CONTRIBUTING.md) diff --git a/backend/.gitignore b/backend/.gitignore index 11fe973..45aadc4 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -1,5 +1,4 @@ vendor/ composer.phar -config.php *.log *.bak diff --git a/backend/composer.lock b/backend/composer.lock deleted file mode 100644 index 2974559..0000000 --- a/backend/composer.lock +++ /dev/null @@ -1,118 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", - "This file is @generated automatically" - ], - "hash": "c36aa61e8aeb792c94395ec83b037042", - "content-hash": "5f274745c29131ac98a15dc99797f5d2", - "packages": [ - { - "name": "michelf/php-markdown", - "version": "1.6.0", - "source": { - "type": "git", - "url": "https://github.com/michelf/php-markdown.git", - "reference": "156e56ee036505ec637d761ee62dc425d807183c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/michelf/php-markdown/zipball/156e56ee036505ec637d761ee62dc425d807183c", - "reference": "156e56ee036505ec637d761ee62dc425d807183c", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-lib": "1.4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Michelf": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Michel Fortin", - "email": "michel.fortin@michelf.ca", - "homepage": "https://michelf.ca/", - "role": "Developer" - }, - { - "name": "John Gruber", - "homepage": "https://daringfireball.net/" - } - ], - "description": "PHP Markdown", - "homepage": "https://michelf.ca/projects/php-markdown/", - "keywords": [ - "markdown" - ], - "time": "2015-12-24 01:37:31" - }, - { - "name": "slim/slim", - "version": "2.6.2", - "source": { - "type": "git", - "url": "https://github.com/slimphp/Slim.git", - "reference": "20a02782f76830b67ae56a5c08eb1f563c351a37" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/slimphp/Slim/zipball/20a02782f76830b67ae56a5c08eb1f563c351a37", - "reference": "20a02782f76830b67ae56a5c08eb1f563c351a37", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "suggest": { - "ext-mcrypt": "Required for HTTP cookie encryption" - }, - "type": "library", - "autoload": { - "psr-0": { - "Slim": "." - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Josh Lockhart", - "email": "info@joshlockhart.com", - "homepage": "http://www.joshlockhart.com/" - } - ], - "description": "Slim Framework, a PHP micro framework", - "homepage": "http://github.com/codeguy/Slim", - "keywords": [ - "microframework", - "rest", - "router" - ], - "time": "2015-03-08 18:41:17" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=5.5" - }, - "platform-dev": [] -} diff --git a/backend/config.php b/backend/config.php new file mode 100644 index 0000000..a7bd71b --- /dev/null +++ b/backend/config.php @@ -0,0 +1,9 @@ + file.txt -git add file.txt +git merge another-piece-of-work +echo 2+3=5 > equation.txt +git add equation.txt git commit --no-edit diff --git a/backend/hook/hints/MergeConflict-summary.md b/backend/hook/hints/MergeConflict-summary.md index 34a4a29..8efa85e 100644 --- a/backend/hook/hints/MergeConflict-summary.md +++ b/backend/hook/hints/MergeConflict-summary.md @@ -1,5 +1,5 @@ Because the branches have diverged, fast-forward merge strategy could not be applied. -Therefore, merge conflict was possible. Because two branches made changes in the same +Therefore, a merge conflict was possible. Because two branches made changes in the same file and near the same line, Git decided not to handle the situation itself but to throw a merge conflict (letting user decide what to do). @@ -12,27 +12,27 @@ that can make conflict resolution process a lot easier. * By default, Git shows only *your* changes and *their* changes of conflicting lines. This will look like this: <<<<<<< HEAD - Hello mundo + 2 + ? = 5 ======= - Hola world - >>>>>>> fast-bugfix + ? + 3 = 5 + >>>>>>> another-piece-of-work It is often very helpful to see also how the code looked like before both of these changes. Seeing more context can help figure out good conflict resolution a lot faster. You can [checkout each file in `diff3` mode](http://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts) that shows all three states of conflicting lines. - git checkout --conflict=diff3 file.txt + git checkout --conflict=diff3 equation.txt - Conflict in `file.txt` will be presented now as: + Conflict in `equation.txt` will be presented now as: <<<<<<< HEAD - Hello mundo + 2 + ? = 5 ||||||| merged common ancestors - Hello world + ? + ? = 5 ======= - Hola world - >>>>>>> fast-bugfix + ? + 3 = 5 + >>>>>>> another-piece-of-work If you like the `diff3` presentation of conflicts, you can enable them by default with @@ -41,6 +41,6 @@ that can make conflict resolution process a lot easier. * Sometimes you want either discard *your* changes or *their* changes that introduces the conflict. You can do that easily with - git checkout --ours file.txt + git checkout --ours equation.txt It's also worth to read the [Basic Branching and Merging](http://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging) from the Git Book. diff --git a/backend/hook/hook.php b/backend/hook/hook.php index 1fcc092..d5ef067 100755 --- a/backend/hook/hook.php +++ b/backend/hook/hook.php @@ -15,7 +15,7 @@ use GitExercises\services\GamificationService; use GitExercises\services\ShortIdService; -define('DOMAIN', 'https://gitexercises.fracz.com'); +define('DOMAIN', 'http://' + getenv("DOMAIN_NAME")); $branch = $argv[1]; $oldRev = $argv[2]; @@ -37,6 +37,10 @@ $possibleCommand = ucfirst(AbstractVerification::dashToCamelCase($exercise)); $command = 'GitExercises\\hook\\commands\\' . $possibleCommand . 'Command'; + +echo "just added \n"; +echo $command; + if (class_exists($command)) { (new $command())->execute($committerId); } else { diff --git a/backend/schema/gitexercises.mwb b/backend/schema/gitexercises.mwb deleted file mode 100644 index 0211dde313b9d3eaa29e6cfe2202f49d296ba0af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10213 zcmZ{KWl$VIx84J92prkmmLOFn zMR%=y9?+9ZyP8-<6eVRVcd(!-pFi;h&+={_L)h}~&E}@hdO^*oWAYc6QQR!5@arXC zz*7<4;q~l2RHSO+p`sp0>bpHo-KD4<(4ih2ux1xhROwPVk zCb`BPhR))7|2<&;__4<~wqtkC(p&G>v&Gz0T%634As^>}8o zdft6ag3e>j4gMD-$SmFc>x&pQCi8#1fsbDVU5htmM#QRA z#fgU#@IBC6=XTVR^j3G(vhORo;#2sDR`lqZY&MxQ4)*+n|0beasGKWxS1u8;FY=M@ zO_Ahm2*5r(t~CaTyv*+$k2v^0S>3#Q4A@Y5G5Ym=auxatb@zMjb?_^B_~D%TGOiN( z=X>asn5SG4+R*?=wDtOlN2%K{<|WilMJv0z2oee9_Wq_Fb!IrV7TyeQZyjEuI%VUjO#G zD8gYM(%Q#2-``%+8-X22_bX60I`9A=Zj2h-%E7Ph+eQdKLM|D+W&dY#Q1qyAP22W< z+v5%Gvi=l&PVW%D?0L1-dBHvzTSlM@+>wZWzeLjI`S5pkFZx#GR%N5y=weW*T{;@n z8}WV%xg0K81`VYjR7+bZ$yHRiINpIYkXmRLL&;cQNi2))Z5eiJn^^)2odQl7crOq$ zbN2;_DG{cCAAL>o-UZ9P^0@E9l!Io^Yy>d)uk-r$PCV0H(a2aXI_LLa!xcR0GG$Pn zXO5b4?j0_-{J3G-^(v*|hepFy7X~zYLx;}Ogn8i>Zx``44@dBW+G1X)dmf1uo@Hw|+5kg1x%0@>Wo#>&;$=+a$@g~QW9X(Xpd7a>*}p7YIcJ)N3}u%xMQ zC;z|5_EqXW>4RQ76L(f-4f#eCbrhl}9*ive8r$+Tg}|xm~C1tOo;hjv<1^Vgo+$`6NI^W@+f2^b!e2 zu_ad0{rdf%x>;fJI`bKKsW{fq!XJIqaE2OSTBU?gkp8=QGq(nheWJ|U4C$V30 zE?NE#S~UriRa35}Dk0A)o5MXy+Zb)FZtMAQ(KDUwZb z(E~a&WFv=mU?34`J)rdG{OdVpr7rr;EchBiqoq6r?L!Qi!`)sGua{-a3=?-Iho8iN zCa9s&c(y_$oVbXz;OHkxZf~#7Zf^IFU#@o4yWalfx8^;7N3H@%!{bf&tk{Y7ogA*7 zPKx?=4O5=~sOc`SNy_TTEEgyrJ!WN0v9W(iPLek%znZ9UoNTd}bW61NebIA%d4%fL zHnbE@aqI>O5}6Osc3lY3UHJZng%V`jE)Qc~NF>esGd%ep;=W`xW_fO1O@=5l`Z7gT zqTtW4I6jB!kf4JB5K%s?CV|*Vlxtc{E0L^++9c@~13_wt|I0C?8NF zF!c>pssQq&2$jWD)H0U1l|N4r$gqD?pYvo?EnBLUI*y30BhL8?KdwLptQla+a!T@m z6-g}2qzbdowJkyo;|^m93QHe!Lf4xN`wAAeR_@R!zK6W8$su%q)zfvgYC0N*6?Evl zj7vXX7AmV>vranbHwrUlRC<3=r{mR$h)#m8$#+=!>m3@<#|p-dh-T+>e>!|C9lQI> zujq4q)r>jfWxdsO2Yj3lh_$)D@GI3;kL#MgKb%d85`PB_4~#@Xh?3k@_oD-R8A1o- z{WLzpFksw!iKxbJfIu`6@>{bO>vCt{tEl^`YLnkD=T zG;C8g)e(3@R}}vwU%Xwif2-3wae*XJM+X-rMi~Bu3BT}`dwXzpDl5O(C-1w_`kts9 zkXE3|zVI04=J-x8x_-|!4y4hS8w1$~d{<1=On)RE91v!u|E9>h(I{UR^FS?PYXtKw z30A6}d)=EiJ*V*35hG}9bo;{De;EwrB+E?piFVyT5lK_&Nx2rgRhyO; zwYP&(y>Hq0c2oH2`e3|}?`Ih4Zq+@3EImBi%5v^phGbhl52?vkTR#slA0Uoi%P)Cl zL6*!HnV*g!wMy8aQ?tDLmG^d~E{AcwyGtIwjS-Jx#B0{gi`-X7@3L5PIhARqzV1K? z=2|Aj-Bb3Y{ia&g8}=3Wp_CDXh#crl2q>e*1e;M8%5d0V750W*t38|(quI`Y5>tT~ zQc?zIW?o16U^}>_1TCP9s=8ONCeQ#R=$`o)#a#BxEaGWN304js=XZ*Cc56XY?iz z)(~z@xWO1CO=g7TNQkjMT3HN=Dv%sv0$v6UKSaP8;c|i#l}>gT-KZvIIzBbc+VgRM zbMZe&;6vc?#A$+pK-}>05|ws?Ac;SL9J22w{m(=OK-6x*5*WzmKxBgD$ zfwWH8PE(LtTqbdXZE;Yncp!plzA7nk`iE=*u79-#6blQokD(G0tmyqh0EsNywG(>w zY$Wq)CmD+RTy$qHCG`|Jn&h+iBY(ES2a8P_O`ae())fgM+PwyIY>kC_YN6nbr8w`02tef zlJ%M={l>VjLD<~#-P@&H@50Jwh0tN_+KIRGcdDm8Ki20Uwm;~rPHVpvZuWfj@1B;! zY0TMF#4^2lD?dtOtyvuE(U?Rg;-j$9Slq8XX&-d5m?DS%?o}Pw64UElAY0-zhY=V|SE=rI835hB-QRqUwN|o??|0IO8HNY$#Mes}&~gal zhey75igmh1rz+0D8&}0dafy}zB=b=m_xlmRz>oBIpW3Bo{nqrS^trZrLn*Ywa8>(2 z@yU8b=_rwHsv$_V%la2SE?$i7zwI5^*m+v5?b&LqR^=tYNcaF<8@M4fgsKljWCj*#zUK4QW|2ZbO<(hmepDr${9=|_%qscGkKc+CtsD{x@*J^fK1Q};tA+(a2=MoC zknssgfJ90%b3FK1q^@=|Zle)3Vj7FNr``Fd_Q`ZiTuJqK_ffu#-VkPYB`TVl(3pp+ zh=gBCI0acOCYoI4_EA6{>6nMMh=i~Ia>Ws|@XT;(e*~j|tiy#~ovC8K7Pxfr&K+hG zyA?=NOlZkvtZ1kn@*C9{hlk^6hYN`4hV>S)cONSYLt>2wq8;Q(&sD8xDCwB|^`TKK zEL)WIRO2Ys*a>8{ft=!~POW$u082bIyI=^)0u@nlgsMim$+RPb$t3iLPm7a>1?H-& zHM$E{%H>#u083#m8wXW{B;bR3G9=?GB7$0P$N|2F1Qw7H?9hC1L9DJy!Yw-slGZAe zeWsX;#Fcc%p>uckIe)dUECODRaZDtvgm($!?C0%i2Sq4;+ohQr(*Xr-$x2T0ET+E* zfz|u`*2eK_S^aC6lr1 zqp@eP&Hv(>r-yb(B50L=<#W6=&8<{g- zbF6a22S`Vk^Jb`n4A7CK5ZmbBEHM9)c){`t_0TX?}JH-T(>&&jZr#yIdLt4y5gCq_!*xm ztQY?4tL5oyTs_jYcH}woPCt4+KD%?s=_jf|7o>0(TTAkoKF@ z*JM)FSa)G)E9JS}2#a2ERC`R1mQTUQAi9rlE8Rb_m~v4=xUO6jS&nv6%TkN0x4&t- zI>&g|MDnglll1u@+c{Jxq7F%xD@{qEI0%gZiK#zEAu)$wk5y{!~MzIL#6;&H3lo0TyG4R6l zFi6ua)AI@9OOT-a6BwCC7Nqz8!ae-gW)=An4xx9aAh;`#Iv7o|(Z$f19&jo{~Z zjx3WQG0rb*R%Z;VW6+LPVB%i=sQvzHru5g(AVh{hYS|!6{TqAMrJ(VhP!y#B>+4Bt zMjrF})yh=$;0kCHcjjyump4BuOt@WASu#4A^aU*}P*N&z2M#XJ?I$+%VEj#3^)T#7 zG`}L2*3I4!t}@Ex(}I_;TpJwNnbpjWR&mBrrmMiF?0fOL%+kLtC6>ato)H8JJT$O6 zB+1s*bArF)Sp6=jNfQ~XTxc&dYfn0x%^-Fhps@R0;4@CadJw3lF?tujTmVcfCwMl- z)kmKGG}<_$+zs?uK+5a#oVk*zxR&8-+=!yoHt^Rq6}YPF`SZyA#H;bQ;-z(vLF=~K4n;hJ1sHxvB_gki~O4zw;a*Xz9 z={~Ts7+od=z~baI7A7t3a`IJ$P@*rkFF}{5L2H0f(*wmEjo87qk&YkvQog|bo&h-C8{ znXEGdg+i0n5_1~oY?>#GThbQfR{G-#AH*R?9~UNjla!6>HPK-a?Fdv3^|h2b1rDf> zG>jBY^9ymM*JAStB}=#T$MjYhNe=#I`^P^+)BMfob|2F6#9Sy}aNO4W5xqEPPoasv z*ZXGJ5BuiTdPc&S76&%i4^hyg(YM%JW~0OvnllWBuf0iK3@xk<-uFB1Lf7=x>GwO` zV#Y%htSLTZQ9lbRdka`pE`Q6vTwnc4>X55f+qfpQmHXPYJuUXGD?u!L-bT%#Uv*1q zq5fed6Gv&zp;77iJlxohP@aAkSass2BBF-&_#d?5`MAd zhgEJFH?3xJM8xq;m#9tpb-BFIpSw>nu)k_VzT?t;>7xukUTXZI&w$13Ie$6MZ&dUn zK>4JQ60u&b@B>vd>rT&0LOv|l`758a zCFVTUa&{*aI?+qXJMwbo(w;PBd*D1ixu2TVy-sl?S*aM9=1VY(0!F0U(v&5a z8Ut;^9nli8Be>3;q0Xq`;(SPfOU1iTT$IhFE(8S0L#5!U@z>aMJ2amSTFIxNumYzG zYG0y^aad5h`oJw9&)%nh0Q1ATna=TG(+36@XOamYs|i!M!w_S*%7m$Fhk`f4i^(_s0XP*p{ao! zq{y^0i9iiX6I8#v#zYwtF%Y3zcu@p1whpO)hT8$N+Lp6In3ZweS7 zz$%e-LWyy*O_}%9sFM51I)sAyhz>!Z4wVx+_tLP_BG^XDf2J_6Ds#}6=IYt;b&NUOT&U>m$JihBFe>ORC@sUf0oU>y z_8wNWr`otRq_Q(#Ggz-UQy>wt9;#)&#Qzfju30W_Q$7Z5#1tNCB)5F(RO)PNk*rap zctq~r_wrdjr9Gu<<4Y6x`Bxfr@y(0`*GHq;$0zGvq($F}Ww`OVlbwj?;-G9gEEDB! zBZG^_kJpO%{(ej@VC^%|JD&I8hlE!q7sFSRt*ufeA+mXP6 zC7Q1n-P%j;{L+%#y8fl}w_Kmo{&2Td?_}#6kIqi}pttwg*aK>t&x1Z)Ctq5L#T&m! z$6xll9%kk6BP_~|#dL&gA()yUMOVE9ol{R;8KtpCo}f?F7q=9D6~PV*O`Brk?7mW4 zOXbZ9kGIgRw@|HfCP5fYW6iJfsPB+=pD#_$VHdJk`9 z{WZS}e_niFSP5OTs4aWU6M@}zLzr|1N`Er*mXo888BJx<Eri@PkYyTcihmO`mPr2{Iv7e{EwPA&M8>VgLSdW$f zam`}>#q{#BNQZ8d#U61?IZA7VMtM|6O557`a=5drW~t4*+M#7>0Z+>2C!WE}i{?>* z{v_B2T=4{&ZICuK03QjtRF>os6=#eUpH^S3KXk-NF=;A`+&?SQfNP4vy}o(as>Ox( zqAAJ{V0nw3wTejk#znfZKGxjMbuP9>Z0m9eIi|k`mla?AjP1U*Tufb8Di%Af+J6*n zSaxue?`=0|`C;hoj@hg2v2nR*;Nr6Q5LKCw2SGPh1m_~l=SJnT0~P)$?u$)_Ne|xn zz3t5>k0q-_Q}x2x-V+ay7vA=%cv^dG{hxY4;Sm)=_Z`fi?eZ+&nw}HJU}ypNq<;j}(Z+kI21+{WBg1+o>A7 z55{(tE_$!%NU9+@{?zWyM@pB4u^Z6+fLP=7x?L#M`&_O6zT5nV^DFB7FIqwT)OWpC zJDP5hjMzVs#X0HHsnWRy(^`schvX_)uZx-JqiN_V6vIas)25f4*t?u{35W=LVv65| z*NE1;8~WEtc&j~AQdU=^jrb-0r9^>hF}{_8%*S_qK3T=z2@Q`|2&0t4ct;<7fj>Gf zRt=NdR!_SZGE3`gw5a9d>Y<5-j{yqymy$=}?;T$8Ipc>$c>??LqvQjT;_FLC?P&-3 z2epqK-3U?$95}Q5J7lZh3o&lcj#ltRM}G=y%OT7r(i(E4$h5Qo26O;j=bK839L}=J zJYwcfuOVKwXUmU#0l0+`U$qf%EKxFp`NZ|)gCy7>{ZQ;Mvg(T;XjnOo)399u6M7I3 zp&uPtv%^#05(y5g35r5}sO+>p!Y+9VOJFe1txZ-Fz5Bi7n%vxe(WQ#SP}dx#HbiX} zH&sj06n-qo&{#QFK)@5^mG@XfZzK$Nv)8ySbd4uJ>|!2*8V`a|1DASqqg0u=V&ubES!L^`o$sB=OY6gBM5%U?e=nK^`$NGV(<2c zSRUDB)}E$Crl=oYV8;@sfw zYA<9rgChHO>0*1S8vE~OO3J#xFt`um9l7MHl~G!s3jlm-U^sf#FWznU#Nx& zL6i8oiB`Fi(m_#>UG*dg=S|b|pUEj_20vjDDqpMtPw)Pdsp+im zvI1gq(zUpJH8rI0gzZv{SU_b8w7eh;_4MaHop!d?kWHlsj>pKp`p^t1dmQQ!ZRJf- z^ZJ#HC(O3*o4Uhs0$TZIb^47h)%;2GiZ>iz@$d65#L>z3Itpp^EMe1i$xWTVE!v98 zShWRVHCfL_=>8gP8+v`ytm}1oRjYOXX~RKImri$XEeB8;wEphUHyWzoeZJYi!KLUr zv0U?RS*WuYKUKG`k+k-rhUb5z)D<##RxdRmXkcc2NHh4}(q6sDekJ;Gv@+vPSKrU` z={grYTD|l!ioz!#rS$TY)p60TWzqh{BlSKiulr=GWN`5&<~L)ma4qyQ@1^8ef{#wN zPP$Wd8N7jc8@*=UNnX-V{_}o)M4H|<^2}MXN`&3rbPefU()4(XwQwG`m>;9`X%;y* zD&fV1?~OTm+b3eei3FcR_?}t29+*?QK~bD?uU>IIw%aolYIbnlzN{H=c9YH3Vcxe%U0~|NGiqt%V{k3jV5~;MR%ndix>7qLl55J*mv9B zjy6i|pBwF!-n?@?6_L zCo(3SAY?>672}#Go1Ow)+4dI&k?Z69tCo9Y7Ek(g-r^)jIPYg<4}O;R-NG=s9e^#yf|WCg`Z^advR}w|A=l+p*!> zpf9VL5eoqD{$CI`GhsJ_x>*Q11LwN8;>CRASK1(!K zML9TX{7<)LXCIGmi*m~N&ZSdZAm!?No;sL|!9`<0mi}K2vQ2w-!{y&#BR`H4k+t)H za}?7MPq<7xBuNFNU*;HJWs{^FIc2=KjVj(lS=;V4tAqj=w0_(s@K)?kUVOQ)r*zUeE!3ah)hX>h(CyFcBp z2)$Mp{d`_sy^g_PR8=;_-=@Rr1}MKD5qh_nu5O3%(xn#A;r&O;?J>9K@p!7Q)Z@*H z)l6T2%br|0!*=(uDk|bf@_HpRGn2iXPxMLA)Qx%x$?mf9o0mro-_cU&{hcvv_%wr| z3+gblKJ;o~W4PAiQQ{q2mT~@CaFOm&{N-)*h~2vR;a%|S#*vD*p25ozUQ4r@UnXz4 z7{#9jnx5{a`URb!Uqj3n-a2Pzc8^A6zHQOS#}C=x9!B;rA~`zl`j`Y4OwLn?Ru!6P zS^~gVi@6fPZ%C=*Llx4!(Gr)&3zQUh9xr+YCtWAAjsdD!h+%SC7H4l_1b?h&a{Ii* zOZ=KLTLX07UU!RoB!ZC-v18x(EFHUHJqBciL(nI`3Yf#UH8KR);fVNd^uzV`p5^^& z$K>qEs$Zin7vckf*OhU7uSKL_P@3r12LVAD&bt0=!I&yokJhj7Csv(KvA9kDPd58M z4)LnuX+xX8!Mh~v#Bd`WdVVFd+Y%6Bt`f+oS?u7_{T}VA&HUA=%1k^|_A765%-2J< zpxIJTC^GtTj%dsmqTwB}S7S~p{3JqoV)3UxE54RLlkvB7ZIUYM8RrU~bXg}9E!pOl zQI`Wx-h+*&5|~RTjfqjkS#~`WeCN1!uw;bBs*uY<5c>o;)m67X5Q>%;CjWqf@N>aEnKiZx^~XBf;3{L!!=5 z;o>L39kQgd(3h6rdJb^M%#@QbQ~1zq#ml5aOZyHC&;&%np-T|+r_osG3Ng&t#z2V+ zqT%r1!{j2VCKi4f3-9)qDk5^t$4K#S>&WDa(vl4@C5sLNhdKVJ9tdbT55N6@1q352 zy>9-y1Gk57RX1t*_oV*Z{2x7aSibRHvy0`}?(h`nN7i}of;ko&aUY9DQ5}gjG*7+8 z`Y0xsPUa@){r{bzQs?^^Sq1^{5C_6wC9?34e!7&z*TlKy<%#gtLa9LxmQO!>tGEt0 z!i?E~zVwN+miNbdHLd*SUt2_ekms0gg_x=n7vfpk$RPY-0h;wE(HfGNm^8dO%;duD zc&IAC!Q&(R|1EC+xbVM5bI^an|802t@96&*-TqH30MHy%|Iaq}AM*Y0i2oPy{vX83 zKg55dVO0gB{}4F<;omI#7q{sF0BL}dmxh`m=#zu9jfuIvsU=9s!OYwi1a&sGv~o8G qaj-$q?EaHsbuqOxw}ZL}g6zD^Ojtk`R<1_op61S`Rxai)X#WE-?t&}; diff --git a/docker/.env b/docker/.env new file mode 100644 index 0000000..e15fe1d --- /dev/null +++ b/docker/.env @@ -0,0 +1,18 @@ +# SOME FANCY NAME +COMPOSE_PROJECT_NAME=gitexercises + +# MYSQL CONFIG +VOLUME_DATA=../var +DB_HOST = 'gitexercises-db' # this refers to the docker hostname +DB_NAME = 'gitexercises' +DB_USER = 'root' +DB_PASSWORD = '' # for safety consider setting a passwd, note that you mannually need to change the mysql root password accordingly + +# YOUR GIT REPO +GIT_REPO=https://github.com/marijnl/git-exercises.git + +# EXPOSE HTTP SERVICE ON PORT +PORT_HTTP=80 + +# DOMAIN ASSOCIATED TO ONLINE ENVIRONMENT +DOMAIN_NAME=localhost \ No newline at end of file diff --git a/docker/.env.sample b/docker/.env.sample deleted file mode 100644 index dc3e563..0000000 --- a/docker/.env.sample +++ /dev/null @@ -1,16 +0,0 @@ -COMPOSE_PROJECT_NAME=gitexercises -DATABASE_PASSWORD=CHANGE_ME_BEFORE_FIRST_LAUNCH -# set this to the uid of the user that will run docker container (get it with: echo $UID) -UID=1001 - -VOLUME_SOURCES=../ -VOLUME_DATA=../var - - -##### STANDALONE MODE CONFIGURATION ##### -#PORT_HTTP=80 - - -##### PROXIED MODE CONFIGURATION ##### -#DOMAIN_NAME=gitexercises.fracz.com -#ADMIN_EMAIL=fraczwojciech@gmail.com diff --git a/docker/Dockerfile b/docker/Dockerfile index cc20f18..759835f 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -14,6 +14,9 @@ RUN apt-get update \ unzip \ nodejs \ zlib1g-dev \ + nano \ + iputils-ping \ + mysql-server \ && update-ca-certificates \ && docker-php-ext-install \ pdo_mysql \ @@ -21,23 +24,40 @@ RUN apt-get update \ curl \ zip \ && apt-get autoremove \ - && rm -r /var/lib/apt/lists/* + && rm -r /var/lib/apt/lists/* \ + && curl -s https://getcomposer.org/installer | php \ + && mv composer.phar /usr/local/bin/composer + +ADD ./apache-conf/000-default.conf /etc/apache2/sites-available RUN a2enmod rewrite expires deflate ssl cgi alias env headers +ARG GIT_REPO + RUN mkdir git \ && touch v4 \ && mkdir workingarea \ - && git clone --bare https://github.com/fracz/git-exercises.git git/exercises.git \ - && ln -s /var/www/website/backend/hook/hook.php /var/www/git/exercises.git/hooks/update -COPY git-config git/exercises.git/config + && git clone --bare ${GIT_REPO} git/exercises.git \ + && git clone ${GIT_REPO} website \ + && ln -s /var/www/website/backend/hook/hook.php /var/www/git/exercises.git/hooks/update \ + && cp /var/www/website/docker/git-config git/exercises.git/config WORKDIR /var/www/git/exercises.git RUN git checkout master && git branch -D verifications -WORKDIR /var/www +WORKDIR /var/www/website/backend +RUN composer install +WORKDIR /var/www/website/frontend +RUN npm install + +RUN npm install bower -g +RUN bower --allow-root install +RUN npm run-script dist + +WORKDIR /var/www ARG WWW_DATA_UID=1001 RUN usermod --uid "$WWW_DATA_UID" www-data \ && groupmod --gid "$WWW_DATA_UID" www-data \ && chown -hR www-data:www-data /var/www +RUN echo ${GIT_REPO} \ No newline at end of file diff --git a/docker/apache-conf/000-default.conf b/docker/apache-conf/000-default.conf index e42b99f..0b2b171 100644 --- a/docker/apache-conf/000-default.conf +++ b/docker/apache-conf/000-default.conf @@ -1,6 +1,6 @@ - #ServerName gitexercises.fracz.com - ServerAdmin fraczwojciech@gmail.com + ServerName $DOMAIN_NAME + ServerAdmin xx@gmail.com DocumentRoot /var/www/website/frontend/public SetEnv GIT_PROJECT_ROOT /var/www/git diff --git a/docker/docker-compose.dbnetwork.yml b/docker/docker-compose.dbnetwork.yml deleted file mode 100644 index a522818..0000000 --- a/docker/docker-compose.dbnetwork.yml +++ /dev/null @@ -1,14 +0,0 @@ -version: '3' - -# Use this config file if you want to expose application's database in the Docker's external network called dbnetwork. -# It enables you to launch another container with a database management tool like PHPMyAdmin and connect to the -# database via the external network. -# docker-compose -f docker-compose.yml -f docker-compose.dbnetwork.yml up --build -d - -services: - gitexercises-db: - networks: [dbnetwork] - -networks: - dbnetwork: - external: true diff --git a/docker/docker-compose.letsencrypt.yml b/docker/docker-compose.letsencrypt.yml deleted file mode 100644 index cfb9054..0000000 --- a/docker/docker-compose.letsencrypt.yml +++ /dev/null @@ -1,22 +0,0 @@ -version: '3' - -# configuration file to use with https://github.com/evertramos/docker-compose-letsencrypt-nginx-proxy-companion -# In order to run: -# 1. docker network create webproxy -# 2. Start the proxy -# 3. Configure DOMAIN_NAME and ADMIN_EMAIL in .env -# 4. docker-compose -f docker-compose.yml -f docker-compose.letsencrypt.yml up --build -d - -services: - gitexercises: - networks: [proxy] - environment: - VIRTUAL_HOST: ${DOMAIN_NAME} - LETSENCRYPT_HOST: ${DOMAIN_NAME} - LETSENCRYPT_EMAIL: ${ADMIN_EMAIL} - expose: [80] - -networks: - proxy: - external: - name: webproxy diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 7f0a20f..7c66242 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -5,15 +5,14 @@ services: container_name: ${COMPOSE_PROJECT_NAME} restart: unless-stopped networks: [default] + env_file: + - .env ports: - "${PORT_HTTP}:80" build: context: . args: - WWW_DATA_UID: ${UID} - volumes: - - ../:/var/www/website:z - - ./apache-conf:/etc/apache2/sites-available:z + GIT_REPO: ${GIT_REPO} depends_on: - gitexercises-db logging: @@ -26,9 +25,10 @@ services: image: mysql networks: [default] environment: - MYSQL_ROOT_PASSWORD: ${DATABASE_PASSWORD} - MYSQL_DATABASE: gitexercises - MYSQL_USER: gitexercises + MYSQL_ALLOW_EMPTY_PASSWORD: "true" + MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} + MYSQL_DATABASE: ${DB_NAME} + MYSQL_USER: ${DB_USER} MYSQL_PASSWORD: ${DATABASE_PASSWORD} volumes: - ${VOLUME_DATA}/mysql:/var/lib/mysql:z diff --git a/frontend/package-lock.json b/frontend/package-lock.json deleted file mode 100644 index a259539..0000000 --- a/frontend/package-lock.json +++ /dev/null @@ -1,6336 +0,0 @@ -{ - "name": "git-exercises", - "version": "0.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "acorn": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.6.4.tgz", - "integrity": "sha1-6x9FtKQ/ox0DcBpexG87Umc+kO4=", - "dev": true - }, - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "alter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz", - "integrity": "sha1-x1iICGF1cgNKrmJICvJrHU0cs80=", - "dev": true, - "requires": { - "stable": "~0.1.3" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "argh": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/argh/-/argh-0.1.4.tgz", - "integrity": "sha1-PrTWEpc/xrbcbvM49W91nyrFw6Y=", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "bufferstreams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-1.0.1.tgz", - "integrity": "sha1-z7GtlWjTujz+k1upq92VLeiKqyo=", - "dev": true, - "requires": { - "readable-stream": "^1.0.33" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "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" - } - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "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" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-css": { - "version": "3.4.28", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", - "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", - "dev": true, - "requires": { - "commander": "2.8.x", - "source-map": "0.4.x" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "cli-color": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.1.0.tgz", - "integrity": "sha1-3hiM3Ekp2DtnrqBBEPvtQP2/Z3U=", - "dev": true, - "requires": { - "ansi-regex": "2", - "d": "^0.1.1", - "es5-ext": "^0.10.8", - "es6-iterator": "2", - "memoizee": "^0.3.9", - "timers-ext": "0.1" - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "coffee-script": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.9.3.tgz", - "integrity": "sha1-WW5ug/z8tnxZZKtw1ES+/wrASsc=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/color/-/color-0.8.0.tgz", - "integrity": "sha1-iQwHw/1OZJU3Y4kRz2keVFi2/KU=", - "dev": true, - "requires": { - "color-convert": "^0.5.0", - "color-string": "^0.3.0" - } - }, - "color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", - "dev": true - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "requires": { - "color-name": "^1.0.0" - } - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "colornames": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/colornames/-/colornames-0.0.2.tgz", - "integrity": "sha1-2BH9bIT1kClJmorEQ2ICk1uSvjE=", - "dev": true - }, - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "dev": true - }, - "colorspace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.0.1.tgz", - "integrity": "sha1-yZx5btMRKLmHalLh7l7gOkpxl0k=", - "dev": true, - "requires": { - "color": "0.8.x", - "text-hex": "0.0.x" - } - }, - "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - } - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "d": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", - "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - } - }, - "deap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deap/-/deap-1.0.1.tgz", - "integrity": "sha512-k75KYNZMvwAwes2xIPry/QTffXIchjD8QfABvvfTr80P85jv5ZcKqcoDo+vMe71nNnVnXYe8MA28weyqcf/DKw==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - } - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "del": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-1.1.1.tgz", - "integrity": "sha1-7+ETAdEROJTCAzaijAhkTRVmitE=", - "dev": true, - "requires": { - "each-async": "^1.0.0", - "globby": "^1.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^2.0.0", - "rimraf": "^2.2.8" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "deprecated": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", - "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "diagnostics": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.0.1.tgz", - "integrity": "sha1-rM2wgMgrsl0N1zQwqeaof7tDFUE=", - "dev": true, - "requires": { - "colorspace": "1.0.x", - "enabled": "1.0.x", - "kuler": "0.0.x" - } - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" - } - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "each-async": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", - "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=", - "dev": true, - "requires": { - "onetime": "^1.0.0", - "set-immediate-shim": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emits": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emits/-/emits-3.0.0.tgz", - "integrity": "sha1-MnUrupXhcHshlWI4Srm7ix/WL3A=", - "dev": true - }, - "enabled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", - "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", - "dev": true, - "requires": { - "env-variable": "0.0.x" - } - }, - "end-of-stream": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", - "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", - "dev": true, - "requires": { - "once": "~1.3.0" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "1" - } - } - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "env-variable": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz", - "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es5-ext": { - "version": "0.10.49", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.49.tgz", - "integrity": "sha512-3NMEhi57E31qdzmYp2jwRArIUsj1HI/RxbQ4bgnSB+AIKIxsAmTiK83bYMifIcpWvEc3P1X30DhUKOqEtF/kvg==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - }, - "dependencies": { - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - } - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - }, - "dependencies": { - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - } - } - }, - "es6-weak-map": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz", - "integrity": "sha1-cGzvnpmqI2undmwjnIueKG6n0ig=", - "dev": true, - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.6", - "es6-iterator": "~0.1.3", - "es6-symbol": "~2.0.1" - }, - "dependencies": { - "es6-iterator": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz", - "integrity": "sha1-1vWLjE/EE8JJtLqhl2j45NfIlE4=", - "dev": true, - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.5", - "es6-symbol": "~2.0.1" - } - }, - "es6-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz", - "integrity": "sha1-dhtcZ8/U8dGK+yNPaR1nhoLLO/M=", - "dev": true, - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.5" - } - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", - "integrity": "sha1-CZNQL+r2aBODJXVvMPmlH+7sEek=", - "dev": true - }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - }, - "dependencies": { - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - } - } - }, - "event-stream": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.5.tgz", - "integrity": "sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "fined": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.1.tgz", - "integrity": "sha512-jQp949ZmEbiYHk3gkbdtpJ0G1+kgtLQBNdP5edFP7Fh+WAYceLQz6yO1SBj72Xkg8GVyTB3bBzAYrHJVh5Xd5g==", - "dev": true, - "requires": { - "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" - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "fork-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz", - "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - } - } - }, - "gaze": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", - "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", - "dev": true, - "requires": { - "globule": "~0.1.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-imports": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-imports/-/get-imports-1.0.0.tgz", - "integrity": "sha1-R8C07piTUWQsVJdxk79Pyqv1N48=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1", - "import-regex": "^1.1.0" - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^2.0.1", - "once": "^1.3.0" - } - }, - "glob-stream": { - "version": "3.1.18", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", - "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", - "dev": true, - "requires": { - "glob": "^4.3.1", - "glob2base": "^0.0.12", - "minimatch": "^2.0.1", - "ordered-read-streams": "^0.1.0", - "through2": "^0.6.1", - "unique-stream": "^1.0.0" - } - }, - "glob-watcher": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", - "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", - "dev": true, - "requires": { - "gaze": "^0.5.1" - } - }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", - "dev": true, - "requires": { - "find-index": "^0.1.1" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globby": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-1.2.0.tgz", - "integrity": "sha1-x8l60cxvhZSBHaHrgpBqhSukfaQ=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "async": "^0.9.0", - "glob": "^4.4.0", - "object-assign": "^2.0.0" - } - }, - "globule": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", - "dev": true, - "requires": { - "glob": "~3.1.21", - "lodash": "~1.0.1", - "minimatch": "~0.2.11" - }, - "dependencies": { - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", - "dev": true, - "requires": { - "graceful-fs": "~1.2.0", - "inherits": "1", - "minimatch": "~0.2.11" - } - }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", - "dev": true - }, - "lodash": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } - } - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "gulp": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", - "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", - "dev": true, - "requires": { - "archy": "^1.0.0", - "chalk": "^1.0.0", - "deprecated": "^0.0.1", - "gulp-util": "^3.0.0", - "interpret": "^1.0.0", - "liftoff": "^2.1.0", - "minimist": "^1.1.0", - "orchestrator": "^0.3.0", - "pretty-hrtime": "^1.0.0", - "semver": "^4.1.0", - "tildify": "^1.0.0", - "v8flags": "^2.0.2", - "vinyl-fs": "^0.3.0" - } - }, - "gulp-angular-filesort": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/gulp-angular-filesort/-/gulp-angular-filesort-1.0.4.tgz", - "integrity": "sha1-RZ+yOxFk1FtJrUfTs0TBGwNE1zU=", - "dev": true, - "requires": { - "event-stream": "^3.1.1", - "gulp-util": "^3.0.0", - "ng-dependencies": "~0.1.1", - "toposort": "~0.2.10" - } - }, - "gulp-angular-templatecache": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/gulp-angular-templatecache/-/gulp-angular-templatecache-1.8.0.tgz", - "integrity": "sha1-g/bCo3Km3nN67mPxnGQF/SK8G/o=", - "dev": true, - "requires": { - "event-stream": "3.x", - "gulp-concat": "2.x", - "gulp-footer": "1.x", - "gulp-header": "1.x", - "gulp-util": "3.x", - "js-string-escape": "~1.0.0", - "path": "0.x" - } - }, - "gulp-coffee": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/gulp-coffee/-/gulp-coffee-2.3.1.tgz", - "integrity": "sha1-UNRuPyTL8XdCFFFmHSTSQ2J8NB0=", - "dev": true, - "requires": { - "coffee-script": "^1.9.0", - "gulp-util": "^3.0.2", - "merge": "^1.2.0", - "through2": "^0.6.3", - "vinyl-sourcemaps-apply": "^0.1.4" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "dev": true - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - } - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulp-concat": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.0.tgz", - "integrity": "sha1-WFz7EVQR80h3MTEUBWa2qBxpy5E=", - "dev": true, - "requires": { - "concat-with-sourcemaps": "^1.0.0", - "gulp-util": "^3.0.1", - "through2": "^0.6.3" - } - }, - "gulp-concat-css": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-concat-css/-/gulp-concat-css-2.2.0.tgz", - "integrity": "sha1-JfKBJqnaig9YPgiXs/uEJSKcUoI=", - "dev": true, - "requires": { - "gulp-util": "~3.0.1", - "lodash.defaults": "^3.0.0", - "parse-import": "^2.0.0", - "rework": "~1.0.0", - "rework-import": "^2.0.0", - "rework-plugin-url": "^1.0.1", - "through2": "~1.1.1" - }, - "dependencies": { - "lodash.defaults": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", - "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", - "dev": true, - "requires": { - "lodash.assign": "^3.0.0", - "lodash.restparam": "^3.0.0" - } - }, - "through2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", - "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", - "dev": true, - "requires": { - "readable-stream": ">=1.1.13-1 <1.2.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "gulp-filter": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-2.0.2.tgz", - "integrity": "sha1-HOsdET7plCzt1J9YY7Qr5EvHzSw=", - "dev": true, - "requires": { - "gulp-util": "^3.0.0", - "merge-stream": "^0.1.7", - "multimatch": "^2.0.0", - "plexer": "0.0.3", - "through2": "^0.6.1" - } - }, - "gulp-footer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/gulp-footer/-/gulp-footer-1.1.2.tgz", - "integrity": "sha512-G6Z8DNNeIhq1KU++7kZnbuwbvCubkUMOVADOt+0qTHSIqjy2OPo1W4bu4n1aE9JGZncuRTvVQrYecGx2uazlpg==", - "dev": true, - "requires": { - "event-stream": "*", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.6.2" - }, - "dependencies": { - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - } - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - } - } - }, - "gulp-header": { - "version": "1.8.12", - "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", - "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==", - "dev": true, - "requires": { - "concat-with-sourcemaps": "*", - "lodash.template": "^4.4.0", - "through2": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", - "dev": true, - "requires": { - "lodash._reinterpolate": "~3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", - "dev": true, - "requires": { - "lodash._reinterpolate": "~3.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "gulp-if": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-1.2.5.tgz", - "integrity": "sha1-m9nBYDLswo4BVL+wWCjSMxZvLak=", - "dev": true, - "requires": { - "gulp-match": "~0.2.1", - "ternary-stream": "^1.2.0", - "through2": "~0.6.2" - } - }, - "gulp-inject": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gulp-inject/-/gulp-inject-1.2.0.tgz", - "integrity": "sha1-K2Zw/kcYs95NgUBfxdnVaTChJ0I=", - "dev": true, - "requires": { - "event-stream": "^3.1.0", - "gulp-util": "^3.0.0" - } - }, - "gulp-load-plugins": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/gulp-load-plugins/-/gulp-load-plugins-0.10.0.tgz", - "integrity": "sha1-gMDqWKOqQ4KjLAWp1qcLHFZqgT0=", - "dev": true, - "requires": { - "findup-sync": "^0.2.1", - "multimatch": "2.0.0" - }, - "dependencies": { - "findup-sync": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.2.1.tgz", - "integrity": "sha1-4KkKRQB1xJRm7lE3MgV1FLgeh4w=", - "dev": true, - "requires": { - "glob": "~4.3.0" - } - }, - "glob": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.3.5.tgz", - "integrity": "sha1-gPuwjKVA8jiszl0R0em8QedRc9M=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^2.0.1", - "once": "^1.3.0" - } - }, - "multimatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.0.0.tgz", - "integrity": "sha1-xa2kJTV7dEulSELr3OHI8L5UK28=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "minimatch": "^2.0.1" - } - } - } - }, - "gulp-match": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-0.2.1.tgz", - "integrity": "sha1-C+0I2ovW6JaG+J/7AEM3+LrQbSI=", - "dev": true, - "requires": { - "minimatch": "^1.0.0" - }, - "dependencies": { - "minimatch": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", - "integrity": "sha1-4N0hILSeG3JM6NcUxSCCKpQ4V20=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } - } - }, - "gulp-minify-css": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gulp-minify-css/-/gulp-minify-css-1.1.0.tgz", - "integrity": "sha1-XR1k8aSiVppwjyOmhXrheNTd1h4=", - "dev": true, - "requires": { - "clean-css": "^3.1.5", - "gulp-util": "^3.0.4", - "object-assign": "^2.0.0", - "through2": "^0.6.3", - "vinyl-bufferstream": "^1.0.1", - "vinyl-sourcemaps-apply": "^0.1.4" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "dev": true - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - } - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulp-minify-html": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/gulp-minify-html/-/gulp-minify-html-1.0.6.tgz", - "integrity": "sha1-+Ufz8TlHW74bCP/+cUxHKfH/Bwo=", - "dev": true, - "requires": { - "gulp-util": "^3.0.3", - "minimize": "^1.5.0", - "through2": "^0.6.1" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "dev": true - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - } - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulp-ng-annotate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulp-ng-annotate/-/gulp-ng-annotate-1.0.0.tgz", - "integrity": "sha1-Il9wobwYMBwuiDG9pwpZ7xsPqZ4=", - "dev": true, - "requires": { - "bufferstreams": "~0.0.2", - "gulp-util": "^2.2.14", - "merge": "^1.1.3", - "ng-annotate": "^1.0.0", - "through2": "^0.4.1", - "vinyl-sourcemaps-apply": "^0.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", - "dev": true - }, - "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", - "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", - "dev": true - }, - "bufferstreams": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-0.0.2.tgz", - "integrity": "sha1-fOjf+Wi7rAC56QFYosQUVvdAq90=", - "dev": true, - "requires": { - "readable-stream": "^1.0.26-2" - } - }, - "chalk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", - "dev": true, - "requires": { - "ansi-styles": "^1.1.0", - "escape-string-regexp": "^1.0.0", - "has-ansi": "^0.1.0", - "strip-ansi": "^0.3.0", - "supports-color": "^0.2.0" - } - }, - "gulp-util": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", - "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", - "dev": true, - "requires": { - "chalk": "^0.5.0", - "dateformat": "^1.0.7-1.2.3", - "lodash._reinterpolate": "^2.4.1", - "lodash.template": "^2.4.1", - "minimist": "^0.2.0", - "multipipe": "^0.1.0", - "through2": "^0.5.0", - "vinyl": "^0.2.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "through2": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", - "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", - "dev": true, - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~3.0.0" - } - } - } - }, - "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", - "dev": true, - "requires": { - "ansi-regex": "^0.2.0" - } - }, - "minimist": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", - "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", - "dev": true - }, - "strip-ansi": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", - "dev": true, - "requires": { - "ansi-regex": "^0.2.1" - } - }, - "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", - "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", - "dev": true - }, - "through2": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", - "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", - "dev": true, - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~2.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } - } - }, - "vinyl": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", - "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", - "dev": true, - "requires": { - "clone-stats": "~0.0.1" - } - }, - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", - "dev": true - } - } - }, - "gulp-sass": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-2.0.4.tgz", - "integrity": "sha1-lwPemAuevypBgnHgxePk7Zrfdro=", - "dev": true, - "requires": { - "gulp-util": "^3.0", - "node-sass": "^3.0.0", - "object-assign": "^2.0.0", - "through2": "^0.6.3", - "vinyl-sourcemaps-apply": "~0.1.1" - } - }, - "gulp-uglify": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-1.5.3.tgz", - "integrity": "sha1-YKALOXWrpBhkQqSUl56d+j8T0NY=", - "dev": true, - "requires": { - "deap": "^1.0.0", - "fancy-log": "^1.0.0", - "gulp-util": "^3.0.0", - "isobject": "^2.0.0", - "through2": "^2.0.0", - "uglify-js": "2.6.2", - "uglify-save-license": "^0.4.1", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true, - "requires": { - "source-map": "^0.5.1" - } - } - } - }, - "gulp-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.1.tgz", - "integrity": "sha1-ghSJTQXCu2zH9VRJGKUd34gYDwA=", - "dev": true, - "requires": { - "chalk": "^0.5.0", - "dateformat": "^1.0.7-1.2.3", - "lodash": "^2.4.1", - "lodash._reinterpolate": "^2.4.1", - "lodash.template": "^2.4.1", - "minimist": "^1.1.0", - "multipipe": "^0.1.0", - "through2": "^0.6.1", - "vinyl": "^0.4.0" - }, - "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", - "dev": true - }, - "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", - "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", - "dev": true - }, - "chalk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", - "dev": true, - "requires": { - "ansi-styles": "^1.1.0", - "escape-string-regexp": "^1.0.0", - "has-ansi": "^0.1.0", - "strip-ansi": "^0.3.0", - "supports-color": "^0.2.0" - } - }, - "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", - "dev": true, - "requires": { - "ansi-regex": "^0.2.0" - } - }, - "strip-ansi": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", - "dev": true, - "requires": { - "ansi-regex": "^0.2.1" - } - }, - "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", - "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", - "dev": true - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "import-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/import-regex/-/import-regex-1.1.0.tgz", - "integrity": "sha1-pVxS5McFx2XKIQ6SQqBrvMiqf2Y=", - "dev": true - }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ip-regex": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", - "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "js-base64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", - "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", - "dev": true - }, - "js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "kuler": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-0.0.0.tgz", - "integrity": "sha1-tmu0a5NOVQ9Z2BiEjgq7pPf1VTw=", - "dev": true, - "requires": { - "colornames": "0.0.2" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "liftoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", - "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^2.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": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "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": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - }, - "dependencies": { - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - } - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true - }, - "lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", - "dev": true, - "requires": { - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash.restparam": "^3.0.0" - } - }, - "lodash._escapehtmlchar": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", - "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", - "dev": true, - "requires": { - "lodash._htmlescapes": "~2.4.1" - } - }, - "lodash._escapestringchar": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", - "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._htmlescapes": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", - "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._isnative": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=", - "dev": true - }, - "lodash._objecttypes": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", - "dev": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", - "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", - "dev": true - }, - "lodash._reunescapedhtml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", - "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", - "dev": true, - "requires": { - "lodash._htmlescapes": "~2.4.1", - "lodash.keys": "~2.4.1" - } - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, - "lodash._shimkeys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", - "dev": true, - "requires": { - "lodash._objecttypes": "~2.4.1" - } - }, - "lodash.assign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", - "dev": true, - "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._createassigner": "^3.0.0", - "lodash.keys": "^3.0.0" - }, - "dependencies": { - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - } - } - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.defaults": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", - "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", - "dev": true, - "requires": { - "lodash._objecttypes": "~2.4.1", - "lodash.keys": "~2.4.1" - } - }, - "lodash.escape": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", - "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", - "dev": true, - "requires": { - "lodash._escapehtmlchar": "~2.4.1", - "lodash._reunescapedhtml": "~2.4.1", - "lodash.keys": "~2.4.1" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.isobject": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", - "dev": true, - "requires": { - "lodash._objecttypes": "~2.4.1" - } - }, - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "dev": true, - "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.template": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", - "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", - "dev": true, - "requires": { - "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": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", - "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", - "dev": true, - "requires": { - "lodash._reinterpolate": "~2.4.1", - "lodash.escape": "~2.4.1" - } - }, - "lodash.values": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", - "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", - "dev": true, - "requires": { - "lodash.keys": "~2.4.1" - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - }, - "main-bower-files": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/main-bower-files/-/main-bower-files-2.7.0.tgz", - "integrity": "sha1-UkRpQ+FxyLHz0apN5t0wgMwdv3g=", - "dev": true, - "requires": { - "colors": "^0.6.2", - "glob": "^4.0.3", - "globule": "^0.2.0", - "minimatch": "^1.0.0", - "strip-json-comments": "^1.0.2", - "vinyl-fs": "^1.0.0" - }, - "dependencies": { - "glob-stream": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-4.1.1.tgz", - "integrity": "sha1-uELfENaIx+trz869hG84UilrMgA=", - "dev": true, - "requires": { - "glob": "^4.3.1", - "glob2base": "^0.0.12", - "minimatch": "^2.0.1", - "ordered-read-streams": "^0.1.0", - "through2": "^0.6.1", - "unique-stream": "^2.0.2" - }, - "dependencies": { - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - } - } - }, - "glob-watcher": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.8.tgz", - "integrity": "sha1-aK62Yefizo02NDgbLsQV8AxrwqQ=", - "dev": true, - "requires": { - "gaze": "^0.5.1" - } - }, - "globule": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.2.0.tgz", - "integrity": "sha1-JrZNEOHtyrYJjY/gC9K3PMoIqPs=", - "dev": true, - "requires": { - "glob": "~3.2.7", - "lodash": "~2.4.1", - "minimatch": "~0.2.11" - }, - "dependencies": { - "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "dev": true, - "requires": { - "inherits": "2", - "minimatch": "0.3" - }, - "dependencies": { - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } - } - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } - } - }, - "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "dev": true, - "requires": { - "natives": "^1.1.0" - } - }, - "minimatch": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", - "integrity": "sha1-4N0hILSeG3JM6NcUxSCCKpQ4V20=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - }, - "strip-bom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", - "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", - "dev": true, - "requires": { - "first-chunk-stream": "^1.0.0", - "is-utf8": "^0.2.0" - } - }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "vinyl-fs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-1.0.0.tgz", - "integrity": "sha1-0VdS5owtrXQ2Tn6FNHNzU1RpLt8=", - "dev": true, - "requires": { - "duplexify": "^3.2.0", - "glob-stream": "^4.0.1", - "glob-watcher": "^0.0.8", - "graceful-fs": "^3.0.0", - "merge-stream": "^0.1.7", - "mkdirp": "^0.5.0", - "object-assign": "^2.0.0", - "strip-bom": "^1.0.0", - "through2": "^0.6.1", - "vinyl": "^0.4.0" - } - } - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "memoizee": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.3.10.tgz", - "integrity": "sha1-TsoNiu057J0Bf0xcLy9kMvQuXI8=", - "dev": true, - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.11", - "es6-weak-map": "~0.1.4", - "event-emitter": "~0.3.4", - "lru-queue": "0.1", - "next-tick": "~0.2.2", - "timers-ext": "0.1" - }, - "dependencies": { - "next-tick": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", - "integrity": "sha1-ddpKkn7liH45BliABltzNkE7MQ0=", - "dev": true - } - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - } - } - }, - "merge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", - "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", - "dev": true - }, - "merge-stream": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-0.1.8.tgz", - "integrity": "sha1-SKB7O0oSHXSj7b/c20sIrb8CQLE=", - "dev": true, - "requires": { - "through2": "^0.6.1" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "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" - } - }, - "mime-db": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", - "dev": true - }, - "mime-types": { - "version": "2.1.22", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", - "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", - "dev": true, - "requires": { - "mime-db": "~1.38.0" - } - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "minimize": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/minimize/-/minimize-1.8.1.tgz", - "integrity": "sha1-o2dK3pPyinX/ojuODzZc3CPWnYs=", - "dev": true, - "requires": { - "argh": "~0.1.4", - "async": "~1.5.2", - "cli-color": "~1.1.0", - "diagnostics": "~1.0.1", - "emits": "~3.0.0", - "htmlparser2": "~3.9.0", - "node-uuid": "~1.4.7" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } - } - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" - }, - "dependencies": { - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - } - }, - "nan": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", - "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "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" - } - }, - "natives": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", - "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "ng-annotate": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ng-annotate/-/ng-annotate-1.2.2.tgz", - "integrity": "sha1-3D/FG6Cy+LOF2+BH9NoG9YCh/WE=", - "dev": true, - "requires": { - "acorn": "~2.6.4", - "alter": "~0.2.0", - "convert-source-map": "~1.1.2", - "optimist": "~0.6.1", - "ordered-ast-traverse": "~1.1.1", - "simple-fmt": "~0.1.0", - "simple-is": "~0.2.0", - "source-map": "~0.5.3", - "stable": "~0.1.5", - "stringmap": "~0.2.2", - "stringset": "~0.2.1", - "tryor": "~0.1.2" - }, - "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true - } - } - }, - "ng-dependencies": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ng-dependencies/-/ng-dependencies-0.1.3.tgz", - "integrity": "sha1-Ml5PxSHbrnCGazM4FTR1TBeRapQ=", - "dev": true, - "requires": { - "esprima": "^1.2.2", - "estraverse": "^1.5.1", - "sugar": "^1.4.1" - } - }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } - } - }, - "node-sass": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-3.13.1.tgz", - "integrity": "sha1-ckD7v/I5YwS0IjUn7TAgWJwAT8I=", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash.assign": "^4.2.0", - "lodash.clonedeep": "^4.3.2", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.3.2", - "node-gyp": "^3.3.1", - "npmlog": "^4.0.0", - "request": "^2.61.0", - "sass-graph": "^2.1.1" - }, - "dependencies": { - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", - "dev": true - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "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": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - } - } - }, - "orchestrator": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", - "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", - "dev": true, - "requires": { - "end-of-stream": "~0.1.5", - "sequencify": "~0.0.7", - "stream-consume": "~0.1.0" - } - }, - "ordered-ast-traverse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ordered-ast-traverse/-/ordered-ast-traverse-1.1.1.tgz", - "integrity": "sha1-aEOhcLwO7otSDMjdwd3TqjD6BXw=", - "dev": true, - "requires": { - "ordered-esprima-props": "~1.1.0" - } - }, - "ordered-esprima-props": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ordered-esprima-props/-/ordered-esprima-props-1.1.0.tgz", - "integrity": "sha1-qYJwht9fAQqmDpvQK24DNc6i/8s=", - "dev": true - }, - "ordered-read-streams": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", - "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-import": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-import/-/parse-import-2.0.0.tgz", - "integrity": "sha1-KyR0Aw4AirmNt2xLy/TbWucwb18=", - "dev": true, - "requires": { - "get-imports": "^1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "dev": true, - "requires": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "plexer": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/plexer/-/plexer-0.0.3.tgz", - "integrity": "sha1-M00dfNYjJGVBfppmNkkB8pIw9TE=", - "dev": true, - "requires": { - "readable-stream": "^1.0.26-2" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dev": true, - "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - } - }, - "rework-import": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rework-import/-/rework-import-2.1.0.tgz", - "integrity": "sha1-wm7StTFZrHvi7GDaIj74lgPB7x8=", - "dev": true, - "requires": { - "css": "^2.0.0", - "globby": "^2.0.0", - "parse-import": "^2.0.0", - "url-regex": "^3.0.0" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globby": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-2.1.0.tgz", - "integrity": "sha1-npGSvNM/Srak+JTl5+qLcTITxII=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "async": "^1.2.1", - "glob": "^5.0.3", - "object-assign": "^3.0.0" - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - } - } - }, - "rework-plugin-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/rework-plugin-function/-/rework-plugin-function-1.0.2.tgz", - "integrity": "sha1-Es5G+1sptdk1FGaD9rmM9J0jc7k=", - "dev": true, - "requires": { - "rework-visit": "^1.0.0" - } - }, - "rework-plugin-url": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/rework-plugin-url/-/rework-plugin-url-1.1.0.tgz", - "integrity": "sha1-q1PosQV7nV7MHIJz/32xhgg3XEU=", - "dev": true, - "requires": { - "rework-plugin-function": "^1.0.0" - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "run-sequence": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-1.0.2.tgz", - "integrity": "sha1-hBdXc8OGJ+m70gxJab9z70K2tdU=", - "dev": true, - "requires": { - "chalk": "*" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "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" - } - } - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - }, - "sequencify": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", - "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "simple-fmt": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", - "integrity": "sha1-GRv1ZqWeZTBILLJatTtKjchcOms=", - "dev": true - }, - "simple-is": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", - "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "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": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", - "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", - "dev": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "through": "~2.3.4" - } - }, - "stream-consume": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", - "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", - "dev": true - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "stringmap": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", - "integrity": "sha1-VWwTeyWPlCuHdvWy71gqoGnX0bE=", - "dev": true - }, - "stringset": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz", - "integrity": "sha1-7yWcTjSTRDd/zRyRPdLoSMnAQrU=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - }, - "sugar": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sugar/-/sugar-1.5.0.tgz", - "integrity": "sha1-2dP7oQ96iH4G5q37B4onrLH8BVY=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - }, - "ternary-stream": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-1.2.3.tgz", - "integrity": "sha1-8Zafg4R/lkImG8FC4X7iAKrag/0=", - "dev": true, - "requires": { - "duplexer2": "~0.0.2", - "fork-stream": "~0.0.4", - "merge-stream": "~0.1.6", - "through2": "~0.6.3" - } - }, - "text-hex": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-0.0.0.tgz", - "integrity": "sha1-V4+8haapJjbkLdF7QdAhjM6esrM=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "tildify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", - "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0" - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dev": true, - "requires": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toposort": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-0.2.12.tgz", - "integrity": "sha1-x9KYTz1IwhcxXMMtdwiIt3lJHoE=", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "tryor": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", - "integrity": "sha1-gUXkynyv9ArN48z5Rui4u3W0Fys=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "uglify-js": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.2.tgz", - "integrity": "sha1-9QvoikLNOWpiUdxSqzcvccwS/vA=", - "dev": true, - "requires": { - "async": "~0.2.6", - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "uglify-save-license": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz", - "integrity": "sha1-lXJsF8xv0XHDYX479NjYKqjEzOE=", - "dev": true - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "unique-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", - "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url-regex": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", - "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", - "dev": true, - "requires": { - "ip-regex": "^1.0.1" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "^1.1.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - }, - "vinyl-bufferstream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vinyl-bufferstream/-/vinyl-bufferstream-1.0.1.tgz", - "integrity": "sha1-BTeGn1gO/6TKRay0dXnkuf5jCBo=", - "dev": true, - "requires": { - "bufferstreams": "1.0.1" - } - }, - "vinyl-fs": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", - "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", - "dev": true, - "requires": { - "defaults": "^1.0.0", - "glob-stream": "^3.1.5", - "glob-watcher": "^0.0.6", - "graceful-fs": "^3.0.0", - "mkdirp": "^0.5.0", - "strip-bom": "^1.0.0", - "through2": "^0.6.1", - "vinyl": "^0.4.0" - }, - "dependencies": { - "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "dev": true, - "requires": { - "natives": "^1.1.0" - } - }, - "strip-bom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", - "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", - "dev": true, - "requires": { - "first-chunk-stream": "^1.0.0", - "is-utf8": "^0.2.0" - } - } - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.1.4.tgz", - "integrity": "sha1-xfy9Q+LyOEI8LcmL3db3m3K8NFs=", - "dev": true, - "requires": { - "source-map": "^0.1.39" - }, - "dependencies": { - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.8.0.tgz", - "integrity": "sha1-/zsvVqx+vugDl2kCSAh8SCK+xmY=", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - } - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, - "requires": { - "camelcase": "^3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - } - } - } - } -} diff --git a/frontend/public/.htaccess b/frontend/public/.htaccess index 4b29775..bce0799 100644 --- a/frontend/public/.htaccess +++ b/frontend/public/.htaccess @@ -3,12 +3,6 @@ RewriteEngine On # Put this in vhost configuration: # RequestHeader set X-Prerender-Token "YOUR_PRERENDER_TOKEN" - - RewriteCond %{HTTP_USER_AGENT} baiduspider|facebookexternalhit|twitterbot|rogerbot|linkedinbot|embedly|quora\ link\ preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator [NC,OR] - RewriteCond %{QUERY_STRING} _escaped_fragment_ - RewriteRule ^(?!.*?(\.js|\.css|\.xml|\.less|\.png|\.jpg|\.jpeg|\.gif|\.pdf|\.doc|\.txt|\.ico|\.rss|\.zip|\.mp3|\.rar|\.exe|\.wmv|\.doc|\.avi|\.ppt|\.mpg|\.mpeg|\.tif|\.wav|\.mov|\.psd|\.ai|\.xls|\.mp4|\.m4a|\.swf|\.dat|\.dmg|\.iso|\.flv|\.m4v|\.torrent|\.ttf|\.woff))(.*) http://service.prerender.io/https://gitexercises.fracz.com/$2 [P,L] - - # /index.php to / RewriteCond %{THE_REQUEST} ^.*/index\.php RewriteRule ^(.*)index.php$ /$1 [R=301,L] From a36bd878b37640194d3a7aae19d24b98493c3d1f Mon Sep 17 00:00:00 2001 From: marijnl Date: Thu, 3 Sep 2020 15:33:23 +0200 Subject: [PATCH 16/83] start command with custom domain --- docker/Dockerfile | 2 ++ docker/docker-compose.yml | 2 ++ frontend/app/home/startCommands.coffee | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 759835f..041d0b5 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -42,6 +42,8 @@ RUN mkdir git \ && ln -s /var/www/website/backend/hook/hook.php /var/www/git/exercises.git/hooks/update \ && cp /var/www/website/docker/git-config git/exercises.git/config +RUN sed -i '/REPLACE_ME/http://${DOMAIN_NAME}/' /var/www/website/app/home/startCommands.coffee + WORKDIR /var/www/git/exercises.git RUN git checkout master && git branch -D verifications diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 7c66242..bc7048a 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -24,6 +24,8 @@ services: restart: unless-stopped image: mysql networks: [default] + ports: + - "3306:3306" environment: MYSQL_ALLOW_EMPTY_PASSWORD: "true" MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} diff --git a/frontend/app/home/startCommands.coffee b/frontend/app/home/startCommands.coffee index 53aff71..4d105ef 100644 --- a/frontend/app/home/startCommands.coffee +++ b/frontend/app/home/startCommands.coffee @@ -3,7 +3,7 @@ angular.module('git-exercises').directive 'startCommands', -> scope: yes link: ($scope) -> $scope.commands = -> - """git clone https://gitexercises.fracz.com/git/exercises.git + """git clone REPLACE_ME/git/exercises.git cd exercises git config user.name "#{$scope.you?.name?.replace(/"/g, '\\"') or 'Your name here'}" git config user.email "#{ $scope.you?.email?.replace(/"/g, '\\"') or 'Your e-mail here'}" From c1e427153e2a7d07d3e8c3fc2c0e39383505e8fd Mon Sep 17 00:00:00 2001 From: marijnl Date: Thu, 3 Sep 2020 16:04:50 +0200 Subject: [PATCH 17/83] forgot to change env var --- docker/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index bc7048a..0e75ee9 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -31,7 +31,7 @@ services: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} MYSQL_DATABASE: ${DB_NAME} MYSQL_USER: ${DB_USER} - MYSQL_PASSWORD: ${DATABASE_PASSWORD} + MYSQL_PASSWORD: ${DB_PASSWORD} volumes: - ${VOLUME_DATA}/mysql:/var/lib/mysql:z logging: From 7cf21c5f952d58ed47962526068da50e34a7fa7b Mon Sep 17 00:00:00 2001 From: marijnl Date: Thu, 3 Sep 2020 18:14:14 +0200 Subject: [PATCH 18/83] find replace domain name to match .env file --- README.md | 5 ++++- docker/Dockerfile | 3 ++- docker/docker-compose.yml | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 276e026..7d20c5a 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,10 @@ To execute these instructions do ```bash # login to mysql running in docker container -mysql -h localhost -P 3306 --protocol=tcp -u root +mysql -h localhost -P 3306 --protocol=tcp -u root +# in mysql shell +CREATE DATABASE ; +USE ; # run the sql file source 'backend/schema/gitexercises.sql' diff --git a/docker/Dockerfile b/docker/Dockerfile index 041d0b5..cc1a64e 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -33,6 +33,7 @@ ADD ./apache-conf/000-default.conf /etc/apache2/sites-available RUN a2enmod rewrite expires deflate ssl cgi alias env headers ARG GIT_REPO +ARG DOMAIN_NAME RUN mkdir git \ && touch v4 \ @@ -42,7 +43,7 @@ RUN mkdir git \ && ln -s /var/www/website/backend/hook/hook.php /var/www/git/exercises.git/hooks/update \ && cp /var/www/website/docker/git-config git/exercises.git/config -RUN sed -i '/REPLACE_ME/http://${DOMAIN_NAME}/' /var/www/website/app/home/startCommands.coffee +RUN sed -i -r "s|REPLACE_ME|http:\/\/${DOMAIN_NAME}|g" /var/www/website/frontend/app/home/startCommands.coffee WORKDIR /var/www/git/exercises.git RUN git checkout master && git branch -D verifications diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 0e75ee9..b9ad757 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -13,6 +13,7 @@ services: context: . args: GIT_REPO: ${GIT_REPO} + DOMAIN_NAME: ${DOMAIN_NAME} depends_on: - gitexercises-db logging: From 650fd637284a016a5d9e8279afc2955efa4152f5 Mon Sep 17 00:00:00 2001 From: Egor Suvorov Date: Sun, 17 Nov 2019 12:41:40 +0300 Subject: [PATCH 19/83] Make configure.sh work with i18n git by requiring POSIX locale. --- configure.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.sh b/configure.sh index 6f6ab9f..4a2495f 100755 --- a/configure.sh +++ b/configure.sh @@ -1,10 +1,10 @@ #!/usr/bin/env bash # Configure "git start" local alias for starting the exercise of user's choice and restarting the current one. -git config alias.start "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if [ \$exercise != next ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null ; then if echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1; then echo \"Exercise \$exercise started!\" && echo 'Read the README.md for instructions or view them in browser:' && echo \"http://gitexercises.fracz.com/e/\$exercise\" ; else echo 'Could not execute the start script.' && echo 'Try running the ./start.sh script yourself.' ; fi else echo 'Could not clean the working directory.' && echo 'Make sure that none of the files inside the working directory' && echo 'is used by another process and run git start again.'; fi else echo \"Invalid exercise: \$exercise\" && false; fi else git push origin master:next-exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g' | xargs git start | grep -v Invalid || echo 'You have passed all exercises!'; fi else echo 'You need to use git start in detached HEAD'; fi }; f" +git config alias.start "! f() { export LC_ALL=C; currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if [ \$exercise != next ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null ; then if echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1; then echo \"Exercise \$exercise started!\" && echo 'Read the README.md for instructions or view them in browser:' && echo \"http://gitexercises.fracz.com/e/\$exercise\" ; else echo 'Could not execute the start script.' && echo 'Try running the ./start.sh script yourself.' ; fi else echo 'Could not clean the working directory.' && echo 'Make sure that none of the files inside the working directory' && echo 'is used by another process and run git start again.'; fi else echo \"Invalid exercise: \$exercise\" && false; fi else git push origin master:next-exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g' | xargs git start | grep -v Invalid || echo 'You have passed all exercises!'; fi else echo 'You need to use git start in detached HEAD'; fi }; f" # Add "git verify" local alias for submitting exercises solutions. -git config alias.verify "! f() { currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if ! git status | grep 'up-to-date' >/dev/null 2>&1 ; then if echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | sed 's/remote: //g' | grep -v \"\\*\\*\" ; then : ; else echo 'Solution could not be verified - push failed.' && echo 'Do you have an internet connection?'; fi else echo \"You haven't made any progress on exercise \$exercise.\" && echo 'Did you forget to commit your changes?'; fi else echo \"Invalid exercise: \$exercise\"; fi else echo 'You need to use git verify in detached HEAD'; fi }; f" +git config alias.verify "! f() { export LC_ALL=C; currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if ! git status | grep 'up-to-date' >/dev/null 2>&1 ; then if echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | sed 's/remote: //g' | grep -v \"\\*\\*\" ; then : ; else echo 'Solution could not be verified - push failed.' && echo 'Do you have an internet connection?'; fi else echo \"You haven't made any progress on exercise \$exercise.\" && echo 'Did you forget to commit your changes?'; fi else echo \"Invalid exercise: \$exercise\"; fi else echo 'You need to use git verify in detached HEAD'; fi }; f" # Add "git exercises" alias that shows list of available exercises. git config alias.exercises "! git push origin master:exercises 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g'" From 6bd8f8f14d9567cca555be0ead62d571086043ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Fr=C4=85cz?= Date: Wed, 21 Apr 2021 13:56:02 +0200 Subject: [PATCH 20/83] Add --local to git config commands in configure.sh ref #28 --- configure.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/configure.sh b/configure.sh index 4a2495f..d2e6245 100755 --- a/configure.sh +++ b/configure.sh @@ -1,16 +1,16 @@ #!/usr/bin/env bash # Configure "git start" local alias for starting the exercise of user's choice and restarting the current one. -git config alias.start "! f() { export LC_ALL=C; currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if [ \$exercise != next ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null ; then if echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1; then echo \"Exercise \$exercise started!\" && echo 'Read the README.md for instructions or view them in browser:' && echo \"http://gitexercises.fracz.com/e/\$exercise\" ; else echo 'Could not execute the start script.' && echo 'Try running the ./start.sh script yourself.' ; fi else echo 'Could not clean the working directory.' && echo 'Make sure that none of the files inside the working directory' && echo 'is used by another process and run git start again.'; fi else echo \"Invalid exercise: \$exercise\" && false; fi else git push origin master:next-exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g' | xargs git start | grep -v Invalid || echo 'You have passed all exercises!'; fi else echo 'You need to use git start in detached HEAD'; fi }; f" +git config --local alias.start "! f() { export LC_ALL=C; currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if [ \$exercise != next ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null ; then if echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1; then echo \"Exercise \$exercise started!\" && echo 'Read the README.md for instructions or view them in browser:' && echo \"http://gitexercises.fracz.com/e/\$exercise\" ; else echo 'Could not execute the start script.' && echo 'Try running the ./start.sh script yourself.' ; fi else echo 'Could not clean the working directory.' && echo 'Make sure that none of the files inside the working directory' && echo 'is used by another process and run git start again.'; fi else echo \"Invalid exercise: \$exercise\" && false; fi else git push origin master:next-exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g' | xargs git start | grep -v Invalid || echo 'You have passed all exercises!'; fi else echo 'You need to use git start in detached HEAD'; fi }; f" # Add "git verify" local alias for submitting exercises solutions. -git config alias.verify "! f() { export LC_ALL=C; currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if ! git status | grep 'up-to-date' >/dev/null 2>&1 ; then if echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | sed 's/remote: //g' | grep -v \"\\*\\*\" ; then : ; else echo 'Solution could not be verified - push failed.' && echo 'Do you have an internet connection?'; fi else echo \"You haven't made any progress on exercise \$exercise.\" && echo 'Did you forget to commit your changes?'; fi else echo \"Invalid exercise: \$exercise\"; fi else echo 'You need to use git verify in detached HEAD'; fi }; f" +git config --local alias.verify "! f() { export LC_ALL=C; currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if ! git status | grep 'up-to-date' >/dev/null 2>&1 ; then if echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | sed 's/remote: //g' | grep -v \"\\*\\*\" ; then : ; else echo 'Solution could not be verified - push failed.' && echo 'Do you have an internet connection?'; fi else echo \"You haven't made any progress on exercise \$exercise.\" && echo 'Did you forget to commit your changes?'; fi else echo \"Invalid exercise: \$exercise\"; fi else echo 'You need to use git verify in detached HEAD'; fi }; f" # Add "git exercises" alias that shows list of available exercises. -git config alias.exercises "! git push origin master:exercises 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g'" +git config --local alias.exercises "! git push origin master:exercises 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g'" # Make sure you have a "current" push strategy set; this will allow you to push only current exercise with simple git # push command instead of pushing all matching branches (default in Git < 2.0) -git config push.default current +git config --local push.default current echo "OK" From 2c87595f0b43d6c7a5c123b93eb77f1ad25557dd Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:26 -0400 Subject: [PATCH 21/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 872d449..8bcb34e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ -# git-exercises +# exercices git + + +Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. -This repository contains the source code of the [git-exercises](https://gitexercises.fracz.com/) platform for practising git. ![git-exercises](frontend/public/images/intro.gif) From 7a191f7073e454eebffe50365e5a57c9d0690115 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:27 -0400 Subject: [PATCH 22/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 8bcb34e..8719657 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ # exercices git + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. + ![git-exercises](frontend/public/images/intro.gif) From 02d4eb285eb67124a58deb9610ee7e988084e208 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:27 -0400 Subject: [PATCH 23/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 8719657..2e74703 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,10 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. + ![git-exercises](frontend/public/images/intro.gif) From 75b1d4f1c4c680b1ba7c88e026303b0d721c7580 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:27 -0400 Subject: [PATCH 24/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2e74703..2bd4ef9 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,11 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. + ![git-exercises](frontend/public/images/intro.gif) From bbee630d8b422e543a373bfbddc1095fb9bef4d4 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:28 -0400 Subject: [PATCH 25/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2bd4ef9..a9aae68 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,12 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. + ![git-exercises](frontend/public/images/intro.gif) From 55fc3ae6fa7136e2b4f2e52c930800fa0d4346b1 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:28 -0400 Subject: [PATCH 26/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a9aae68..7e415fc 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -12,4 +13,5 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From b8ced305a682859ae07f2fad6da5e9f47d72d1e2 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:28 -0400 Subject: [PATCH 27/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7e415fc..28a2310 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -14,4 +15,5 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From a6b23b8eeb6e5d64d45db77fbad5eee2e7f2c72c Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:28 -0400 Subject: [PATCH 28/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 28a2310..bb66dc4 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -16,4 +17,5 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From c977c280d410958fc29a46ed7544e7dd1a4589ff Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:28 -0400 Subject: [PATCH 29/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index bb66dc4..43bd474 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -18,4 +19,5 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From a5b4b3514d5782d1e0f90f1ace9d41bae6c5e491 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:28 -0400 Subject: [PATCH 30/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 43bd474..16ee6b6 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -20,4 +21,5 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From 50ebfd926aec7afefd86f85b3d376854f74a5b59 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:29 -0400 Subject: [PATCH 31/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 16ee6b6..1478e33 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -22,4 +23,5 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From 6e04295549d71cfa1672741e078c3cb1f9367f43 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:29 -0400 Subject: [PATCH 32/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 1478e33..17e6656 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -24,4 +25,5 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From a1277e8875ddf9978e51f914a9d55a18f08f3aaf Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:29 -0400 Subject: [PATCH 33/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 17e6656..e3b9f21 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -26,4 +27,5 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From 0eed62642b60b27e4b328ab52ec6be51a45686ad Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:29 -0400 Subject: [PATCH 34/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e3b9f21..02468e9 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -28,4 +29,5 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From ec13c4a52576a39d52607cd98d6a30b39176c107 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:29 -0400 Subject: [PATCH 35/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 02468e9..7fdfa92 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -30,4 +31,5 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From ee582f4e6b6fea48c51658fd6cf848b7ac163d0b Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:29 -0400 Subject: [PATCH 36/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7fdfa92..73cde1c 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -32,4 +33,5 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From 3ecfc3a03ea621701075b4bfd87c5bf5041809b3 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:30 -0400 Subject: [PATCH 37/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 73cde1c..870d590 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -34,4 +35,5 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From 833743186a786c80f83f095d11c32f5e765c75ef Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:30 -0400 Subject: [PATCH 38/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 870d590..2c3810e 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -36,4 +37,5 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From a73e4b2ef91b58c2d5e866bb23c4b6e5ccb5f270 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:30 -0400 Subject: [PATCH 39/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2c3810e..5994f5d 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -38,4 +39,5 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From ac2966c134b19b31d9ff8a3141c40831df105c9e Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:30 -0400 Subject: [PATCH 40/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5994f5d..a332c32 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -39,5 +40,6 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From 1eecea3338fa60b2342f90dacac4256db7a9ec8e Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:30 -0400 Subject: [PATCH 41/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a332c32..843a456 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -40,6 +41,7 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From eb0ec62399edd8f74609c11e6688d1e5739b039c Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:30 -0400 Subject: [PATCH 42/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 843a456..78f39dd 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -42,6 +43,7 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From cad80f5a6f36f2b092326e9f72854aede83e0600 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:31 -0400 Subject: [PATCH 43/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 78f39dd..6a007ad 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -44,6 +45,7 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From 8778d0b334fd478c353b5454a4685cf34717a0df Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 23 Aug 2022 20:31:53 -0400 Subject: [PATCH 44/83] =?UTF-8?q?Traduction=20fran=C3=A7aise=20automatique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 6a007ad..d505501 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ + Ce dépôt contient le code source de la plateforme [git-exercises](https://gitexercises.fracz.com/) pour pratiquer git. @@ -46,6 +47,7 @@ Ce dépôt contient le code source de la plateforme [git-exercises](https://gite + ![git-exercises](frontend/public/images/intro.gif) From 9ab6f83ce9310ad887f170d453cfaff6542528df Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 27 Dec 2022 13:52:25 -0500 Subject: [PATCH 45/83] Merge from marijnl --- docker/.env | 9 ++++----- docker/Dockerfile | 40 ++++++++++++++++++++------------------- docker/docker-compose.yml | 3 ++- frontend/package.json | 5 ++++- 4 files changed, 31 insertions(+), 26 deletions(-) diff --git a/docker/.env b/docker/.env index e15fe1d..4e8e4f3 100644 --- a/docker/.env +++ b/docker/.env @@ -2,11 +2,10 @@ COMPOSE_PROJECT_NAME=gitexercises # MYSQL CONFIG -VOLUME_DATA=../var -DB_HOST = 'gitexercises-db' # this refers to the docker hostname -DB_NAME = 'gitexercises' -DB_USER = 'root' -DB_PASSWORD = '' # for safety consider setting a passwd, note that you mannually need to change the mysql root password accordingly +DB_HOST='gitexercises-db' # this refers to the docker hostname +DB_NAME='gitexercises' +DB_USER='root' +DB_PASSWORD='' # for safety consider setting a passwd, note that you mannually need to change the mysql root password accordingly # YOUR GIT REPO GIT_REPO=https://github.com/marijnl/git-exercises.git diff --git a/docker/Dockerfile b/docker/Dockerfile index cc1a64e..d3052f6 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,10 +1,12 @@ -FROM php:7.1.26-apache +FROM php:7.4.33-apache + WORKDIR /var/www -RUN apt-get update \ - && curl -sL https://deb.nodesource.com/setup_6.x | bash - \ - && apt-get install -y --no-install-recommends \ +RUN curl -sL https://deb.nodesource.com/setup_16.x | bash - + +RUN apt-get update +RUN apt-get install -y --no-install-recommends \ libicu-dev \ libpq-dev \ ca-certificates \ @@ -13,28 +15,31 @@ RUN apt-get update \ git \ unzip \ nodejs \ - zlib1g-dev \ - nano \ - iputils-ping \ - mysql-server \ - && update-ca-certificates \ - && docker-php-ext-install \ + libzip-dev + +RUN update-ca-certificates +RUN docker-php-ext-install \ pdo_mysql \ opcache \ curl \ - zip \ - && apt-get autoremove \ - && rm -r /var/lib/apt/lists/* \ - && curl -s https://getcomposer.org/installer | php \ - && mv composer.phar /usr/local/bin/composer + zip -ADD ./apache-conf/000-default.conf /etc/apache2/sites-available +RUN apt-get autoremove \ + && rm -r /var/lib/apt/lists/* RUN a2enmod rewrite expires deflate ssl cgi alias env headers ARG GIT_REPO ARG DOMAIN_NAME +RUN mkdir /var/www/website/ + +COPY ./frontend /var/www/website/frontend +COPY ./backend /var/www/website/backend + +WORKDIR /var/www/website/backend +RUN composer install + RUN mkdir git \ && touch v4 \ && mkdir workingarea \ @@ -48,9 +53,6 @@ RUN sed -i -r "s|REPLACE_ME|http:\/\/${DOMAIN_NAME}|g" /var/www/website/fronten WORKDIR /var/www/git/exercises.git RUN git checkout master && git branch -D verifications -WORKDIR /var/www/website/backend -RUN composer install - WORKDIR /var/www/website/frontend RUN npm install diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index b9ad757..aa13ffd 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -34,7 +34,8 @@ services: MYSQL_USER: ${DB_USER} MYSQL_PASSWORD: ${DB_PASSWORD} volumes: - - ${VOLUME_DATA}/mysql:/var/lib/mysql:z + - /var/lib/mysql + - ../backend/schema/gitexercises.sql:/docker-entrypoint-initdb.d/gitexercises.sql logging: options: max-size: 50m diff --git a/frontend/package.json b/frontend/package.json index 9508ff8..f96ac72 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -4,7 +4,10 @@ "scripts": { "dist": "gulp --production" }, - "devDependencies": { + "overrides": { + "graceful-fs": "^4.2.10" + }, + "devDpendencies": { "coffee-script": "1.9.3", "del": "1.1.1", "gulp": "3.9.1", From f43f071d737da5643ec2dbd602ff1bbb51506251 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Fr=C4=85cz?= Date: Wed, 21 Apr 2021 14:20:48 +0200 Subject: [PATCH 46/83] Fix detecting if any progress was made in the exercise --- README.md | 6 +++--- configure.sh | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 359bca4..3857de2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -## Push a commit you have made +## Pousser un commit -The first exercise is to push a commit that is created when you run the `git start` command. +Le premier exercice consiste à pousser un commit qui a été automatiquement créé par la commande `git start`. -Just try `git verify` after you have initialized the exercises and be proud of passing the first one :-) +Essayez `git verify` après avoir initialisé l'exercice et réjoùissez-vous de votre premier succès! diff --git a/configure.sh b/configure.sh index d2e6245..99e4beb 100755 --- a/configure.sh +++ b/configure.sh @@ -4,7 +4,7 @@ git config --local alias.start "! f() { export LC_ALL=C; currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if [ \$exercise != next ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if git checkout -f \$exercise >/dev/null 2>&1 && git reset --hard origin/\$exercise >/dev/null 2>&1 && git clean -fdx >/dev/null ; then if echo \"Preparing the exercise environment, hold on...\" && ./start.sh >/dev/null 2>&1; then echo \"Exercise \$exercise started!\" && echo 'Read the README.md for instructions or view them in browser:' && echo \"http://gitexercises.fracz.com/e/\$exercise\" ; else echo 'Could not execute the start script.' && echo 'Try running the ./start.sh script yourself.' ; fi else echo 'Could not clean the working directory.' && echo 'Make sure that none of the files inside the working directory' && echo 'is used by another process and run git start again.'; fi else echo \"Invalid exercise: \$exercise\" && false; fi else git push origin master:next-exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g' | xargs git start | grep -v Invalid || echo 'You have passed all exercises!'; fi else echo 'You need to use git start in detached HEAD'; fi }; f" # Add "git verify" local alias for submitting exercises solutions. -git config --local alias.verify "! f() { export LC_ALL=C; currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if ! git status | grep 'up-to-date' >/dev/null 2>&1 ; then if echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | sed 's/remote: //g' | grep -v \"\\*\\*\" ; then : ; else echo 'Solution could not be verified - push failed.' && echo 'Do you have an internet connection?'; fi else echo \"You haven't made any progress on exercise \$exercise.\" && echo 'Did you forget to commit your changes?'; fi else echo \"Invalid exercise: \$exercise\"; fi else echo 'You need to use git verify in detached HEAD'; fi }; f" +git config --local alias.verify "! f() { export LC_ALL=C; currentBranch=\$(git rev-parse --abbrev-ref HEAD); exercise=\${1-\$currentBranch}; if [ \$exercise != HEAD ]; then if git show origin/\$exercise:start.sh >/dev/null 2>&1 ; then if ! (git status | grep 'up-to-date' >/dev/null 2>&1 || git status | grep 'up to date' >/dev/null 2>&1) ; then if echo \"Verifying the \$exercise exercise. Hold on...\" && git push -f origin HEAD:\$exercise 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | sed 's/remote: //g' | grep -v \"\\*\\*\" ; then : ; else echo 'Solution could not be verified - push failed.' && echo 'Do you have an internet connection?'; fi else echo \"You haven't made any progress on exercise \$exercise.\" && echo 'Did you forget to commit your changes?'; fi else echo \"Invalid exercise: \$exercise\"; fi else echo 'You need to use git verify in detached HEAD'; fi }; f" # Add "git exercises" alias that shows list of available exercises. git config --local alias.exercises "! git push origin master:exercises 2>&1 | sed -n '/\\*\\*\\*/,/\\*\\*\\*/p' | grep -v '\\*\\*' | sed 's/remote: //g'" From caa93acf07a23c6725c71ded5aa2b88e7fa6a6b5 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 27 Dec 2022 19:24:09 -0500 Subject: [PATCH 47/83] Renamed env-file --- docker/{.env => env.example} | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) rename docker/{.env => env.example} (55%) diff --git a/docker/.env b/docker/env.example similarity index 55% rename from docker/.env rename to docker/env.example index 4e8e4f3..8bce9fe 100644 --- a/docker/.env +++ b/docker/env.example @@ -2,12 +2,14 @@ COMPOSE_PROJECT_NAME=gitexercises # MYSQL CONFIG -DB_HOST='gitexercises-db' # this refers to the docker hostname +# this refers to the docker hostname +DB_HOST='gitexercises-db' DB_NAME='gitexercises' DB_USER='root' -DB_PASSWORD='' # for safety consider setting a passwd, note that you mannually need to change the mysql root password accordingly +# for safety consider setting a passwd, note that you mannually need to change the mysql root password accordingly +DB_PASSWORD='' -# YOUR GIT REPO +# YOUR GIT EXERCISES REPO GIT_REPO=https://github.com/marijnl/git-exercises.git # EXPOSE HTTP SERVICE ON PORT From 0a1626f71bc38290d4f91b41e7e5f77f4f8e7e11 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Tue, 27 Dec 2022 19:26:24 -0500 Subject: [PATCH 48/83] Typo --- frontend/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/package.json b/frontend/package.json index f96ac72..483a11e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -7,7 +7,7 @@ "overrides": { "graceful-fs": "^4.2.10" }, - "devDpendencies": { + "devDependencies": { "coffee-script": "1.9.3", "del": "1.1.1", "gulp": "3.9.1", From 286b010ad447f70f5f8a0c3e6c89c74d9992110f Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Wed, 28 Dec 2022 00:08:37 -0500 Subject: [PATCH 49/83] Updated building mecanism --- backend/composer.json | 2 +- backend/hook/hook.php | 6 +-- backend/services/ExerciseUtils.php | 2 +- docker/Dockerfile | 76 +++++++++++++++++------------- docker/docker-compose.yml | 21 ++++----- 5 files changed, 58 insertions(+), 49 deletions(-) diff --git a/backend/composer.json b/backend/composer.json index 24d23aa..87814a8 100644 --- a/backend/composer.json +++ b/backend/composer.json @@ -1,5 +1,5 @@ { - "name": "git-exercises", + "name": "fracz/git-exercises", "require": { "php": ">=5.5", "slim/slim": "2.6.2", diff --git a/backend/hook/hook.php b/backend/hook/hook.php index d5ef067..834e9bc 100755 --- a/backend/hook/hook.php +++ b/backend/hook/hook.php @@ -8,6 +8,7 @@ ini_set("error_log", __DIR__ . "/../data/logs/hook-error.log"); require __DIR__ . '/../vendor/autoload.php'; +require __DIR__ . '/../config.php'; use GitExercises\hook\utils\ConsoleUtils; use GitExercises\hook\utils\GitUtils; @@ -15,7 +16,7 @@ use GitExercises\services\GamificationService; use GitExercises\services\ShortIdService; -define('DOMAIN', 'http://' + getenv("DOMAIN_NAME")); +define('DOMAIN', 'http://' . DOMAIN_NAME); $branch = $argv[1]; $oldRev = $argv[2]; @@ -38,9 +39,6 @@ $possibleCommand = ucfirst(AbstractVerification::dashToCamelCase($exercise)); $command = 'GitExercises\\hook\\commands\\' . $possibleCommand . 'Command'; -echo "just added \n"; -echo $command; - if (class_exists($command)) { (new $command())->execute($committerId); } else { diff --git a/backend/services/ExerciseUtils.php b/backend/services/ExerciseUtils.php index 97e9b11..7c0d42a 100644 --- a/backend/services/ExerciseUtils.php +++ b/backend/services/ExerciseUtils.php @@ -35,7 +35,7 @@ public static function getExerciseHint($id) private static function getExerciseReadmeContent($id) { - exec("git show remotes/origin/$id:README.md", $contents); + exec("cd ". __DIR__ ."/../../../git/exercises.git && git show $id:README.md", $contents); return $contents; } diff --git a/docker/Dockerfile b/docker/Dockerfile index d3052f6..e74423e 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,9 +1,28 @@ -FROM php:7.4.33-apache +# Backend build stage +FROM composer:latest AS backend_build +COPY backend/composer.json /var/www/ +RUN composer install -d /var/www/ -WORKDIR /var/www +# Frontend build stage +FROM node:lts-alpine as frontend_build +ARG DOMAIN_NAME + +RUN apk add git -RUN curl -sL https://deb.nodesource.com/setup_16.x | bash - +COPY frontend /app/ +RUN sed -i -r "s|REPLACE_ME|https:\/\/${DOMAIN_NAME}|g" /app/app/home/startCommands.coffee + +WORKDIR /app + +RUN npm install +RUN npm install bower -g + +RUN bower --allow-root install +RUN npm run-script dist + +# Production stage +FROM php:7.4.33-apache RUN apt-get update RUN apt-get install -y --no-install-recommends \ @@ -14,7 +33,6 @@ RUN apt-get install -y --no-install-recommends \ libcurl4-gnutls-dev \ git \ unzip \ - nodejs \ libzip-dev RUN update-ca-certificates @@ -27,42 +45,36 @@ RUN docker-php-ext-install \ RUN apt-get autoremove \ && rm -r /var/lib/apt/lists/* +COPY ./docker/apache-conf/000-default.conf /etc/apache2/sites-enabled/000-default.conf RUN a2enmod rewrite expires deflate ssl cgi alias env headers ARG GIT_REPO -ARG DOMAIN_NAME - -RUN mkdir /var/www/website/ - -COPY ./frontend /var/www/website/frontend -COPY ./backend /var/www/website/backend - -WORKDIR /var/www/website/backend -RUN composer install -RUN mkdir git \ - && touch v4 \ - && mkdir workingarea \ - && git clone --bare ${GIT_REPO} git/exercises.git \ - && git clone ${GIT_REPO} website \ - && ln -s /var/www/website/backend/hook/hook.php /var/www/git/exercises.git/hooks/update \ - && cp /var/www/website/docker/git-config git/exercises.git/config - -RUN sed -i -r "s|REPLACE_ME|http:\/\/${DOMAIN_NAME}|g" /var/www/website/frontend/app/home/startCommands.coffee +WORKDIR /var/www +RUN mkdir website + +COPY ./backend website/backend +COPY --from=backend_build /var/www/vendor website/backend/vendor +COPY --from=frontend_build /app/ website/frontend/ + +RUN mkdir git workingarea \ + && touch v5 + +# Get the exercises +RUN git clone --bare ${GIT_REPO} git/exercises.git +# Copy the hints into the backend +RUN cd git/exercises.git && \ + git worktree add /tmp/hints hints && \ + mv /tmp/hints /var/www/website/backend/hook/hints && \ + git worktree prune + +RUN ln -s /var/www/website/backend/hook/hook.php git/exercises.git/hooks/update +COPY ./docker/git-config git/exercises.git/config WORKDIR /var/www/git/exercises.git -RUN git checkout master && git branch -D verifications +RUN git checkout master && git branch -D verifications hints -WORKDIR /var/www/website/frontend -RUN npm install - -RUN npm install bower -g -RUN bower --allow-root install -RUN npm run-script dist - -WORKDIR /var/www ARG WWW_DATA_UID=1001 RUN usermod --uid "$WWW_DATA_UID" www-data \ && groupmod --gid "$WWW_DATA_UID" www-data \ && chown -hR www-data:www-data /var/www -RUN echo ${GIT_REPO} \ No newline at end of file diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index aa13ffd..af12f1f 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -2,15 +2,18 @@ version: '3' services: gitexercises: - container_name: ${COMPOSE_PROJECT_NAME} restart: unless-stopped - networks: [default] env_file: - .env - ports: - - "${PORT_HTTP}:80" + environment: + DB_HOST: ${DB_HOST} + DB_NAME: ${DB_NAME} + DB_USER: ${DB_USER} + DB_PASSWORD: ${DB_PASSWORD} + DOMAIN_NAME: ${DOMAIN_NAME} build: - context: . + context: .. + dockerfile: docker/Dockerfile args: GIT_REPO: ${GIT_REPO} DOMAIN_NAME: ${DOMAIN_NAME} @@ -21,18 +24,14 @@ services: max-size: 50m gitexercises-db: - container_name: ${COMPOSE_PROJECT_NAME}-db restart: unless-stopped image: mysql - networks: [default] - ports: - - "3306:3306" + env_file: + - .env environment: MYSQL_ALLOW_EMPTY_PASSWORD: "true" MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} MYSQL_DATABASE: ${DB_NAME} - MYSQL_USER: ${DB_USER} - MYSQL_PASSWORD: ${DB_PASSWORD} volumes: - /var/lib/mysql - ../backend/schema/gitexercises.sql:/docker-entrypoint-initdb.d/gitexercises.sql From 8b53bd894dbc15e91511fb455bf97fc4af8a08d8 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Wed, 28 Dec 2022 00:57:46 -0500 Subject: [PATCH 50/83] =?UTF-8?q?D=C3=A9plac=C3=A9=20les=20hints=20et=20v?= =?UTF-8?q?=C3=A9rifications=20dans=20leur=20propre=20branche?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hook/hints/CaseSensitiveFilename-hint.md | 1 - .../hints/CaseSensitiveFilename-solution.txt | 2 - .../hook/hints/ChangeBranchHistory-hint.md | 1 - .../hints/ChangeBranchHistory-solution.txt | 1 - .../hook/hints/ChangeBranchHistory-summary.md | 11 ----- backend/hook/hints/ChaseBranch-hint.md | 1 - backend/hook/hints/ChaseBranch-solution.txt | 1 - backend/hook/hints/ChaseBranch-summary.md | 15 ------ backend/hook/hints/CommitLost-hint.md | 1 - backend/hook/hints/CommitLost-solution.txt | 2 - backend/hook/hints/CommitLost-summary.md | 7 --- backend/hook/hints/CommitOneFile-hint.md | 8 ---- backend/hook/hints/CommitOneFile-solution.txt | 2 - backend/hook/hints/CommitOneFile-summary.md | 8 ---- .../hook/hints/CommitOneFileStaged-hint.md | 3 -- .../hints/CommitOneFileStaged-solution.txt | 2 - .../hook/hints/CommitOneFileStaged-summary.md | 2 - backend/hook/hints/CommitParts-hint.md | 2 - backend/hook/hints/CommitParts-solution.txt | 4 -- backend/hook/hints/CommitParts-summary.md | 5 -- backend/hook/hints/Executable-hint.md | 1 - backend/hook/hints/Executable-solution.txt | 1 - backend/hook/hints/FindBug-hint.md | 1 - backend/hook/hints/FindBug-solution.txt | 4 -- backend/hook/hints/FindBug-summary.md | 17 ------- backend/hook/hints/FindSwearwords-hint.md | 2 - .../hook/hints/FindSwearwords-solution.txt | 4 -- backend/hook/hints/FindSwearwords-summary.md | 4 -- backend/hook/hints/FixOldTypo-hint.md | 2 - backend/hook/hints/FixOldTypo-solution.txt | 6 --- backend/hook/hints/FixOldTypo-summary.md | 16 ------- backend/hook/hints/FixTypo-hint.md | 2 - backend/hook/hints/FixTypo-solution.txt | 3 -- backend/hook/hints/FixTypo-summary.md | 17 ------- backend/hook/hints/ForgeDate-hint.md | 1 - backend/hook/hints/ForgeDate-solution.txt | 1 - backend/hook/hints/IgnoreThem-hint.md | 1 - backend/hook/hints/IgnoreThem-solution.txt | 6 --- backend/hook/hints/IgnoreThem-summary.md | 13 ------ backend/hook/hints/InvalidOrder-hint.md | 1 - backend/hook/hints/InvalidOrder-solution.txt | 2 - backend/hook/hints/InvalidOrder-summary.md | 11 ----- backend/hook/hints/Master-solution.txt | 1 - backend/hook/hints/MergeConflict-hint.md | 2 - backend/hook/hints/MergeConflict-solution.txt | 4 -- backend/hook/hints/MergeConflict-summary.md | 46 ------------------- backend/hook/hints/PickYourFeatures-hint.md | 1 - .../hook/hints/PickYourFeatures-solution.txt | 6 --- .../hook/hints/PickYourFeatures-summary.md | 9 ---- backend/hook/hints/RebaseComplex-hint.md | 2 - backend/hook/hints/RebaseComplex-solution.txt | 1 - backend/hook/hints/RebaseComplex-summary.md | 16 ------- backend/hook/hints/RemoveIgnored-hint.md | 1 - backend/hook/hints/RemoveIgnored-solution.txt | 2 - backend/hook/hints/RemoveIgnored-summary.md | 11 ----- backend/hook/hints/SaveYourWork-hint.md | 4 -- backend/hook/hints/SaveYourWork-solution.txt | 6 --- backend/hook/hints/SaveYourWork-summary.md | 19 -------- backend/hook/hints/SplitCommit-hint.md | 2 - backend/hook/hints/SplitCommit-solution.txt | 5 -- backend/hook/hints/SplitCommit-summary.md | 17 ------- backend/hook/hints/TooManyCommits-hint.md | 2 - .../hook/hints/TooManyCommits-solution.txt | 2 - backend/hook/hints/TooManyCommits-summary.md | 12 ----- .../verifications/CaseSensitiveFilename.php | 16 ------- .../verifications/ChangeBranchHistory.php | 19 -------- backend/hook/verifications/ChaseBranch.php | 15 ------ backend/hook/verifications/CommitLost.php | 15 ------ backend/hook/verifications/CommitOneFile.php | 15 ------ .../verifications/CommitOneFileStaged.php | 10 ---- backend/hook/verifications/CommitParts.php | 21 --------- backend/hook/verifications/Escaped.php | 12 ----- backend/hook/verifications/Executable.php | 14 ------ backend/hook/verifications/FindBug.php | 18 -------- backend/hook/verifications/FindSwearwords.php | 20 -------- backend/hook/verifications/FixOldTypo.php | 13 ------ backend/hook/verifications/FixTypo.php | 25 ---------- backend/hook/verifications/ForgeDate.php | 14 ------ backend/hook/verifications/IgnoreThem.php | 24 ---------- backend/hook/verifications/InvalidOrder.php | 21 --------- backend/hook/verifications/Master.php | 21 --------- backend/hook/verifications/MergeConflict.php | 19 -------- .../hook/verifications/PickYourFeatures.php | 27 ----------- backend/hook/verifications/RebaseComplex.php | 26 ----------- backend/hook/verifications/RemoveIgnored.php | 17 ------- backend/hook/verifications/SaveYourWork.php | 21 --------- backend/hook/verifications/SplitCommit.php | 16 ------- backend/hook/verifications/TooManyCommits.php | 20 -------- docker/Dockerfile | 5 +- 89 files changed, 3 insertions(+), 807 deletions(-) delete mode 100644 backend/hook/hints/CaseSensitiveFilename-hint.md delete mode 100644 backend/hook/hints/CaseSensitiveFilename-solution.txt delete mode 100644 backend/hook/hints/ChangeBranchHistory-hint.md delete mode 100644 backend/hook/hints/ChangeBranchHistory-solution.txt delete mode 100644 backend/hook/hints/ChangeBranchHistory-summary.md delete mode 100644 backend/hook/hints/ChaseBranch-hint.md delete mode 100644 backend/hook/hints/ChaseBranch-solution.txt delete mode 100644 backend/hook/hints/ChaseBranch-summary.md delete mode 100644 backend/hook/hints/CommitLost-hint.md delete mode 100644 backend/hook/hints/CommitLost-solution.txt delete mode 100644 backend/hook/hints/CommitLost-summary.md delete mode 100644 backend/hook/hints/CommitOneFile-hint.md delete mode 100644 backend/hook/hints/CommitOneFile-solution.txt delete mode 100644 backend/hook/hints/CommitOneFile-summary.md delete mode 100644 backend/hook/hints/CommitOneFileStaged-hint.md delete mode 100644 backend/hook/hints/CommitOneFileStaged-solution.txt delete mode 100644 backend/hook/hints/CommitOneFileStaged-summary.md delete mode 100644 backend/hook/hints/CommitParts-hint.md delete mode 100644 backend/hook/hints/CommitParts-solution.txt delete mode 100644 backend/hook/hints/CommitParts-summary.md delete mode 100644 backend/hook/hints/Executable-hint.md delete mode 100644 backend/hook/hints/Executable-solution.txt delete mode 100644 backend/hook/hints/FindBug-hint.md delete mode 100644 backend/hook/hints/FindBug-solution.txt delete mode 100644 backend/hook/hints/FindBug-summary.md delete mode 100644 backend/hook/hints/FindSwearwords-hint.md delete mode 100644 backend/hook/hints/FindSwearwords-solution.txt delete mode 100644 backend/hook/hints/FindSwearwords-summary.md delete mode 100644 backend/hook/hints/FixOldTypo-hint.md delete mode 100644 backend/hook/hints/FixOldTypo-solution.txt delete mode 100644 backend/hook/hints/FixOldTypo-summary.md delete mode 100644 backend/hook/hints/FixTypo-hint.md delete mode 100644 backend/hook/hints/FixTypo-solution.txt delete mode 100644 backend/hook/hints/FixTypo-summary.md delete mode 100644 backend/hook/hints/ForgeDate-hint.md delete mode 100644 backend/hook/hints/ForgeDate-solution.txt delete mode 100644 backend/hook/hints/IgnoreThem-hint.md delete mode 100644 backend/hook/hints/IgnoreThem-solution.txt delete mode 100644 backend/hook/hints/IgnoreThem-summary.md delete mode 100644 backend/hook/hints/InvalidOrder-hint.md delete mode 100644 backend/hook/hints/InvalidOrder-solution.txt delete mode 100644 backend/hook/hints/InvalidOrder-summary.md delete mode 100644 backend/hook/hints/Master-solution.txt delete mode 100644 backend/hook/hints/MergeConflict-hint.md delete mode 100644 backend/hook/hints/MergeConflict-solution.txt delete mode 100644 backend/hook/hints/MergeConflict-summary.md delete mode 100644 backend/hook/hints/PickYourFeatures-hint.md delete mode 100644 backend/hook/hints/PickYourFeatures-solution.txt delete mode 100644 backend/hook/hints/PickYourFeatures-summary.md delete mode 100644 backend/hook/hints/RebaseComplex-hint.md delete mode 100644 backend/hook/hints/RebaseComplex-solution.txt delete mode 100644 backend/hook/hints/RebaseComplex-summary.md delete mode 100644 backend/hook/hints/RemoveIgnored-hint.md delete mode 100644 backend/hook/hints/RemoveIgnored-solution.txt delete mode 100644 backend/hook/hints/RemoveIgnored-summary.md delete mode 100644 backend/hook/hints/SaveYourWork-hint.md delete mode 100644 backend/hook/hints/SaveYourWork-solution.txt delete mode 100644 backend/hook/hints/SaveYourWork-summary.md delete mode 100644 backend/hook/hints/SplitCommit-hint.md delete mode 100644 backend/hook/hints/SplitCommit-solution.txt delete mode 100644 backend/hook/hints/SplitCommit-summary.md delete mode 100644 backend/hook/hints/TooManyCommits-hint.md delete mode 100644 backend/hook/hints/TooManyCommits-solution.txt delete mode 100644 backend/hook/hints/TooManyCommits-summary.md delete mode 100644 backend/hook/verifications/CaseSensitiveFilename.php delete mode 100644 backend/hook/verifications/ChangeBranchHistory.php delete mode 100644 backend/hook/verifications/ChaseBranch.php delete mode 100644 backend/hook/verifications/CommitLost.php delete mode 100644 backend/hook/verifications/CommitOneFile.php delete mode 100644 backend/hook/verifications/CommitOneFileStaged.php delete mode 100644 backend/hook/verifications/CommitParts.php delete mode 100644 backend/hook/verifications/Escaped.php delete mode 100644 backend/hook/verifications/Executable.php delete mode 100644 backend/hook/verifications/FindBug.php delete mode 100644 backend/hook/verifications/FindSwearwords.php delete mode 100644 backend/hook/verifications/FixOldTypo.php delete mode 100644 backend/hook/verifications/FixTypo.php delete mode 100644 backend/hook/verifications/ForgeDate.php delete mode 100644 backend/hook/verifications/IgnoreThem.php delete mode 100644 backend/hook/verifications/InvalidOrder.php delete mode 100644 backend/hook/verifications/Master.php delete mode 100644 backend/hook/verifications/MergeConflict.php delete mode 100644 backend/hook/verifications/PickYourFeatures.php delete mode 100644 backend/hook/verifications/RebaseComplex.php delete mode 100644 backend/hook/verifications/RemoveIgnored.php delete mode 100644 backend/hook/verifications/SaveYourWork.php delete mode 100644 backend/hook/verifications/SplitCommit.php delete mode 100644 backend/hook/verifications/TooManyCommits.php diff --git a/backend/hook/hints/CaseSensitiveFilename-hint.md b/backend/hook/hints/CaseSensitiveFilename-hint.md deleted file mode 100644 index 15ab74d..0000000 --- a/backend/hook/hints/CaseSensitiveFilename-hint.md +++ /dev/null @@ -1 +0,0 @@ -Try moving the file with [`git mv`](https://git-scm.com/docs/git-mv) instead of just `mv`. diff --git a/backend/hook/hints/CaseSensitiveFilename-solution.txt b/backend/hook/hints/CaseSensitiveFilename-solution.txt deleted file mode 100644 index cc0071e..0000000 --- a/backend/hook/hints/CaseSensitiveFilename-solution.txt +++ /dev/null @@ -1,2 +0,0 @@ -git mv File.txt file.txt -git commit -am "Lowercase file.txt" diff --git a/backend/hook/hints/ChangeBranchHistory-hint.md b/backend/hook/hints/ChangeBranchHistory-hint.md deleted file mode 100644 index 3c7b1e0..0000000 --- a/backend/hook/hints/ChangeBranchHistory-hint.md +++ /dev/null @@ -1 +0,0 @@ -You need to use [`git rebase`](https://git-scm.com/docs/git-rebase) command. diff --git a/backend/hook/hints/ChangeBranchHistory-solution.txt b/backend/hook/hints/ChangeBranchHistory-solution.txt deleted file mode 100644 index 685429c..0000000 --- a/backend/hook/hints/ChangeBranchHistory-solution.txt +++ /dev/null @@ -1 +0,0 @@ -git rebase hot-bugfix diff --git a/backend/hook/hints/ChangeBranchHistory-summary.md b/backend/hook/hints/ChangeBranchHistory-summary.md deleted file mode 100644 index a149708..0000000 --- a/backend/hook/hints/ChangeBranchHistory-summary.md +++ /dev/null @@ -1,11 +0,0 @@ -Although rebase is the easiest way of solving this exercise you may also use a [`git cherry-pick`](https://git-scm.com/docs/git-cherry-pick) command: - - git checkout hot-bugfix - git cherry-pick change-branch-history - -This results in the same commit history of the `change-branch-history` branch but the overall result is different than after rebase. -When cherry-picking, the `hot-bugfix` branch is moved forward and it points to the same commit as `change-branch-history`. -Be aware of that. - -Note that you should not rebase commits when you have published them already. -[Find out why](http://git-scm.com/book/en/v2/Git-Branching-Rebasing#The-Perils-of-Rebasing). diff --git a/backend/hook/hints/ChaseBranch-hint.md b/backend/hook/hints/ChaseBranch-hint.md deleted file mode 100644 index e1b1140..0000000 --- a/backend/hook/hints/ChaseBranch-hint.md +++ /dev/null @@ -1 +0,0 @@ -You need to use [`git merge`](https://git-scm.com/docs/git-merge) command. diff --git a/backend/hook/hints/ChaseBranch-solution.txt b/backend/hook/hints/ChaseBranch-solution.txt deleted file mode 100644 index d211457..0000000 --- a/backend/hook/hints/ChaseBranch-solution.txt +++ /dev/null @@ -1 +0,0 @@ -git merge escaped diff --git a/backend/hook/hints/ChaseBranch-summary.md b/backend/hook/hints/ChaseBranch-summary.md deleted file mode 100644 index 87c7a4e..0000000 --- a/backend/hook/hints/ChaseBranch-summary.md +++ /dev/null @@ -1,15 +0,0 @@ -Because the `chase` branch was direct ancestor of the `escaped` branch, the pointer -could be simply moved and no merge commit is necessary (also, conflicts are -impossible to happen in such situations). - -This is what Git calls as *Fast-Forward merge* because the branch pointer is only *fast forwarded* -to the commit you are merging with. - -Note that you could easily fool this task by executing command - - git push origin escaped:chase-branch - -Remote repository could not tell then if you have done the merge or if you just wanted -to set the remote `chase-branch` to point to the same commit as your local `escaped` branch (which is what the command above does). - -See also: [Basic Branching and Merging](http://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging) from Git Book. diff --git a/backend/hook/hints/CommitLost-hint.md b/backend/hook/hints/CommitLost-hint.md deleted file mode 100644 index 2d6dee9..0000000 --- a/backend/hook/hints/CommitLost-hint.md +++ /dev/null @@ -1 +0,0 @@ -[`git reflog`](https://git-scm.com/docs/git-reflog) tool will show you where you have been before. diff --git a/backend/hook/hints/CommitLost-solution.txt b/backend/hook/hints/CommitLost-solution.txt deleted file mode 100644 index 816c914..0000000 --- a/backend/hook/hints/CommitLost-solution.txt +++ /dev/null @@ -1,2 +0,0 @@ -git reflog -git reset --hard HEAD@{1} diff --git a/backend/hook/hints/CommitLost-summary.md b/backend/hook/hints/CommitLost-summary.md deleted file mode 100644 index 3981238..0000000 --- a/backend/hook/hints/CommitLost-summary.md +++ /dev/null @@ -1,7 +0,0 @@ -[`git reflog`](https://git-scm.com/docs/git-reflog) records where you have been previously. You can find any -commit you have been on with this tool and find commits that you have -lost accidentally (for example by rebase, amend). - -There are even more powerful selectors. Do you want to know what were you working on yesterday? - - git show -q HEAD@{1.day.ago} diff --git a/backend/hook/hints/CommitOneFile-hint.md b/backend/hook/hints/CommitOneFile-hint.md deleted file mode 100644 index 976512e..0000000 --- a/backend/hook/hints/CommitOneFile-hint.md +++ /dev/null @@ -1,8 +0,0 @@ -You need to add chosen files to the staging area with [`git add`](https://git-scm.com/docs/git-add) command. -Then, you need to commit it with [`git commit`](https://git-scm.com/docs/git-commit). For example: - - git commit -m "Some commit message" - -If you don't remember it yet, send solution for verification with - - git verify diff --git a/backend/hook/hints/CommitOneFile-solution.txt b/backend/hook/hints/CommitOneFile-solution.txt deleted file mode 100644 index 4e6c400..0000000 --- a/backend/hook/hints/CommitOneFile-solution.txt +++ /dev/null @@ -1,2 +0,0 @@ -git add A.txt -git commit -m "Commit A.txt file" diff --git a/backend/hook/hints/CommitOneFile-summary.md b/backend/hook/hints/CommitOneFile-summary.md deleted file mode 100644 index 9562e59..0000000 --- a/backend/hook/hints/CommitOneFile-summary.md +++ /dev/null @@ -1,8 +0,0 @@ -You prepare changes to be committed with [`git add `](https://git-scm.com/docs/git-add) command. -It adds files from working area to staging area. -Only files that are in staging area will be included in the commit when you run the [`git commit`](https://git-scm.com/docs/git-commit) command. - -Remember that you can `git add -A` to add all changed files to staging area. You can also do this *in air* with `-a` option for -[`git commit`](https://git-scm.com/docs/git-commit), e.g. - - git commit -am "Some Commit Message" diff --git a/backend/hook/hints/CommitOneFileStaged-hint.md b/backend/hook/hints/CommitOneFileStaged-hint.md deleted file mode 100644 index 043e5e2..0000000 --- a/backend/hook/hints/CommitOneFileStaged-hint.md +++ /dev/null @@ -1,3 +0,0 @@ -In order to remove files from staging area you should use the [`git reset`](https://git-scm.com/docs/git-reset) command. - -Files that are not in the staging area will not be taken into the next commit. diff --git a/backend/hook/hints/CommitOneFileStaged-solution.txt b/backend/hook/hints/CommitOneFileStaged-solution.txt deleted file mode 100644 index d7b0342..0000000 --- a/backend/hook/hints/CommitOneFileStaged-solution.txt +++ /dev/null @@ -1,2 +0,0 @@ -git reset A.txt -git commit -m "Commit B.txt file" diff --git a/backend/hook/hints/CommitOneFileStaged-summary.md b/backend/hook/hints/CommitOneFileStaged-summary.md deleted file mode 100644 index e939b67..0000000 --- a/backend/hook/hints/CommitOneFileStaged-summary.md +++ /dev/null @@ -1,2 +0,0 @@ -When you have added too many changes to staging area, you can undo them with [`git reset `](https://git-scm.com/docs/git-reset) command -before the [`git commit`](https://git-scm.com/docs/git-commit). diff --git a/backend/hook/hints/CommitParts-hint.md b/backend/hook/hints/CommitParts-hint.md deleted file mode 100644 index 6a56d5b..0000000 --- a/backend/hook/hints/CommitParts-hint.md +++ /dev/null @@ -1,2 +0,0 @@ -You should try the [`git add -p`](https://git-scm.com/docs/git-add#_interactive_mode) to add the changed file to staging area interactively. -It allows you to choose which modifications you want to commit and which should be left uncommitted. diff --git a/backend/hook/hints/CommitParts-solution.txt b/backend/hook/hints/CommitParts-solution.txt deleted file mode 100644 index b0a027d..0000000 --- a/backend/hook/hints/CommitParts-solution.txt +++ /dev/null @@ -1,4 +0,0 @@ -git add -p file.txt -# choose lines to include with 'y' -git commit -m "First part of changes" -git commit -am "The rest of the changed" diff --git a/backend/hook/hints/CommitParts-summary.md b/backend/hook/hints/CommitParts-summary.md deleted file mode 100644 index d5cbbdd..0000000 --- a/backend/hook/hints/CommitParts-summary.md +++ /dev/null @@ -1,5 +0,0 @@ -[`git add -p`](https://git-scm.com/docs/git-add#_interactive_mode) allows you to stage parts of the changes you have made to the file. -It can be helpful if you want to split the work you have done. - -Please note that you can also stash, reset or checkout parts of the files, too. -Just add `-p` argument to these commands. diff --git a/backend/hook/hints/Executable-hint.md b/backend/hook/hints/Executable-hint.md deleted file mode 100644 index 8c3beef..0000000 --- a/backend/hook/hints/Executable-hint.md +++ /dev/null @@ -1 +0,0 @@ -You should use the [`git update-index`](https://git-scm.com/docs/git-update-index) command with appropriate `--chmod` flag. diff --git a/backend/hook/hints/Executable-solution.txt b/backend/hook/hints/Executable-solution.txt deleted file mode 100644 index b48a4a8..0000000 --- a/backend/hook/hints/Executable-solution.txt +++ /dev/null @@ -1 +0,0 @@ -git update-index --chmod=+x script.sh diff --git a/backend/hook/hints/FindBug-hint.md b/backend/hook/hints/FindBug-hint.md deleted file mode 100644 index 4abdfd4..0000000 --- a/backend/hook/hints/FindBug-hint.md +++ /dev/null @@ -1 +0,0 @@ -You should use the [`git bisect`](https://git-scm.com/docs/git-bisect) command in conjunction with the information given in the exercise. diff --git a/backend/hook/hints/FindBug-solution.txt b/backend/hook/hints/FindBug-solution.txt deleted file mode 100644 index 9236ff1..0000000 --- a/backend/hook/hints/FindBug-solution.txt +++ /dev/null @@ -1,4 +0,0 @@ -git bisect start -git bisect bad HEAD -git bisect good 1.0 -git bisect run sh -c "openssl enc -base64 -A -d < home-screen-text.txt | grep -v jackass" diff --git a/backend/hook/hints/FindBug-summary.md b/backend/hook/hints/FindBug-summary.md deleted file mode 100644 index 51e2aea..0000000 --- a/backend/hook/hints/FindBug-summary.md +++ /dev/null @@ -1,17 +0,0 @@ -[`git bisect`](http://git-scm.com/docs/git-bisect) is an amazing tool that helps you to find commit that introduced a bug. -Once you are able to write a script that verifies if the bug exists, the task is -even simpler as git bisect allows you to automate searching for buggy commit. - -If you have a shell command that verifies if the bug exists (you should have figure -out one with openssl and grep for this task), you can automate searching for bug with - - git bisect run sh -c "your command" - -`"your command"` should return status code 0 for good commits and non-zero for bad commits. -It can be running an unit test for example. If you marked last known good and bad commits -before, git bisect will run and find the commit that introduced a bug in seconds. - -If you can't automate it, git bisect is also helpful because it helps to binary search -for a buggy commit, checking out the next closest hit. You can run the application on it -and verify by hand if the bug exists or not, marking narrower scope for further searching -on each iteration. diff --git a/backend/hook/hints/FindSwearwords-hint.md b/backend/hook/hints/FindSwearwords-hint.md deleted file mode 100644 index 0cdec57..0000000 --- a/backend/hook/hints/FindSwearwords-hint.md +++ /dev/null @@ -1,2 +0,0 @@ -You should use one of the options of the [`git log`](https://git-scm.com/docs/git-log) command to find all commits that introduced a swearword. -Then, use interactive rebase to remove them. diff --git a/backend/hook/hints/FindSwearwords-solution.txt b/backend/hook/hints/FindSwearwords-solution.txt deleted file mode 100644 index ae91113..0000000 --- a/backend/hook/hints/FindSwearwords-solution.txt +++ /dev/null @@ -1,4 +0,0 @@ -git log -Sshit -git rebase -i ^ -# remove the swearword -git rebase --continue diff --git a/backend/hook/hints/FindSwearwords-summary.md b/backend/hook/hints/FindSwearwords-summary.md deleted file mode 100644 index e6f4546..0000000 --- a/backend/hook/hints/FindSwearwords-summary.md +++ /dev/null @@ -1,4 +0,0 @@ -Use [`git log -Sword`](https://git-scm.com/docs/git-log) when you want to grep for commits that introduced -word or source code fragment you are interested in. - -Once you know commit ids that introduced a swearword, it's easy to amend the commits during interactive rebase. diff --git a/backend/hook/hints/FixOldTypo-hint.md b/backend/hook/hints/FixOldTypo-hint.md deleted file mode 100644 index eee1281..0000000 --- a/backend/hook/hints/FixOldTypo-hint.md +++ /dev/null @@ -1,2 +0,0 @@ -You should use the [`git rebase`](https://git-scm.com/docs/git-rebase) command in the -[interactive mode](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages). diff --git a/backend/hook/hints/FixOldTypo-solution.txt b/backend/hook/hints/FixOldTypo-solution.txt deleted file mode 100644 index 7fa678f..0000000 --- a/backend/hook/hints/FixOldTypo-solution.txt +++ /dev/null @@ -1,6 +0,0 @@ -git rebase -i HEAD^^ -# mark the first commit with "edit" command -# fix the typo in the file -git add file.txt -git rebase --continue -# fix the typo in the commit message diff --git a/backend/hook/hints/FixOldTypo-summary.md b/backend/hook/hints/FixOldTypo-summary.md deleted file mode 100644 index 2f9ff25..0000000 --- a/backend/hook/hints/FixOldTypo-summary.md +++ /dev/null @@ -1,16 +0,0 @@ -[Interactive rebase](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages) -is one of the most powerful tools in Git. It allows you to amend any commit in history. - -There are a few operations that you can do with `git rebase -i` command. -Now you should be familiar with edit operation that allows you to pause -rebasing and amend commit. There is also reword operation that should -be used when you want to change commit message only. - -As you have noticed, rebasing can also lead to conflicts. - -Remember that you don't need to know the commit SHA-1 hashes when specifying -them in `git rebase -i` command. When you know that you want to go 2 commits -back, you can always run `git rebase -i HEAD^^` or `git rebase -i HEAD~2`. - -Note that you should not rebase commits when you have published them already. -[Find out why](http://git-scm.com/book/en/v2/Git-Branching-Rebasing#The-Perils-of-Rebasing). diff --git a/backend/hook/hints/FixTypo-hint.md b/backend/hook/hints/FixTypo-hint.md deleted file mode 100644 index 40dd348..0000000 --- a/backend/hook/hints/FixTypo-hint.md +++ /dev/null @@ -1,2 +0,0 @@ -You should use the [`git commit --amend`](https://git-scm.com/docs/git-commit#git-commit---amend) command to -[change the last commit](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History#_git_amend). diff --git a/backend/hook/hints/FixTypo-solution.txt b/backend/hook/hints/FixTypo-solution.txt deleted file mode 100644 index 9c1c1bb..0000000 --- a/backend/hook/hints/FixTypo-solution.txt +++ /dev/null @@ -1,3 +0,0 @@ -# fix the typo in the file -git commit -a --amend -# fix the typo in commit message diff --git a/backend/hook/hints/FixTypo-summary.md b/backend/hook/hints/FixTypo-summary.md deleted file mode 100644 index 56cae5a..0000000 --- a/backend/hook/hints/FixTypo-summary.md +++ /dev/null @@ -1,17 +0,0 @@ -When you want to change the last commit (the one that is pointed by HEAD), use - - `git commit --amend` - -If you want to change only commited files but no edit message, use - - `git commit --amend --no-edit` - -Moreover, you can skip git add command and update last commit with all current -changes in working area: - - `git commit --amend --no-edit -a` - -See [how to change the last commit](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Changing-the-Last-Commit) in the Git Book. - -Note that you should not amend a commit when you have published it already. -[Find out why](http://git-scm.com/book/en/v2/Git-Branching-Rebasing#The-Perils-of-Rebasing). diff --git a/backend/hook/hints/ForgeDate-hint.md b/backend/hook/hints/ForgeDate-hint.md deleted file mode 100644 index 5dfd04b..0000000 --- a/backend/hook/hints/ForgeDate-hint.md +++ /dev/null @@ -1 +0,0 @@ -Maybe there are some `date` manipulation allowed during the [`git commit --amend`](https://git-scm.com/docs/git-commit)? diff --git a/backend/hook/hints/ForgeDate-solution.txt b/backend/hook/hints/ForgeDate-solution.txt deleted file mode 100644 index f3e7138..0000000 --- a/backend/hook/hints/ForgeDate-solution.txt +++ /dev/null @@ -1 +0,0 @@ -git commit --amend --no-edit --date="1987-08-03" diff --git a/backend/hook/hints/IgnoreThem-hint.md b/backend/hook/hints/IgnoreThem-hint.md deleted file mode 100644 index 1f22474..0000000 --- a/backend/hook/hints/IgnoreThem-hint.md +++ /dev/null @@ -1 +0,0 @@ -You need to create a [`.gitignore`](https://git-scm.com/docs/gitignore) file, put ignore rules there and commit it. diff --git a/backend/hook/hints/IgnoreThem-solution.txt b/backend/hook/hints/IgnoreThem-solution.txt deleted file mode 100644 index 4db5412..0000000 --- a/backend/hook/hints/IgnoreThem-solution.txt +++ /dev/null @@ -1,6 +0,0 @@ -echo *.o > .gitignore -echo *.exe >> .gitignore -echo *.jar >> .gitignore -echo libraries/ >> .gitignore -git add .gitignore -git commit -m "Ignore binary files" diff --git a/backend/hook/hints/IgnoreThem-summary.md b/backend/hook/hints/IgnoreThem-summary.md deleted file mode 100644 index c507e75..0000000 --- a/backend/hook/hints/IgnoreThem-summary.md +++ /dev/null @@ -1,13 +0,0 @@ -A [`.gitignore`](http://git-scm.com/docs/gitignore) file specifies intentionally untracked files that Git should ignore. - -To ignore all files with specific string inside filename, just type it in, i.e. `dumb` -To ignore all files with specific extension use wildcard, i.e. `*.exe` -To ignore the whole directories, put a slash in the end of the rule, i.e. `libraries/` -To specify full path from the `.gitignore` location start rule with slash, i.e. `/libraries` - -Note that there is a difference between `libraries/` and `/libraries/` rule. -The first one would ignore all directories named `libraries` in the whole project whereas -the second one would ignore only the `libraries` directory in the same location as `.gitignore` file. - -Also, it's worth to know that there are [many predefined `.gitignore`s for specific environments](https://github.com/github/gitignore) -so you don't have to invent your own. There is even a [`.gitignore` generator](https://www.gitignore.io/). diff --git a/backend/hook/hints/InvalidOrder-hint.md b/backend/hook/hints/InvalidOrder-hint.md deleted file mode 100644 index c17b20a..0000000 --- a/backend/hook/hints/InvalidOrder-hint.md +++ /dev/null @@ -1 +0,0 @@ -You should use the [`git rebase --interactive`](https://git-scm.com/docs/git-rebase) (again!). diff --git a/backend/hook/hints/InvalidOrder-solution.txt b/backend/hook/hints/InvalidOrder-solution.txt deleted file mode 100644 index 0b8e15d..0000000 --- a/backend/hook/hints/InvalidOrder-solution.txt +++ /dev/null @@ -1,2 +0,0 @@ -git rebase -i HEAD~2 -# move the second commit up diff --git a/backend/hook/hints/InvalidOrder-summary.md b/backend/hook/hints/InvalidOrder-summary.md deleted file mode 100644 index 13df234..0000000 --- a/backend/hook/hints/InvalidOrder-summary.md +++ /dev/null @@ -1,11 +0,0 @@ -The easiest way to change order of commits in history is to use [rebase interactive](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Reordering-Commits) -feature of Git. Just swap the commits as you want leaving default pick operation. - -Remember that you don't need to know the commit SHA-1 hashes when specifying -them in `git rebase -i command`. When you know that you want to go 2 commits -back, you can always run `git rebase -i HEAD^^` or `git rebase -i HEAD~2`. - -Do you consider changing order inconvenient? Try out the [rebase-editor](https://www.npmjs.com/package/rebase-editor)! - -Note that you should not rebase commits when you have published them already. -[Find out why](http://git-scm.com/book/en/v2/Git-Branching-Rebasing#The-Perils-of-Rebasing). diff --git a/backend/hook/hints/Master-solution.txt b/backend/hook/hints/Master-solution.txt deleted file mode 100644 index 42b7a63..0000000 --- a/backend/hook/hints/Master-solution.txt +++ /dev/null @@ -1 +0,0 @@ -git verify diff --git a/backend/hook/hints/MergeConflict-hint.md b/backend/hook/hints/MergeConflict-hint.md deleted file mode 100644 index 7f8a7a3..0000000 --- a/backend/hook/hints/MergeConflict-hint.md +++ /dev/null @@ -1,2 +0,0 @@ -When you run [`git merge`](https://git-scm.com/docs/git-merge) command, there will be a conflict. You can (and should) -resolve it by hand. Then save your changes in the file, add it to staging area and commit. diff --git a/backend/hook/hints/MergeConflict-solution.txt b/backend/hook/hints/MergeConflict-solution.txt deleted file mode 100644 index 07d3f23..0000000 --- a/backend/hook/hints/MergeConflict-solution.txt +++ /dev/null @@ -1,4 +0,0 @@ -git merge another-piece-of-work -echo 2+3=5 > equation.txt -git add equation.txt -git commit --no-edit diff --git a/backend/hook/hints/MergeConflict-summary.md b/backend/hook/hints/MergeConflict-summary.md deleted file mode 100644 index 8efa85e..0000000 --- a/backend/hook/hints/MergeConflict-summary.md +++ /dev/null @@ -1,46 +0,0 @@ -Because the branches have diverged, fast-forward merge strategy could not be applied. -Therefore, a merge conflict was possible. Because two branches made changes in the same -file and near the same line, Git decided not to handle the situation itself but to -throw a merge conflict (letting user decide what to do). - -After you resolve the conflict, you need to add it to staging area to tell Git that you have handled the situation. -`git commit` then continues the merging process. - -However, when Git stops and tells you that there is a conflict to resolve, you are not left on your own. There are some tricks -that can make conflict resolution process a lot easier. - - * By default, Git shows only *your* changes and *their* changes of conflicting lines. This will look like this: - - <<<<<<< HEAD - 2 + ? = 5 - ======= - ? + 3 = 5 - >>>>>>> another-piece-of-work - - It is often very helpful to see also how the code looked like before both of these changes. Seeing more context can - help figure out good conflict resolution a lot faster. You can - [checkout each file in `diff3` mode](http://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_checking_out_conflicts) - that shows all three states of conflicting lines. - - git checkout --conflict=diff3 equation.txt - - Conflict in `equation.txt` will be presented now as: - - <<<<<<< HEAD - 2 + ? = 5 - ||||||| merged common ancestors - ? + ? = 5 - ======= - ? + 3 = 5 - >>>>>>> another-piece-of-work - - If you like the `diff3` presentation of conflicts, you can enable them by default with - - git config merge.conflictstyle diff3 - - * Sometimes you want either discard *your* changes or *their* changes that introduces the conflict. You can do that easily - with - - git checkout --ours equation.txt - -It's also worth to read the [Basic Branching and Merging](http://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging) from the Git Book. diff --git a/backend/hook/hints/PickYourFeatures-hint.md b/backend/hook/hints/PickYourFeatures-hint.md deleted file mode 100644 index 50d2597..0000000 --- a/backend/hook/hints/PickYourFeatures-hint.md +++ /dev/null @@ -1 +0,0 @@ -You need to use the [`git cherry-pick`](https://git-scm.com/docs/git-cherry-pick) command. diff --git a/backend/hook/hints/PickYourFeatures-solution.txt b/backend/hook/hints/PickYourFeatures-solution.txt deleted file mode 100644 index 1898eb4..0000000 --- a/backend/hook/hints/PickYourFeatures-solution.txt +++ /dev/null @@ -1,6 +0,0 @@ -git cherry-pick feature-a -git cherry-pick feature-b -git cherry-pick feature-c -# resolve merge conflict -git add -A -git cherry-pick --continue diff --git a/backend/hook/hints/PickYourFeatures-summary.md b/backend/hook/hints/PickYourFeatures-summary.md deleted file mode 100644 index c16c989..0000000 --- a/backend/hook/hints/PickYourFeatures-summary.md +++ /dev/null @@ -1,9 +0,0 @@ -[Cherry picking commits](http://git-scm.com/docs/git-cherry-pick) is like doing small rebases (with one commit only). -Unlike the rebase, cherry-pick moves the current branch forward. Therefore, the easiest way of passing -this exercise was to `git cherry-pick feature-a`, `feature-b` and `feature-c` consecutively. - -However, as you should have noticed, cherry picks may lead to conflicts, too. -When you tried to pick `feature-c`, Git should have complained that it does not -know where to get first part of Feature C from (`cherry-pick` picks only one commit). -Therefore, it is often good idea to [squash commits](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Squashing-Commits) -first before cherry-picking them to other branch. diff --git a/backend/hook/hints/RebaseComplex-hint.md b/backend/hook/hints/RebaseComplex-hint.md deleted file mode 100644 index 5039108..0000000 --- a/backend/hook/hints/RebaseComplex-hint.md +++ /dev/null @@ -1,2 +0,0 @@ -This exercise can be solved with one command, when you look into the `--onto` parameter of -the [`git rebase`](https://git-scm.com/docs/git-rebase) command. diff --git a/backend/hook/hints/RebaseComplex-solution.txt b/backend/hook/hints/RebaseComplex-solution.txt deleted file mode 100644 index 8d2df70..0000000 --- a/backend/hook/hints/RebaseComplex-solution.txt +++ /dev/null @@ -1 +0,0 @@ -git rebase issue-555 --onto your-master diff --git a/backend/hook/hints/RebaseComplex-summary.md b/backend/hook/hints/RebaseComplex-summary.md deleted file mode 100644 index ef156db..0000000 --- a/backend/hook/hints/RebaseComplex-summary.md +++ /dev/null @@ -1,16 +0,0 @@ -[`git rebase --onto`](https://git-scm.com/docs/git-rebase) allows you to move a branch to a different place. - -The command: - - git rebase issue-555 --onto your-master - -means: - -> Get all commits that are not in `issue-555` and place them onto `your-master` branch. - -It is consistent with regular rebase (`--onto` defaults to branch you are rebasing to). `git rebase issue-555` -means: - -> Get all commits that are not in `issue-555` and place them onto `issue-555`. - -See also [interesting rebases](http://git-scm.com/book/en/v2/Git-Branching-Rebasing#More-Interesting-Rebases) in the Git Book. diff --git a/backend/hook/hints/RemoveIgnored-hint.md b/backend/hook/hints/RemoveIgnored-hint.md deleted file mode 100644 index 10570cf..0000000 --- a/backend/hook/hints/RemoveIgnored-hint.md +++ /dev/null @@ -1 +0,0 @@ -Take a look at the [`git rm`](https://git-scm.com/docs/git-rm) command. diff --git a/backend/hook/hints/RemoveIgnored-solution.txt b/backend/hook/hints/RemoveIgnored-solution.txt deleted file mode 100644 index 5364107..0000000 --- a/backend/hook/hints/RemoveIgnored-solution.txt +++ /dev/null @@ -1,2 +0,0 @@ -git rm ignored.txt -git commit -am "Remove the file that should have been ignored" diff --git a/backend/hook/hints/RemoveIgnored-summary.md b/backend/hook/hints/RemoveIgnored-summary.md deleted file mode 100644 index 99b29a8..0000000 --- a/backend/hook/hints/RemoveIgnored-summary.md +++ /dev/null @@ -1,11 +0,0 @@ -When file is ignored but is tracked for whatever reason, you can always execute -[`git rm `](https://git-scm.com/docs/git-rm) -to remove the file from both repository and working area. - -If you want to leave it in your working directory (which is often when dealing -with mistakenly tracked files), you can tell Git to remove it only from repository -but not from working area with - - git rm --cached - -See [removing files](http://git-scm.com/book/ch2-2.html#Removing-Files) in the Git Book. diff --git a/backend/hook/hints/SaveYourWork-hint.md b/backend/hook/hints/SaveYourWork-hint.md deleted file mode 100644 index 48ff2ae..0000000 --- a/backend/hook/hints/SaveYourWork-hint.md +++ /dev/null @@ -1,4 +0,0 @@ -1. Use [`git stash`](https://git-scm.com/docs/git-stash) to save your current work in background and clean the working area. -1. Fix the bug. -1. Use `git stash pop` to reapply your changes to working area. -1. Finish your work (see instructions) diff --git a/backend/hook/hints/SaveYourWork-solution.txt b/backend/hook/hints/SaveYourWork-solution.txt deleted file mode 100644 index 65c3550..0000000 --- a/backend/hook/hints/SaveYourWork-solution.txt +++ /dev/null @@ -1,6 +0,0 @@ -git stash -# fix a bug -git commit -am "Fix a bug" -git stash pop -echo "Finally, finished it!" >> bug.txt -git commit -am "Finish my work" diff --git a/backend/hook/hints/SaveYourWork-summary.md b/backend/hook/hints/SaveYourWork-summary.md deleted file mode 100644 index af7816b..0000000 --- a/backend/hook/hints/SaveYourWork-summary.md +++ /dev/null @@ -1,19 +0,0 @@ -It's hard to verify if you have done this task correctly. - -Its aim was to demonstrate [`git stash`](https://git-scm.com/docs/git-stash) feature. When you run this command -on dirty working area, it will save its state in stashed changes. You can -do another work then, make any commits, checkout to any branch and then -get the stashed changes back. You can think of stash as an intelligent Git clipboard. - -An interesting option of stash command is the `--keep-index` which allows to -stash all changes that were not added to staging area yet. - -Keep in mind that applying stash might lead to conflicts if your working area -introducted changes conflicting with stash. Therefore, its often safer to run -`git stash apply` instead of `git stash pop` (the first one does not remove stashed -changes). - -Last thing to remember is that stashes are only local - you can't push them to -remote repository. - -See [Stashing](http://git-scm.com/book/en/v2/Git-Tools-Stashing-and-Cleaning) in the Git Book. diff --git a/backend/hook/hints/SplitCommit-hint.md b/backend/hook/hints/SplitCommit-hint.md deleted file mode 100644 index 758feee..0000000 --- a/backend/hook/hints/SplitCommit-hint.md +++ /dev/null @@ -1,2 +0,0 @@ -You should use the [`git reset`](https://git-scm.com/docs/git-reset) command to move your branch pointer back and -then repeat the work as you desire (commit one file in the first commit and the other in the second). diff --git a/backend/hook/hints/SplitCommit-solution.txt b/backend/hook/hints/SplitCommit-solution.txt deleted file mode 100644 index b4c9096..0000000 --- a/backend/hook/hints/SplitCommit-solution.txt +++ /dev/null @@ -1,5 +0,0 @@ -git reset HEAD^ -git add first.txt -git commit -m "First.txt" -git add second.txt -git commit -m "Second.txt" diff --git a/backend/hook/hints/SplitCommit-summary.md b/backend/hook/hints/SplitCommit-summary.md deleted file mode 100644 index a66f6cd..0000000 --- a/backend/hook/hints/SplitCommit-summary.md +++ /dev/null @@ -1,17 +0,0 @@ -In order to split a commit you need to go just before it (force working -area looks like the commit has not been made) and repeat commit(s) -as you wish. - -To go back, you should use [`git reset`](https://git-scm.com/docs/git-reset) command. It does three things -in a specific order, stopping when you tell it to (depending on a reset type): - -1. Moves the branch `HEAD` points to (stops here if `--soft`) -1. Makes the Index look like `HEAD` (stops here if `--mixed`, default, if no flag specified) -1. Makes the Working Directory look like the Index (`--hard`) - -In this exercise, you should have `git reset HEAD^` (reset your -branch and Index too look like one commit before but leave Working Area -untouched). Then it's easy to prepare your commit(s) again as you desire. - -Read more [about reset command](http://git-scm.com/book/en/v2/Git-Tools-Reset-Demystified) -and [splitting commits](http://git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Splitting-a-Commit) in the Git Book. diff --git a/backend/hook/hints/TooManyCommits-hint.md b/backend/hook/hints/TooManyCommits-hint.md deleted file mode 100644 index e886e00..0000000 --- a/backend/hook/hints/TooManyCommits-hint.md +++ /dev/null @@ -1,2 +0,0 @@ -You should use the [`git rebase --interactive`](https://git-scm.com/docs/git-rebase) to -[squash](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Squashing-Commits) the commits. diff --git a/backend/hook/hints/TooManyCommits-solution.txt b/backend/hook/hints/TooManyCommits-solution.txt deleted file mode 100644 index 0059c78..0000000 --- a/backend/hook/hints/TooManyCommits-solution.txt +++ /dev/null @@ -1,2 +0,0 @@ -git rebase -i HEAD^^ -# "squash" or "fixup" the second commit diff --git a/backend/hook/hints/TooManyCommits-summary.md b/backend/hook/hints/TooManyCommits-summary.md deleted file mode 100644 index e9d89b3..0000000 --- a/backend/hook/hints/TooManyCommits-summary.md +++ /dev/null @@ -1,12 +0,0 @@ -The easiest way to make one commit out of two (or more) is to [squash](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Squashing-Commits) them -with `git rebase -i` command and choose squash option for all but the first -commit you want to preserve. Note that you can also use `fixup` command -when you want to discard consequent commit messages and leave only the -first one. - -Remember that you don't need to know the commit SHA-1 hashes when specifying -them in `git rebase -i` command. When you know that you want to go 2 commits -back, you can always run `git rebase -i HEAD^^` or `git rebase -i HEAD~2`. - -Note that you should not squash commits when you have published them already. -[Find out why](http://git-scm.com/book/en/v2/Git-Branching-Rebasing#The-Perils-of-Rebasing). diff --git a/backend/hook/verifications/CaseSensitiveFilename.php b/backend/hook/verifications/CaseSensitiveFilename.php deleted file mode 100644 index 5ca5959..0000000 --- a/backend/hook/verifications/CaseSensitiveFilename.php +++ /dev/null @@ -1,16 +0,0 @@ -getCommits()[0]; - $contentsLowercase = $this->getFileContent($commit, 'file.txt'); - $contentsCapitalized = $this->getFileContent($commit, 'File.txt'); - $this->ensure(!empty($contentsLowercase), 'There is no lowercase file.txt in your solution.'); - $this->ensure(empty($contentsCapitalized), 'There should be no capitalized File.txt in your solution.'); - } -} diff --git a/backend/hook/verifications/ChangeBranchHistory.php b/backend/hook/verifications/ChangeBranchHistory.php deleted file mode 100644 index ffa6f28..0000000 --- a/backend/hook/verifications/ChangeBranchHistory.php +++ /dev/null @@ -1,19 +0,0 @@ -ensureCommitsCount(3); - $this->ensure(GitUtils::getCommitSubject($commits[0]) == 'Work on an issue', 'The last commit should be "Work on an issue".'); - $this->ensure(GitUtils::getCommitSubject($commits[1]) == 'Bug fix', 'Work on an issue should start at bug fix.'); - $this->ensureFilesCount($commits[0], 1); - $this->ensureFilesCount($commits[1], 1); - $this->ensure($this->getFileContent($commits[0], 'file.txt')[0] == 'This is better content of file.txt', 'Invalid content of file.txt'); - $this->ensure($this->getFileContent($commits[0], 'buggy.txt')[0] == 'Bug removed', 'Bug has not been fixed'); - } -} diff --git a/backend/hook/verifications/ChaseBranch.php b/backend/hook/verifications/ChaseBranch.php deleted file mode 100644 index 9e74b4a..0000000 --- a/backend/hook/verifications/ChaseBranch.php +++ /dev/null @@ -1,15 +0,0 @@ -ensureCommitsCount(2); - $this->ensure(GitUtils::getCommitSubject($commits[1]) == 'First escaped commit', 'The first pushed commit is not the one that has been created by start.sh script.'); - $this->ensure(GitUtils::getCommitSubject($commits[0]) == 'Second escaped commit', 'The second pushed commit is not the one that has been created by start.sh script.'); - } -} diff --git a/backend/hook/verifications/CommitLost.php b/backend/hook/verifications/CommitLost.php deleted file mode 100644 index c49f162..0000000 --- a/backend/hook/verifications/CommitLost.php +++ /dev/null @@ -1,15 +0,0 @@ -getCommits()); - $this->ensureFilesCount($commit, 1); - $content = $this->getFileContent($commit, 'file.txt'); - $this->ensure($content[0] == 'This is the good version of a file.', 'The commit you have provided does not appear to be the lost one.'); - } -} diff --git a/backend/hook/verifications/CommitOneFile.php b/backend/hook/verifications/CommitOneFile.php deleted file mode 100644 index 22501d3..0000000 --- a/backend/hook/verifications/CommitOneFile.php +++ /dev/null @@ -1,15 +0,0 @@ -ensureCommitsCount(1); - $file = $this->ensureFilesCount($commit, 1); - $this->ensure(in_array($file, ['A.txt', 'B.txt']), 'None of the generated files has been commited. Received %s.', [ConsoleUtils::blue($file)]); - } -} diff --git a/backend/hook/verifications/CommitOneFileStaged.php b/backend/hook/verifications/CommitOneFileStaged.php deleted file mode 100644 index 2887f76..0000000 --- a/backend/hook/verifications/CommitOneFileStaged.php +++ /dev/null @@ -1,10 +0,0 @@ -ensureCommitsCount(3); - $content = $this->getFileContent($commits[1], 'file.txt'); - $this->ensure(count($content) == 7, 'Too few lines in the first commit - not the whole task has been commited.'); - $this->ensure($content[2] == 'It lasts for many lines as task 1 was big.', 'The third line in the first task is invalid.'); - $this->ensure($content[4] == 'It works', 'The fifth line in the first task is invalid.'); - $this->ensure($content[6] == 'Task 1 is finished.', 'The last line in the first task is invalid.'); - $content = $this->getFileContent($commits[0], 'file.txt'); - $this->ensure(count($content) == 9, 'Too few lines in the second commit - not the whole task has been commited.'); - $this->ensure($content[0] == 'I forgot to add file header.', 'The first line in the second task is invalid.'); - $this->ensure($content[5] == 'It works!', 'The sixth line in the second task is invalid.'); - } -} diff --git a/backend/hook/verifications/Escaped.php b/backend/hook/verifications/Escaped.php deleted file mode 100644 index 6fc7ea3..0000000 --- a/backend/hook/verifications/Escaped.php +++ /dev/null @@ -1,12 +0,0 @@ -getCommits()[0]; - $fileMode = GitUtils::getFileMode($commit, 'script.sh'); - $this->ensure(strpos(strval($fileMode), '755') !== false, 'The script.sh does not have executable bit set.'); - } -} diff --git a/backend/hook/verifications/FindBug.php b/backend/hook/verifications/FindBug.php deleted file mode 100644 index 5ebf84f..0000000 --- a/backend/hook/verifications/FindBug.php +++ /dev/null @@ -1,18 +0,0 @@ -getCommits(); - $lastContent = base64_decode($this->getFileContent($commits[0], 'home-screen-text.txt')[0]); - $this->ensure(strpos($lastContent, self::$swearword) !== false, 'The commit you have pushed does not contain jackass word.'); - $previousContent = base64_decode($this->getFileContent($commits[1], 'home-screen-text.txt')[0]); - $this->ensure(strpos($previousContent, self::$swearword) === false, 'The previous commit contains jackass word, too.'); - } -} diff --git a/backend/hook/verifications/FindSwearwords.php b/backend/hook/verifications/FindSwearwords.php deleted file mode 100644 index aea6dc8..0000000 --- a/backend/hook/verifications/FindSwearwords.php +++ /dev/null @@ -1,20 +0,0 @@ -ensureCommitsCount(106)); - $commitsWithShit = [23, 46, 94]; - foreach ($commitsWithShit as $commitIndex) { - $commitId = $commits[$commitIndex]; - $fileWithShit = $this->ensureFilesCount($commitId, 1); - $wordAddedInFile = end(array_filter($this->getFileContent($commitId, $fileWithShit))); - $this->ensure($wordAddedInFile != 'shit', 'There are still commits that introduce "shit" word instead of "flower".'); - $this->ensure($wordAddedInFile == 'flower', 'You mistakenly replaced "shit" word with "%s", not with a "flower".', [$wordAddedInFile]); - } - } -} diff --git a/backend/hook/verifications/FixOldTypo.php b/backend/hook/verifications/FixOldTypo.php deleted file mode 100644 index d0def20..0000000 --- a/backend/hook/verifications/FixOldTypo.php +++ /dev/null @@ -1,13 +0,0 @@ -ensureCommitsCount(2); - $this->verifyTypoIsFixed($commits[1]); - $fileContent = implode(' ', $this->getFileContent($commits[0], 'file.txt')); - $this->ensure($fileContent == 'Hello world Hello world is an excellent program.', "You haven't resolved the conflict correctly."); - } -} diff --git a/backend/hook/verifications/FixTypo.php b/backend/hook/verifications/FixTypo.php deleted file mode 100644 index 1c3d4ac..0000000 --- a/backend/hook/verifications/FixTypo.php +++ /dev/null @@ -1,25 +0,0 @@ -ensureCommitsCount(1); - $this->verifyTypoIsFixed($commit); - } - - protected function verifyTypoIsFixed($commit) - { - $file = $this->ensureFilesCount($commit, 1); - $this->ensure($file == 'file.txt', 'Invalid file has been commited: %s.', [$file]); - $firstLine = $this->getFileContent($commit, $file)[0]; - $this->ensure($firstLine == 'Hello world', 'You didn\'t fix the typo in file.txt.'); - $commitMessage = GitUtils::getCommitSubject($commit); - $this->ensure(!strpos($commitMessage, 'wordl'), 'You didn\'t fix the typo in commit message.'); - $this->ensure($commitMessage == 'Add Hello world', 'You have changed the commit message - it should be "Add Hello world".'); - } -} diff --git a/backend/hook/verifications/ForgeDate.php b/backend/hook/verifications/ForgeDate.php deleted file mode 100644 index 9841923..0000000 --- a/backend/hook/verifications/ForgeDate.php +++ /dev/null @@ -1,14 +0,0 @@ -ensureCommitsCount(1); - $date = GitUtils::getCommitDate($commit); - $this->ensure(strpos($date, '1987') === 0, "The date of the commit you have pushed is $date.\nIt does not look like 1987!"); - } -} diff --git a/backend/hook/verifications/IgnoreThem.php b/backend/hook/verifications/IgnoreThem.php deleted file mode 100644 index 85c2597..0000000 --- a/backend/hook/verifications/IgnoreThem.php +++ /dev/null @@ -1,24 +0,0 @@ -getCommits()[0]; - $randomName = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 8); - $this->ensure(GitUtils::checkIgnore($commit, "$randomName.exe"), "$randomName.exe file is not ignored"); - $this->ensure(GitUtils::checkIgnore($commit, "$randomName.jar"), "$randomName.jar file is not ignored"); - $this->ensure(GitUtils::checkIgnore($commit, "$randomName.o"), "$randomName.o file is not ignored"); - $this->ensure(GitUtils::checkIgnore($commit, 'libraries/'), "libraries directory is not ignored"); - $this->ensure(GitUtils::checkIgnore($commit, 'libraries/text.txt'), "txt file inside libraries directory is not ignored"); - $this->ensure(!GitUtils::checkIgnore($commit, 'libraries'), "File with name 'libraries' would be ignored but it should not."); - $this->ensure(!GitUtils::checkIgnore($commit, 'test.txt'), "File with name 'test.txt' would be ignored but it should not."); - $this->ensure(!GitUtils::checkIgnore($commit, 'libs'), "File with name 'libs' would be ignored but it should not."); - $this->ensure(!GitUtils::checkIgnore($commit, 'hello'), "File with name 'hello' would be ignored but it should not."); - $this->ensure(!GitUtils::checkIgnore($commit, 'jar'), "File with name 'jar' would be ignored but it should not."); - } -} diff --git a/backend/hook/verifications/InvalidOrder.php b/backend/hook/verifications/InvalidOrder.php deleted file mode 100644 index aec90b5..0000000 --- a/backend/hook/verifications/InvalidOrder.php +++ /dev/null @@ -1,21 +0,0 @@ -ensureCommitsCount(2)); - $this->ensure('This should be the first commit' == GitUtils::getCommitSubject($commits[0]), 'Invalid commit message of the first commit.'); - $this->ensure(GitUtils::getCommitSubject($commits[1]) == 'This should be the second commit', 'Invalid commit message of the first commit.'); - $file = $this->ensureFilesCount($commits[0], 1); - $this->ensure($file == 'first.txt', 'Invalid file %s commited in the first commit.', [$file]); - $this->ensure($this->getFileContent($commits[0], $file)[0] == '1', 'Invalid content of the file commited in the first commit.'); - $file = $this->ensureFilesCount($commits[1], 1); - $this->ensure($file == 'second.txt', 'Invalid file %s commited in the second commit.', [$file]); - $this->ensure($this->getFileContent($commits[1], $file)[0] == '2', 'Invalid content of the file commited in the second commit.'); - } -} diff --git a/backend/hook/verifications/Master.php b/backend/hook/verifications/Master.php deleted file mode 100644 index be7763f..0000000 --- a/backend/hook/verifications/Master.php +++ /dev/null @@ -1,21 +0,0 @@ -ensureCommitsCount(1); - $file = $this->ensureFilesCount($commit, 1); - $this->ensure($file == 'test.txt', 'The file that has been commited does not look like the generated one.'); - $fileContent = $this->getFileContent($commit, $file); - $this->ensure( - trim(implode('', $fileContent)) == self::$expectedContent, - 'The file that has been commited does not look like the generated one.' - ); - } -} diff --git a/backend/hook/verifications/MergeConflict.php b/backend/hook/verifications/MergeConflict.php deleted file mode 100644 index 8b5721c..0000000 --- a/backend/hook/verifications/MergeConflict.php +++ /dev/null @@ -1,19 +0,0 @@ -ensureCommitsCount(4)[0]; - $parents = GitUtils::getParents($mergeCommit); - $this->ensure(count($parents) == 2, 'The last commit should be a merge commit.'); - $lines = $this->getFileContent($mergeCommit, 'equation.txt'); - $this->ensure(count($lines) >= 1, 'You didn\'t resolve the conflict properly (too few lines).'); - $equation = preg_replace('#\s+#', '', $lines[0]); - $this->ensure($equation == '2+3=5' || $equation == '3+2=5', 'You didn\'t resolve the conflict properly (expected 2+3=5 equation).'); - } -} diff --git a/backend/hook/verifications/PickYourFeatures.php b/backend/hook/verifications/PickYourFeatures.php deleted file mode 100644 index d1f89ec..0000000 --- a/backend/hook/verifications/PickYourFeatures.php +++ /dev/null @@ -1,27 +0,0 @@ -ensureCommitsCount(4); - $featureA = $this->getFileContent($commits[2], 'program.txt'); - $this->ensure(count($featureA) == 3, 'Feature A has not been picked correctly.'); - $this->ensure($featureA[2] == 'This is complete feature A', 'Feature A has not been picked correctly.'); - $featureB = $this->getFileContent($commits[1], 'program.txt'); - $this->ensure(count($featureB) == 4, 'Feature B has not been picked correctly.'); - $this->ensure($featureB[0] == 'This is complete feature B', 'Feature B has not been picked correctly.'); - $this->ensure($featureA[2] == $featureB[3], 'Feature A has been broken after picking feature B.'); - $featureC = $this->getFileContent($commits[0], 'program.txt'); - $this->ensure(count($featureC) == 6, 'Feature C has not been picked correctly.'); - $this->ensure($featureB[0] == $featureC[0], 'Feature B has been broken after picking feature C.'); - $this->ensure($featureA[2] == $featureC[3], 'Feature A has been broken after picking feature C.'); - $this->ensure($featureC[4] == 'This is first part Feature C', 'Feature C has not been picked correctly.'); - $this->ensure($featureC[5] == 'This is second part of Feature C', 'Feature C has not been picked correctly.'); - $this->ensure($featureC[1] == 'This is base version of the program.', 'Base version of a program has been broken.'); - $this->ensure($featureC[2] == 'It has only two lines at the beginning.', 'Base version of a program has been broken.'); - } -} diff --git a/backend/hook/verifications/RebaseComplex.php b/backend/hook/verifications/RebaseComplex.php deleted file mode 100644 index 87f8f1d..0000000 --- a/backend/hook/verifications/RebaseComplex.php +++ /dev/null @@ -1,26 +0,0 @@ -ensureCommitsCount(5); - for ($i = 0; $i < 5; $i++) { - $this->ensure(GitUtils::getCommitSubject($commits[$i]) == self::$expectedMessages[$i], - 'Commit #%d has invalid message, should be "%s".', [5 - $i, self::$expectedMessages[$i]]); - - } - } -} diff --git a/backend/hook/verifications/RemoveIgnored.php b/backend/hook/verifications/RemoveIgnored.php deleted file mode 100644 index 85d8831..0000000 --- a/backend/hook/verifications/RemoveIgnored.php +++ /dev/null @@ -1,17 +0,0 @@ -ensureCommitsCount(3)[0]; - $this->ensureFilesCount($commit, 1); - $files = GitUtils::getChangedFiles($commit); - $this->ensure(isset($files['ignored.txt']), "You were supposed to remove ignored.txt file."); - $this->ensure($files['ignored.txt'] == 'D', "You were supposed to remove ignored.txt file, not change it."); - } -} diff --git a/backend/hook/verifications/SaveYourWork.php b/backend/hook/verifications/SaveYourWork.php deleted file mode 100644 index 65f8f8c..0000000 --- a/backend/hook/verifications/SaveYourWork.php +++ /dev/null @@ -1,21 +0,0 @@ -ensureCommitsCount(3); - $this->ensureFilesCount($commits[1], 1); - $buggy = $this->getFileContent($commits[1], 'bug.txt'); - $this->ensure(count($buggy) == 4, "You were supposed to remove bug only in the first commit."); - $this->ensure($buggy[3] == 'How this program could work with such bug?', "You haven't removed the bug in the first commit."); - $this->ensureFilesCount($commits[0], 2); - $buggy = $this->getFileContent($commits[0], 'bug.txt'); - $this->ensure(count($buggy) > 5, 'You should have committed all your recent work in the last commit.'); - $this->ensure(count($buggy) == 7, 'You should have finished your recent work and committed it all in the last commit.'); - $this->ensure($buggy[6] == 'Finally, finished it!', "You haven't finished your work properly."); - } -} diff --git a/backend/hook/verifications/SplitCommit.php b/backend/hook/verifications/SplitCommit.php deleted file mode 100644 index e621e05..0000000 --- a/backend/hook/verifications/SplitCommit.php +++ /dev/null @@ -1,16 +0,0 @@ -ensureCommitsCount(2); - $file = $this->ensureFilesCount($commits[1], 1); - $this->ensure($file == 'first.txt', 'The first commit should add first.txt.'); - $file = $this->ensureFilesCount($commits[0], 1); - $this->ensure($file == 'second.txt', 'The second commit should add second.txt.'); - } -} diff --git a/backend/hook/verifications/TooManyCommits.php b/backend/hook/verifications/TooManyCommits.php deleted file mode 100644 index 6b0966c..0000000 --- a/backend/hook/verifications/TooManyCommits.php +++ /dev/null @@ -1,20 +0,0 @@ -ensureCommitsCount(1); - $file = $this->ensureFilesCount($commit, 1); - $this->ensure($file == 'file.txt', 'The file that has been commited does not look like the generated one.'); - $fileLines = $this->getFileContent($commit, 'file.txt'); - $this->ensure(count($fileLines) == 2, 'file.txt is supposed to have 2 lines after squash. Received %d.', [count($fileLines)]); - $this->ensure($fileLines[0] == 'This is the first line.', 'Invalid first line in the file.'); - $this->ensure($fileLines[1] == 'This is the second line I have forgotten.', 'Invalid second line in the file.'); - $this->ensure(GitUtils::getCommitSubject($commit) == 'Add file.txt', 'You should leave commit message as it was in the first commit.'); - } -} diff --git a/docker/Dockerfile b/docker/Dockerfile index e74423e..d6d9a89 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -65,8 +65,9 @@ RUN git clone --bare ${GIT_REPO} git/exercises.git # Copy the hints into the backend RUN cd git/exercises.git && \ git worktree add /tmp/hints hints && \ - mv /tmp/hints /var/www/website/backend/hook/hints && \ - git worktree prune + mv /tmp/hints/verifications /var/www/website/backend/hook/verifications && \ + mv /tmp/hints/hints /var/www/website/backend/hook/hints && \ + git worktree remove --force hints RUN ln -s /var/www/website/backend/hook/hook.php git/exercises.git/hooks/update COPY ./docker/git-config git/exercises.git/config From 30a4ca42cc18b4eafe10e457a5d2ed2c681020e9 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Wed, 28 Dec 2022 01:07:48 -0500 Subject: [PATCH 51/83] Renamed branch verifications to website --- docker/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index d6d9a89..9a8a766 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -62,18 +62,18 @@ RUN mkdir git workingarea \ # Get the exercises RUN git clone --bare ${GIT_REPO} git/exercises.git -# Copy the hints into the backend +# Copy the hints and verifications into the backend RUN cd git/exercises.git && \ - git worktree add /tmp/hints hints && \ + git worktree add /tmp/hints verifications && \ mv /tmp/hints/verifications /var/www/website/backend/hook/verifications && \ mv /tmp/hints/hints /var/www/website/backend/hook/hints && \ - git worktree remove --force hints + git worktree remove --force verifications RUN ln -s /var/www/website/backend/hook/hook.php git/exercises.git/hooks/update COPY ./docker/git-config git/exercises.git/config WORKDIR /var/www/git/exercises.git -RUN git checkout master && git branch -D verifications hints +RUN git checkout master && git branch -D verifications website ARG WWW_DATA_UID=1001 RUN usermod --uid "$WWW_DATA_UID" www-data \ From d4afcd7f09a21f684b4172906e4b528de056e641 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Wed, 28 Dec 2022 01:19:31 -0500 Subject: [PATCH 52/83] Corrected the worktree path --- docker/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 9a8a766..86d0861 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -58,7 +58,7 @@ COPY --from=backend_build /var/www/vendor website/backend/vendor COPY --from=frontend_build /app/ website/frontend/ RUN mkdir git workingarea \ - && touch v5 + && touch v7 # Get the exercises RUN git clone --bare ${GIT_REPO} git/exercises.git @@ -67,7 +67,7 @@ RUN cd git/exercises.git && \ git worktree add /tmp/hints verifications && \ mv /tmp/hints/verifications /var/www/website/backend/hook/verifications && \ mv /tmp/hints/hints /var/www/website/backend/hook/hints && \ - git worktree remove --force verifications + git worktree remove --force /tmp/hints RUN ln -s /var/www/website/backend/hook/hook.php git/exercises.git/hooks/update COPY ./docker/git-config git/exercises.git/config From 0890eac56564d0a48ecc6108206015cb27b12394 Mon Sep 17 00:00:00 2001 From: Patrick Lafrance Date: Wed, 28 Dec 2022 22:11:51 -0500 Subject: [PATCH 53/83] Allowed display on small screens --- frontend/app/home/start-commands.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/app/home/start-commands.html b/frontend/app/home/start-commands.html index b7807b0..af74c5a 100644 --- a/frontend/app/home/start-commands.html +++ b/frontend/app/home/start-commands.html @@ -1,5 +1,5 @@
-