├── .gitignore ├── Gruntfile.js ├── LICENSE ├── README.md ├── bower.json ├── demo ├── basic.html ├── callbacks.html ├── custom-results-screen.html ├── custom-scoring.html ├── localization.html ├── multiple.html └── no-fail.html ├── dist ├── jquery.quiz-min.css └── jquery.quiz-min.js ├── package-lock.json ├── package.json └── src ├── jquery.quiz.css └── jquery.quiz.js /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .DS_STORE 3 | node_modules -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | 3 | 'use strict'; 4 | 5 | grunt.initConfig({ 6 | pkg: grunt.file.readJSON('package.json'), 7 | meta: { 8 | banner : '/*!\n' + 9 | ' * <%= pkg.title %> v<%= pkg.version %> - <%= pkg.description %>\n' + 10 | ' * Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %> - <%= pkg.homepage %>\n' + 11 | ' * License: <%= pkg.license %>\n' + 12 | ' */\n\n' 13 | }, 14 | uglify: { 15 | options : { 16 | banner : '<%= meta.banner %>' 17 | //report: 'gzip' 18 | }, 19 | dist: { 20 | files: { 21 | 'dist/jquery.quiz-min.js': ['src/jquery.quiz.js'] 22 | } 23 | } 24 | }, 25 | cssmin: { 26 | dist: { 27 | files: { 28 | 'dist/jquery.quiz-min.css': ['src/jquery.quiz.css'] 29 | } 30 | } 31 | } 32 | }); 33 | 34 | grunt.loadNpmTasks('grunt-contrib-uglify'); 35 | grunt.loadNpmTasks('grunt-contrib-cssmin'); 36 | 37 | grunt.registerTask('default', [ 38 | 'uglify', 39 | 'cssmin' 40 | ]); 41 | 42 | }; -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 JC Hamill 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # jQuery Quiz Plugin 2 | 3 | A simple jQuery quiz plugin. 4 | 5 | [Demo](https://jchamill.com/projects/jquery-quiz) 6 | 7 | ## Disclaimer 8 | 9 | This is a very simple quiz plugin I created to port quizzes from 10 | an existing platform. It creates simple multiple choice quizzes. 11 | You can customize most of the screens that are displayed, as well 12 | as the text displayed. 13 | 14 | ## Usage 15 | 16 | ### HTML 17 | 18 | ``` 19 |
20 |
21 |

Basic Quiz Demo

22 | 23 |

Home

24 |
25 |
26 |

Start

27 |
28 |
29 | ``` 30 | 31 | You may optionally add other HTML, this is just the markup 32 | required by the plugin (although home button is optional). 33 | 34 | ### Javascript 35 | 36 | ```javascript 37 | $('#quiz').quiz({ 38 | questions: [ 39 | { 40 | 'q': 'A smaple question?', 41 | 'options': [ 42 | 'Answer 1', 43 | 'Answer 2', 44 | 'Answer 3', 45 | 'Answer 4' 46 | ], 47 | 'correctIndex': 1, 48 | 'correctResponse': 'Custom correct response.', 49 | 'incorrectResponse': 'Custom incorrect response.' 50 | } 51 | ] 52 | }); 53 | ``` 54 | 55 | Add as many questions as you like. You may also specify a 56 | different number of options (answers) for each question. 57 | 58 | Don't forget to include jQuery. 59 | 60 | #### Options 61 | 62 | `allowIncorrect: boolean [default: true]` 63 | > If false, the quiz will show the gameOver screen if a 64 | > question is answered incorrectly. This will force the user 65 | > to get a perfect score to complete the quiz. 66 | 67 | `counter: boolean [default: true]` 68 | > If true, a counter will be shown displaying the current 69 | > question and how many questions there are. The output 70 | > of the counter can be customized using `counterFormat`. 71 | 72 | `counterFormat: string [default: '%current/%total']` 73 | > Specify the counter format. The placehoder `%current` 74 | > displays which question you are currently on. The placeholder 75 | > `%total` displays the total number of questions. 76 | 77 | `startScreen: string [default: '.quiz-start-screen']` 78 | > The id selector of the start screen. The start screen should 79 | > contain the start button. 80 | 81 | `startButton: string [default: '.quiz-start-btn']` 82 | > The id selector of the start button. 83 | 84 | `homeButton: string [default: '.quiz-home-btn']` 85 | > The id selector of the home button. 86 | 87 | `resultsScreen: string [default: '.quiz-results-screen']` 88 | > The id selector of the results screen. This screen will 89 | > display the number of questions correct. 90 | 91 | `resultsFormat: string [default: 'You got %score out of %total correct!']` 92 | > Specify the results format. The placehoder `%score` 93 | > displays how many questions you got correct. The placeholder 94 | > `%total` displays the total number of questions. 95 | 96 | `gameOverScreen: string [default: '.quiz-gameover-screen']` 97 | > The id selector of the game over screen. This screen is 98 | > used when `allowIncorrect` is set to false. 99 | 100 | `nextButtonText: string [default: 'Next']` 101 | > The text to display on the next button. 102 | 103 | `finishButtonText: string [default: 'Finish']` 104 | > The text to display on the finish button. 105 | 106 | `restartButtonText: string [default: 'Restart']` 107 | > The text to display on the restart button. 108 | 109 | #### Callbacks 110 | 111 | `setupCallback: function [default: undefined]` 112 | > Callback fired after quiz is setup. 113 | 114 | `answerCallback: function [default: undefined]` 115 | > Callback fired after an answer is selected. 116 | 117 | `nextCallback: function [default: undefined]` 118 | > Callback fired after the next button is clicked. 119 | 120 | `finishCallback: function [default: undefined]` 121 | > Callback fired after the finish button is clicked. 122 | 123 | `homeCallback: function [default: undefined]` 124 | > Callback fired after the home button is clicked. 125 | 126 | `resetCallback: function [default: undefined]` 127 | > Callback fired after the the quiz is reset. This happens when the home and finish button are clicked. -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery-quiz", 3 | "version": "0.0.1", 4 | "authors": [ 5 | "JC Hamill =1.6" 15 | }, 16 | "ignore": [ 17 | "**/.*", 18 | "demo", 19 | "node_modules" 20 | ] 21 | } -------------------------------------------------------------------------------- /demo/basic.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | jQuery Quiz 5 | 6 | 7 | 8 |
9 |
10 |

Basic Quiz Demo

11 |

Home

12 |
13 |
14 |

Start

15 |
16 |
17 | 18 | 19 | 20 | 81 | 82 | -------------------------------------------------------------------------------- /demo/callbacks.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | jQuery Quiz: Callbacks 5 | 6 | 7 | 8 |
9 |
10 |

Callbacks Quiz Demo

11 |

Home

12 |
13 |
14 |
Click to Start
15 |
16 | 17 | 34 |
35 | 36 | 37 | 38 | 128 | 129 | -------------------------------------------------------------------------------- /demo/custom-results-screen.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | jQuery Quiz 5 | 6 | 13 | 14 | 15 |
16 |
17 |

Custom Results Screen Quiz Demo

18 |

Home

19 |
20 |
21 |

Start

22 |
23 | 24 | 25 |
26 |

Thank You!

27 |

28 |
29 |

30 | 31 | 32 |

33 |

34 |
35 |
36 |
37 | 38 | 39 | 40 | 74 | 75 | -------------------------------------------------------------------------------- /demo/custom-scoring.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | jQuery Quiz: Custom Scoring 5 | 6 | 7 | 8 |
9 |
10 |

Custom Scoring Quiz Demo

11 |

Home

12 |
13 |
14 |
Click to Start
15 |
16 |
17 | 18 | 19 | 20 | 110 | 111 | -------------------------------------------------------------------------------- /demo/localization.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | jQuery Quiz 5 | 6 | 7 | 8 |
9 |
10 |

Localization Quiz Demo

11 |

Inicio

12 |
13 |
14 |

Comienzo

15 |
16 |
17 |

Terminar

18 |

19 |
20 |
21 | 22 | 23 | 24 | 59 | 60 | -------------------------------------------------------------------------------- /demo/multiple.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | jQuery Quiz 5 | 6 | 7 | 8 |
9 |
10 |

Multiple Quiz Demo

11 |

Home

12 |
13 |
14 |

Start

15 |
16 |
17 | 18 |
19 |
20 |

Another Quiz Demo

21 |

Home

22 |
23 |
24 |

Start

25 |
26 |
27 | 28 | 29 | 30 | 97 | 98 | -------------------------------------------------------------------------------- /demo/no-fail.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | jQuery Quiz 5 | 6 | 7 | 8 |
9 |
10 |

No Fail Quiz Demo

11 |

Home

12 |
13 |
14 |

Custom Start Screen

15 |
Begin
16 |
17 |
18 |

You did it!

19 |
20 |
21 |

Sorry, you failed!

22 |

23 |

Retry

24 |
25 |
26 | 27 | 28 | 29 | 94 | 95 | -------------------------------------------------------------------------------- /dist/jquery.quiz-min.css: -------------------------------------------------------------------------------- 1 | .quiz-container{padding:1em;max-width:100%;margin:1em auto}.quiz-container a{text-decoration:none;color:#333}.quiz-counter,.quiz-header,.quiz-results-screen,.quiz-start-screen{text-align:center}.question{font-size:1.25em}.answers{list-style:none;padding:0}.answers a{display:block;padding:.5em 1em;margin-bottom:.5em;background:#fff;border-radius:10px}.answers a.correct{background:#090}.answers a.incorrect{background:#c00}.answers a.correct,.answers a.incorrect{color:#fff}.quiz-controls{background:#333;color:#fff;padding:.5em 1em;text-align:center;border-radius:10px}.quiz-results{font-size:1.25em}.quiz-buttons a,.quiz-container .quiz-button{display:inline-block;padding:.5em 1em;background:#333;color:#fff;border-radius:10px}.quiz-buttons a{background:#fff;color:#333}.quiz-results-state .quiz-controls{background:0 0;padding:0}.quiz-results-state .quiz-buttons a{background:#333;color:#fff} -------------------------------------------------------------------------------- /dist/jquery.quiz-min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jquery-quiz v0.0.1 - A simple jQuery quiz plugin. 3 | * Copyright (c) 2023 JC Hamill - http://jchamill.github.com/jquery-quiz/ 4 | * License: MIT 5 | */ 6 | 7 | 8 | !function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):"undefined"!=typeof exports?module.exports=e(require("jquery")):e(jQuery)}(function(B){"use strict";B.quiz=function(e,t){var i=this;i.$el=B(e),i.$el.data("quiz",i),i.options=B.extend(B.quiz.defaultOptions,t);var o=i.options.questions,a=o.length,t=i.options.startScreen,n=i.$el.find(t),s=i.options.startButton,u=i.options.homeButton,r=i.options.resultsScreen,l=i.$el.find(r),c=i.options.gameOverScreen,d=i.$el.find(c),f=i.options.nextButtonText,h=i.options.finishButtonText,p=i.options.restartButtonText,q=1,v=0,m=!1,z=null,C=null,$=null,b=null,w=null,x=null,k=null,y=null,g=null;i.methods={init:function(){i.methods.setup(),i.$el.off(),i.$el.on("click",s,function(e){e.preventDefault(),i.methods.start()}),i.$el.on("click",u,function(e){e.preventDefault(),i.methods.home()}),i.$el.on("click",".answers a",function(e){e.preventDefault(),i.methods.answerQuestion(this)}),i.$el.on("click",".quiz-next-btn",function(e){e.preventDefault(),i.methods.nextQuestion()}),i.$el.on("click",".quiz-finish-btn",function(e){e.preventDefault(),i.methods.finish()}),i.$el.on("click",".quiz-restart-btn, .quiz-retry-btn",function(e){e.preventDefault(),i.methods.restart()})},setup:function(){var n="";i.options.counter&&(n+='
'),n+='
',B.each(o,function(e,t){n+='
',n+='

'+t.q+"

",n+='
    ',B.each(t.options,function(e,t){n+='
  • '+t+"
  • "}),n+="
",n+="
"}),n+="
",0===l.length&&(n+='
',n+='

',n+="
"),n+='
',n+='

',n+='
',n+=''+f+"",n+=''+h+"",n+=''+p+"",n+="
",i.$el.append(n+="
").addClass("quiz-container quiz-start-state"),0===l.length&&(l=i.$el.find(r)),z=i.$el.find(".quiz-results"),w=i.$el.find(".quiz-controls"),x=i.$el.find(".questions"),k=i.$el.find(".quiz-counter"),y=i.$el.find(".quiz-response"),g=i.$el.find(".question-container"),C=i.$el.find(".quiz-next-btn"),$=i.$el.find(".quiz-finish-btn"),b=i.$el.find(".quiz-restart-btn"),k.hide(),g.hide(),d.hide(),l.hide(),w.hide(),"function"==typeof i.options.setupCallback&&i.options.setupCallback()},start:function(){i.$el.removeClass("quiz-start-state").addClass("quiz-questions-state"),n.hide(),w.hide(),$.hide(),b.hide(),x.show(),k.show(),g.first().show().addClass("active-question"),i.methods.updateCounter()},answerQuestion:function(e){if(!m){m=!0;var t=B(e),n="",s=t.data("index"),e=q-1;if(s===o[e].correctIndex)t.addClass("correct"),n=o[e].correctResponse,v++;else if(t.addClass("incorrect"),n=o[e].incorrectResponse,!i.options.allowIncorrect)return void i.methods.gameOver(n);q++===a&&(C.hide(),$.show()),y.html(n),w.fadeIn(),"function"==typeof i.options.answerCallback&&i.options.answerCallback(q,s,o[e])}},nextQuestion:function(){m=!1,i.$el.find(".active-question").hide().removeClass("active-question").next(".question-container").show().addClass("active-question"),w.hide(),i.methods.updateCounter(),"function"==typeof i.options.nextCallback&&i.options.nextCallback()},gameOver:function(e){var t;0===d.length&&(t="",t+='
',t+='

',t+='

'+p+"

",i.$el.append(t+="
")),i.$el.find(".quiz-gameover-response").html(e),k.hide(),x.hide(),$.hide(),d.show()},finish:function(){i.$el.removeClass("quiz-questions-state").addClass("quiz-results-state"),i.$el.find(".active-question").hide().removeClass("active-question"),k.hide(),y.hide(),$.hide(),C.hide(),b.show(),l.show();var e=i.options.resultsFormat.replace("%score",v).replace("%total",a);z.html(e),"function"==typeof i.options.finishCallback&&i.options.finishCallback()},restart:function(){i.methods.reset(),i.$el.addClass("quiz-questions-state"),x.show(),k.show(),g.first().show().addClass("active-question"),i.methods.updateCounter()},reset:function(){m=!1,q=1,v=0,i.$el.find(".answers a").removeClass("correct incorrect"),i.$el.removeClass().addClass("quiz-container"),b.hide(),d.hide(),l.hide(),w.hide(),y.show(),C.show(),k.hide(),i.$el.find(".active-question").hide().removeClass("active-question"),"function"==typeof i.options.resetCallback&&i.options.resetCallback()},home:function(){i.methods.reset(),i.$el.addClass("quiz-start-state"),n.show(),"function"==typeof i.options.homeCallback&&i.options.homeCallback()},updateCounter:function(){var e=i.options.counterFormat.replace("%current",q).replace("%total",a);k.html(e)}},i.methods.init()},B.quiz.defaultOptions={allowIncorrect:!0,counter:!0,counterFormat:"%current/%total",startScreen:".quiz-start-screen",startButton:".quiz-start-btn",homeButton:".quiz-home-btn",resultsScreen:".quiz-results-screen",resultsFormat:"You got %score out of %total correct!",gameOverScreen:".quiz-gameover-screen",nextButtonText:"Next",finishButtonText:"Finish",restartButtonText:"Restart"},B.fn.quiz=function(e){return this.each(function(){new B.quiz(this,e)})}}); -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery-quiz", 3 | "version": "0.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.1.1", 9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 10 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 11 | "dev": true 12 | }, 13 | "ansi-regex": { 14 | "version": "2.1.1", 15 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 16 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 17 | "dev": true 18 | }, 19 | "ansi-styles": { 20 | "version": "4.3.0", 21 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 22 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 23 | "dev": true, 24 | "requires": { 25 | "color-convert": "^2.0.1" 26 | } 27 | }, 28 | "argparse": { 29 | "version": "1.0.10", 30 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 31 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 32 | "dev": true, 33 | "requires": { 34 | "sprintf-js": "~1.0.2" 35 | }, 36 | "dependencies": { 37 | "sprintf-js": { 38 | "version": "1.0.3", 39 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 40 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 41 | "dev": true 42 | } 43 | } 44 | }, 45 | "array-each": { 46 | "version": "1.0.1", 47 | "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", 48 | "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", 49 | "dev": true 50 | }, 51 | "array-slice": { 52 | "version": "1.1.0", 53 | "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", 54 | "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", 55 | "dev": true 56 | }, 57 | "async": { 58 | "version": "3.2.3", 59 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", 60 | "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", 61 | "dev": true 62 | }, 63 | "balanced-match": { 64 | "version": "1.0.2", 65 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 66 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 67 | "dev": true 68 | }, 69 | "brace-expansion": { 70 | "version": "1.1.11", 71 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 72 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 73 | "dev": true, 74 | "requires": { 75 | "balanced-match": "^1.0.0", 76 | "concat-map": "0.0.1" 77 | } 78 | }, 79 | "braces": { 80 | "version": "3.0.2", 81 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 82 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 83 | "dev": true, 84 | "requires": { 85 | "fill-range": "^7.0.1" 86 | } 87 | }, 88 | "chalk": { 89 | "version": "4.1.1", 90 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", 91 | "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", 92 | "dev": true, 93 | "requires": { 94 | "ansi-styles": "^4.1.0", 95 | "supports-color": "^7.1.0" 96 | } 97 | }, 98 | "clean-css": { 99 | "version": "5.1.2", 100 | "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.1.2.tgz", 101 | "integrity": "sha512-QcaGg9OuMo+0Ds933yLOY+gHPWbxhxqF0HDexmToPf8pczvmvZGYzd+QqWp9/mkucAOKViI+dSFOqoZIvXbeBw==", 102 | "dev": true, 103 | "requires": { 104 | "source-map": "~0.6.0" 105 | } 106 | }, 107 | "color-convert": { 108 | "version": "2.0.1", 109 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 110 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 111 | "dev": true, 112 | "requires": { 113 | "color-name": "~1.1.4" 114 | } 115 | }, 116 | "color-name": { 117 | "version": "1.1.4", 118 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 119 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 120 | "dev": true 121 | }, 122 | "colors": { 123 | "version": "1.1.2", 124 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", 125 | "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", 126 | "dev": true 127 | }, 128 | "concat-map": { 129 | "version": "0.0.1", 130 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 131 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 132 | "dev": true 133 | }, 134 | "dateformat": { 135 | "version": "3.0.3", 136 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", 137 | "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", 138 | "dev": true 139 | }, 140 | "detect-file": { 141 | "version": "1.0.0", 142 | "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", 143 | "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", 144 | "dev": true 145 | }, 146 | "duplexer": { 147 | "version": "0.1.2", 148 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", 149 | "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", 150 | "dev": true 151 | }, 152 | "escape-string-regexp": { 153 | "version": "1.0.5", 154 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 155 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 156 | "dev": true 157 | }, 158 | "esprima": { 159 | "version": "4.0.1", 160 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 161 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 162 | "dev": true 163 | }, 164 | "eventemitter2": { 165 | "version": "0.4.14", 166 | "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", 167 | "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", 168 | "dev": true 169 | }, 170 | "exit": { 171 | "version": "0.1.2", 172 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 173 | "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", 174 | "dev": true 175 | }, 176 | "expand-tilde": { 177 | "version": "2.0.2", 178 | "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", 179 | "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", 180 | "dev": true, 181 | "requires": { 182 | "homedir-polyfill": "^1.0.1" 183 | } 184 | }, 185 | "extend": { 186 | "version": "3.0.2", 187 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 188 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 189 | "dev": true 190 | }, 191 | "figures": { 192 | "version": "1.7.0", 193 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 194 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 195 | "dev": true, 196 | "requires": { 197 | "escape-string-regexp": "^1.0.5", 198 | "object-assign": "^4.1.0" 199 | } 200 | }, 201 | "fill-range": { 202 | "version": "7.0.1", 203 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 204 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 205 | "dev": true, 206 | "requires": { 207 | "to-regex-range": "^5.0.1" 208 | } 209 | }, 210 | "findup-sync": { 211 | "version": "0.3.0", 212 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", 213 | "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", 214 | "dev": true, 215 | "requires": { 216 | "glob": "~5.0.0" 217 | }, 218 | "dependencies": { 219 | "glob": { 220 | "version": "5.0.15", 221 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 222 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 223 | "dev": true, 224 | "requires": { 225 | "inflight": "^1.0.4", 226 | "inherits": "2", 227 | "minimatch": "2 || 3", 228 | "once": "^1.3.0", 229 | "path-is-absolute": "^1.0.0" 230 | } 231 | } 232 | } 233 | }, 234 | "fined": { 235 | "version": "1.2.0", 236 | "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", 237 | "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", 238 | "dev": true, 239 | "requires": { 240 | "expand-tilde": "^2.0.2", 241 | "is-plain-object": "^2.0.3", 242 | "object.defaults": "^1.1.0", 243 | "object.pick": "^1.2.0", 244 | "parse-filepath": "^1.0.1" 245 | } 246 | }, 247 | "flagged-respawn": { 248 | "version": "1.0.1", 249 | "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", 250 | "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", 251 | "dev": true 252 | }, 253 | "for-in": { 254 | "version": "1.0.2", 255 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 256 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 257 | "dev": true 258 | }, 259 | "for-own": { 260 | "version": "1.0.0", 261 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", 262 | "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", 263 | "dev": true, 264 | "requires": { 265 | "for-in": "^1.0.1" 266 | } 267 | }, 268 | "fs.realpath": { 269 | "version": "1.0.0", 270 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 271 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 272 | "dev": true 273 | }, 274 | "function-bind": { 275 | "version": "1.1.1", 276 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 277 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 278 | "dev": true 279 | }, 280 | "getobject": { 281 | "version": "1.0.2", 282 | "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", 283 | "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", 284 | "dev": true 285 | }, 286 | "glob": { 287 | "version": "7.1.7", 288 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 289 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 290 | "dev": true, 291 | "requires": { 292 | "fs.realpath": "^1.0.0", 293 | "inflight": "^1.0.4", 294 | "inherits": "2", 295 | "minimatch": "^3.0.4", 296 | "once": "^1.3.0", 297 | "path-is-absolute": "^1.0.0" 298 | } 299 | }, 300 | "global-modules": { 301 | "version": "1.0.0", 302 | "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", 303 | "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", 304 | "dev": true, 305 | "requires": { 306 | "global-prefix": "^1.0.1", 307 | "is-windows": "^1.0.1", 308 | "resolve-dir": "^1.0.0" 309 | } 310 | }, 311 | "global-prefix": { 312 | "version": "1.0.2", 313 | "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", 314 | "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", 315 | "dev": true, 316 | "requires": { 317 | "expand-tilde": "^2.0.2", 318 | "homedir-polyfill": "^1.0.1", 319 | "ini": "^1.3.4", 320 | "is-windows": "^1.0.1", 321 | "which": "^1.2.14" 322 | } 323 | }, 324 | "grunt": { 325 | "version": "1.5.2", 326 | "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.2.tgz", 327 | "integrity": "sha512-XCtfaIu72OyDqK24MjWiGC9SwlkuhkS1mrULr1xzuJ2XqAFhP3ZAchZGHJeSCY6mkaOXU4F7SbmmCF7xIVoC9w==", 328 | "dev": true, 329 | "requires": { 330 | "dateformat": "~3.0.3", 331 | "eventemitter2": "~0.4.13", 332 | "exit": "~0.1.2", 333 | "findup-sync": "~0.3.0", 334 | "glob": "~7.1.6", 335 | "grunt-cli": "~1.4.3", 336 | "grunt-known-options": "~2.0.0", 337 | "grunt-legacy-log": "~3.0.0", 338 | "grunt-legacy-util": "~2.0.1", 339 | "iconv-lite": "~0.4.13", 340 | "js-yaml": "~3.14.0", 341 | "minimatch": "~3.0.4", 342 | "mkdirp": "~1.0.4", 343 | "nopt": "~3.0.6", 344 | "rimraf": "~3.0.2" 345 | }, 346 | "dependencies": { 347 | "grunt-cli": { 348 | "version": "1.4.3", 349 | "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", 350 | "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", 351 | "dev": true, 352 | "requires": { 353 | "grunt-known-options": "~2.0.0", 354 | "interpret": "~1.1.0", 355 | "liftup": "~3.0.1", 356 | "nopt": "~4.0.1", 357 | "v8flags": "~3.2.0" 358 | }, 359 | "dependencies": { 360 | "nopt": { 361 | "version": "4.0.3", 362 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", 363 | "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", 364 | "dev": true, 365 | "requires": { 366 | "abbrev": "1", 367 | "osenv": "^0.1.4" 368 | } 369 | } 370 | } 371 | }, 372 | "grunt-known-options": { 373 | "version": "2.0.0", 374 | "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", 375 | "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", 376 | "dev": true 377 | } 378 | } 379 | }, 380 | "grunt-cli": { 381 | "version": "1.4.2", 382 | "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.2.tgz", 383 | "integrity": "sha512-wsu6BZh7KCnfeaSkDrKIAvOlqGKxNRTZjc8xfZlvxCByQIqUfZ31kh5uHpPnhQ4NdVgvaWaVxa1LUbVU80nACw==", 384 | "dev": true, 385 | "requires": { 386 | "grunt-known-options": "~1.1.1", 387 | "interpret": "~1.1.0", 388 | "liftup": "~3.0.1", 389 | "nopt": "~4.0.1", 390 | "v8flags": "~3.2.0" 391 | }, 392 | "dependencies": { 393 | "nopt": { 394 | "version": "4.0.3", 395 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", 396 | "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", 397 | "dev": true, 398 | "requires": { 399 | "abbrev": "1", 400 | "osenv": "^0.1.4" 401 | } 402 | } 403 | } 404 | }, 405 | "grunt-contrib-cssmin": { 406 | "version": "4.0.0", 407 | "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-4.0.0.tgz", 408 | "integrity": "sha512-jXU+Zlk8Q8XztOGNGpjYlD/BDQ0n95IHKrQKtFR7Gd8hZrzgqiG1Ra7cGYc8h2DD9vkSFGNlweb9Q00rBxOK2w==", 409 | "dev": true, 410 | "requires": { 411 | "chalk": "^4.1.0", 412 | "clean-css": "^5.0.1", 413 | "maxmin": "^3.0.0" 414 | }, 415 | "dependencies": { 416 | "figures": { 417 | "version": "3.2.0", 418 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", 419 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 420 | "dev": true, 421 | "requires": { 422 | "escape-string-regexp": "^1.0.5" 423 | } 424 | }, 425 | "gzip-size": { 426 | "version": "5.1.1", 427 | "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", 428 | "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", 429 | "dev": true, 430 | "requires": { 431 | "duplexer": "^0.1.1", 432 | "pify": "^4.0.1" 433 | } 434 | }, 435 | "maxmin": { 436 | "version": "3.0.0", 437 | "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-3.0.0.tgz", 438 | "integrity": "sha512-wcahMInmGtg/7c6a75fr21Ch/Ks1Tb+Jtoan5Ft4bAI0ZvJqyOw8kkM7e7p8hDSzY805vmxwHT50KcjGwKyJ0g==", 439 | "dev": true, 440 | "requires": { 441 | "chalk": "^4.1.0", 442 | "figures": "^3.2.0", 443 | "gzip-size": "^5.1.1", 444 | "pretty-bytes": "^5.3.0" 445 | } 446 | }, 447 | "pretty-bytes": { 448 | "version": "5.6.0", 449 | "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", 450 | "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", 451 | "dev": true 452 | } 453 | } 454 | }, 455 | "grunt-contrib-uglify": { 456 | "version": "5.0.1", 457 | "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-5.0.1.tgz", 458 | "integrity": "sha512-T/aXZ4WIpAtoswZqb6HROKg7uq9QbKwl+lUuOwK4eoFj3tFv9/a/oMyd3/qvetV29Pbf8P1YYda1gDwZppr60A==", 459 | "dev": true, 460 | "requires": { 461 | "chalk": "^2.4.1", 462 | "maxmin": "^2.1.0", 463 | "uglify-js": "^3.13.3", 464 | "uri-path": "^1.0.0" 465 | }, 466 | "dependencies": { 467 | "ansi-styles": { 468 | "version": "3.2.1", 469 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 470 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 471 | "dev": true, 472 | "requires": { 473 | "color-convert": "^1.9.0" 474 | } 475 | }, 476 | "chalk": { 477 | "version": "2.4.2", 478 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 479 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 480 | "dev": true, 481 | "requires": { 482 | "ansi-styles": "^3.2.1", 483 | "escape-string-regexp": "^1.0.5", 484 | "supports-color": "^5.3.0" 485 | } 486 | }, 487 | "color-convert": { 488 | "version": "1.9.3", 489 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 490 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 491 | "dev": true, 492 | "requires": { 493 | "color-name": "1.1.3" 494 | } 495 | }, 496 | "color-name": { 497 | "version": "1.1.3", 498 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 499 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 500 | "dev": true 501 | }, 502 | "has-flag": { 503 | "version": "3.0.0", 504 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 505 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 506 | "dev": true 507 | }, 508 | "supports-color": { 509 | "version": "5.5.0", 510 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 511 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 512 | "dev": true, 513 | "requires": { 514 | "has-flag": "^3.0.0" 515 | } 516 | } 517 | } 518 | }, 519 | "grunt-known-options": { 520 | "version": "1.1.1", 521 | "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", 522 | "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", 523 | "dev": true 524 | }, 525 | "grunt-legacy-log": { 526 | "version": "3.0.0", 527 | "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", 528 | "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", 529 | "dev": true, 530 | "requires": { 531 | "colors": "~1.1.2", 532 | "grunt-legacy-log-utils": "~2.1.0", 533 | "hooker": "~0.2.3", 534 | "lodash": "~4.17.19" 535 | } 536 | }, 537 | "grunt-legacy-log-utils": { 538 | "version": "2.1.0", 539 | "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", 540 | "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", 541 | "dev": true, 542 | "requires": { 543 | "chalk": "~4.1.0", 544 | "lodash": "~4.17.19" 545 | } 546 | }, 547 | "grunt-legacy-util": { 548 | "version": "2.0.1", 549 | "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", 550 | "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", 551 | "dev": true, 552 | "requires": { 553 | "async": "~3.2.0", 554 | "exit": "~0.1.2", 555 | "getobject": "~1.0.0", 556 | "hooker": "~0.2.3", 557 | "lodash": "~4.17.21", 558 | "underscore.string": "~3.3.5", 559 | "which": "~2.0.2" 560 | }, 561 | "dependencies": { 562 | "which": { 563 | "version": "2.0.2", 564 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 565 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 566 | "dev": true, 567 | "requires": { 568 | "isexe": "^2.0.0" 569 | } 570 | } 571 | } 572 | }, 573 | "gzip-size": { 574 | "version": "3.0.0", 575 | "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", 576 | "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", 577 | "dev": true, 578 | "requires": { 579 | "duplexer": "^0.1.1" 580 | } 581 | }, 582 | "has": { 583 | "version": "1.0.3", 584 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 585 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 586 | "dev": true, 587 | "requires": { 588 | "function-bind": "^1.1.1" 589 | } 590 | }, 591 | "has-ansi": { 592 | "version": "2.0.0", 593 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 594 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 595 | "dev": true, 596 | "requires": { 597 | "ansi-regex": "^2.0.0" 598 | } 599 | }, 600 | "has-flag": { 601 | "version": "4.0.0", 602 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 603 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 604 | "dev": true 605 | }, 606 | "homedir-polyfill": { 607 | "version": "1.0.3", 608 | "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", 609 | "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", 610 | "dev": true, 611 | "requires": { 612 | "parse-passwd": "^1.0.0" 613 | } 614 | }, 615 | "hooker": { 616 | "version": "0.2.3", 617 | "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", 618 | "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", 619 | "dev": true 620 | }, 621 | "iconv-lite": { 622 | "version": "0.4.24", 623 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 624 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 625 | "dev": true, 626 | "requires": { 627 | "safer-buffer": ">= 2.1.2 < 3" 628 | } 629 | }, 630 | "inflight": { 631 | "version": "1.0.6", 632 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 633 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 634 | "dev": true, 635 | "requires": { 636 | "once": "^1.3.0", 637 | "wrappy": "1" 638 | } 639 | }, 640 | "inherits": { 641 | "version": "2.0.4", 642 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 643 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 644 | "dev": true 645 | }, 646 | "ini": { 647 | "version": "1.3.8", 648 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 649 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", 650 | "dev": true 651 | }, 652 | "interpret": { 653 | "version": "1.1.0", 654 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", 655 | "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", 656 | "dev": true 657 | }, 658 | "is-absolute": { 659 | "version": "1.0.0", 660 | "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", 661 | "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", 662 | "dev": true, 663 | "requires": { 664 | "is-relative": "^1.0.0", 665 | "is-windows": "^1.0.1" 666 | } 667 | }, 668 | "is-core-module": { 669 | "version": "2.4.0", 670 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", 671 | "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", 672 | "dev": true, 673 | "requires": { 674 | "has": "^1.0.3" 675 | } 676 | }, 677 | "is-extglob": { 678 | "version": "2.1.1", 679 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 680 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 681 | "dev": true 682 | }, 683 | "is-glob": { 684 | "version": "4.0.1", 685 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 686 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 687 | "dev": true, 688 | "requires": { 689 | "is-extglob": "^2.1.1" 690 | } 691 | }, 692 | "is-number": { 693 | "version": "7.0.0", 694 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 695 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 696 | "dev": true 697 | }, 698 | "is-plain-object": { 699 | "version": "2.0.4", 700 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 701 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 702 | "dev": true, 703 | "requires": { 704 | "isobject": "^3.0.1" 705 | } 706 | }, 707 | "is-relative": { 708 | "version": "1.0.0", 709 | "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", 710 | "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", 711 | "dev": true, 712 | "requires": { 713 | "is-unc-path": "^1.0.0" 714 | } 715 | }, 716 | "is-unc-path": { 717 | "version": "1.0.0", 718 | "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", 719 | "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", 720 | "dev": true, 721 | "requires": { 722 | "unc-path-regex": "^0.1.2" 723 | } 724 | }, 725 | "is-windows": { 726 | "version": "1.0.2", 727 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 728 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", 729 | "dev": true 730 | }, 731 | "isexe": { 732 | "version": "2.0.0", 733 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 734 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 735 | "dev": true 736 | }, 737 | "isobject": { 738 | "version": "3.0.1", 739 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 740 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", 741 | "dev": true 742 | }, 743 | "js-yaml": { 744 | "version": "3.14.1", 745 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 746 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 747 | "dev": true, 748 | "requires": { 749 | "argparse": "^1.0.7", 750 | "esprima": "^4.0.0" 751 | } 752 | }, 753 | "kind-of": { 754 | "version": "6.0.3", 755 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 756 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 757 | "dev": true 758 | }, 759 | "liftup": { 760 | "version": "3.0.1", 761 | "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", 762 | "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", 763 | "dev": true, 764 | "requires": { 765 | "extend": "^3.0.2", 766 | "findup-sync": "^4.0.0", 767 | "fined": "^1.2.0", 768 | "flagged-respawn": "^1.0.1", 769 | "is-plain-object": "^2.0.4", 770 | "object.map": "^1.0.1", 771 | "rechoir": "^0.7.0", 772 | "resolve": "^1.19.0" 773 | }, 774 | "dependencies": { 775 | "findup-sync": { 776 | "version": "4.0.0", 777 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", 778 | "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", 779 | "dev": true, 780 | "requires": { 781 | "detect-file": "^1.0.0", 782 | "is-glob": "^4.0.0", 783 | "micromatch": "^4.0.2", 784 | "resolve-dir": "^1.0.1" 785 | } 786 | } 787 | } 788 | }, 789 | "lodash": { 790 | "version": "4.17.21", 791 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 792 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 793 | "dev": true 794 | }, 795 | "make-iterator": { 796 | "version": "1.0.1", 797 | "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", 798 | "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", 799 | "dev": true, 800 | "requires": { 801 | "kind-of": "^6.0.2" 802 | } 803 | }, 804 | "map-cache": { 805 | "version": "0.2.2", 806 | "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", 807 | "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", 808 | "dev": true 809 | }, 810 | "maxmin": { 811 | "version": "2.1.0", 812 | "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz", 813 | "integrity": "sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY=", 814 | "dev": true, 815 | "requires": { 816 | "chalk": "^1.0.0", 817 | "figures": "^1.0.1", 818 | "gzip-size": "^3.0.0", 819 | "pretty-bytes": "^3.0.0" 820 | }, 821 | "dependencies": { 822 | "ansi-styles": { 823 | "version": "2.2.1", 824 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 825 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 826 | "dev": true 827 | }, 828 | "chalk": { 829 | "version": "1.1.3", 830 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 831 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 832 | "dev": true, 833 | "requires": { 834 | "ansi-styles": "^2.2.1", 835 | "escape-string-regexp": "^1.0.2", 836 | "has-ansi": "^2.0.0", 837 | "strip-ansi": "^3.0.0", 838 | "supports-color": "^2.0.0" 839 | } 840 | }, 841 | "supports-color": { 842 | "version": "2.0.0", 843 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 844 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 845 | "dev": true 846 | } 847 | } 848 | }, 849 | "micromatch": { 850 | "version": "4.0.4", 851 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", 852 | "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", 853 | "dev": true, 854 | "requires": { 855 | "braces": "^3.0.1", 856 | "picomatch": "^2.2.3" 857 | } 858 | }, 859 | "minimatch": { 860 | "version": "3.0.8", 861 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", 862 | "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", 863 | "dev": true, 864 | "requires": { 865 | "brace-expansion": "^1.1.7" 866 | } 867 | }, 868 | "mkdirp": { 869 | "version": "1.0.4", 870 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 871 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 872 | "dev": true 873 | }, 874 | "nopt": { 875 | "version": "3.0.6", 876 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 877 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 878 | "dev": true, 879 | "requires": { 880 | "abbrev": "1" 881 | } 882 | }, 883 | "number-is-nan": { 884 | "version": "1.0.1", 885 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 886 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 887 | "dev": true 888 | }, 889 | "object-assign": { 890 | "version": "4.1.1", 891 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 892 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 893 | "dev": true 894 | }, 895 | "object.defaults": { 896 | "version": "1.1.0", 897 | "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", 898 | "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", 899 | "dev": true, 900 | "requires": { 901 | "array-each": "^1.0.1", 902 | "array-slice": "^1.0.0", 903 | "for-own": "^1.0.0", 904 | "isobject": "^3.0.0" 905 | } 906 | }, 907 | "object.map": { 908 | "version": "1.0.1", 909 | "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", 910 | "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", 911 | "dev": true, 912 | "requires": { 913 | "for-own": "^1.0.0", 914 | "make-iterator": "^1.0.0" 915 | } 916 | }, 917 | "object.pick": { 918 | "version": "1.3.0", 919 | "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", 920 | "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", 921 | "dev": true, 922 | "requires": { 923 | "isobject": "^3.0.1" 924 | } 925 | }, 926 | "once": { 927 | "version": "1.4.0", 928 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 929 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 930 | "dev": true, 931 | "requires": { 932 | "wrappy": "1" 933 | } 934 | }, 935 | "os-homedir": { 936 | "version": "1.0.2", 937 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 938 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 939 | "dev": true 940 | }, 941 | "os-tmpdir": { 942 | "version": "1.0.2", 943 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 944 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 945 | "dev": true 946 | }, 947 | "osenv": { 948 | "version": "0.1.5", 949 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 950 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 951 | "dev": true, 952 | "requires": { 953 | "os-homedir": "^1.0.0", 954 | "os-tmpdir": "^1.0.0" 955 | } 956 | }, 957 | "parse-filepath": { 958 | "version": "1.0.2", 959 | "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", 960 | "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", 961 | "dev": true, 962 | "requires": { 963 | "is-absolute": "^1.0.0", 964 | "map-cache": "^0.2.0", 965 | "path-root": "^0.1.1" 966 | } 967 | }, 968 | "parse-passwd": { 969 | "version": "1.0.0", 970 | "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", 971 | "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", 972 | "dev": true 973 | }, 974 | "path-is-absolute": { 975 | "version": "1.0.1", 976 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 977 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 978 | "dev": true 979 | }, 980 | "path-parse": { 981 | "version": "1.0.7", 982 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 983 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 984 | "dev": true 985 | }, 986 | "path-root": { 987 | "version": "0.1.1", 988 | "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", 989 | "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", 990 | "dev": true, 991 | "requires": { 992 | "path-root-regex": "^0.1.0" 993 | } 994 | }, 995 | "path-root-regex": { 996 | "version": "0.1.2", 997 | "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", 998 | "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", 999 | "dev": true 1000 | }, 1001 | "picomatch": { 1002 | "version": "2.2.3", 1003 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", 1004 | "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", 1005 | "dev": true 1006 | }, 1007 | "pify": { 1008 | "version": "4.0.1", 1009 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 1010 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", 1011 | "dev": true 1012 | }, 1013 | "pretty-bytes": { 1014 | "version": "3.0.1", 1015 | "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", 1016 | "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", 1017 | "dev": true, 1018 | "requires": { 1019 | "number-is-nan": "^1.0.0" 1020 | } 1021 | }, 1022 | "rechoir": { 1023 | "version": "0.7.0", 1024 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", 1025 | "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", 1026 | "dev": true, 1027 | "requires": { 1028 | "resolve": "^1.9.0" 1029 | } 1030 | }, 1031 | "resolve": { 1032 | "version": "1.20.0", 1033 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", 1034 | "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", 1035 | "dev": true, 1036 | "requires": { 1037 | "is-core-module": "^2.2.0", 1038 | "path-parse": "^1.0.6" 1039 | } 1040 | }, 1041 | "resolve-dir": { 1042 | "version": "1.0.1", 1043 | "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", 1044 | "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", 1045 | "dev": true, 1046 | "requires": { 1047 | "expand-tilde": "^2.0.0", 1048 | "global-modules": "^1.0.0" 1049 | } 1050 | }, 1051 | "rimraf": { 1052 | "version": "3.0.2", 1053 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1054 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1055 | "dev": true, 1056 | "requires": { 1057 | "glob": "^7.1.3" 1058 | } 1059 | }, 1060 | "safer-buffer": { 1061 | "version": "2.1.2", 1062 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1063 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1064 | "dev": true 1065 | }, 1066 | "source-map": { 1067 | "version": "0.6.1", 1068 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1069 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1070 | "dev": true 1071 | }, 1072 | "sprintf-js": { 1073 | "version": "1.1.2", 1074 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", 1075 | "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", 1076 | "dev": true 1077 | }, 1078 | "strip-ansi": { 1079 | "version": "3.0.1", 1080 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1081 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1082 | "dev": true, 1083 | "requires": { 1084 | "ansi-regex": "^2.0.0" 1085 | } 1086 | }, 1087 | "supports-color": { 1088 | "version": "7.2.0", 1089 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1090 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1091 | "dev": true, 1092 | "requires": { 1093 | "has-flag": "^4.0.0" 1094 | } 1095 | }, 1096 | "to-regex-range": { 1097 | "version": "5.0.1", 1098 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1099 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1100 | "dev": true, 1101 | "requires": { 1102 | "is-number": "^7.0.0" 1103 | } 1104 | }, 1105 | "uglify-js": { 1106 | "version": "3.13.6", 1107 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.6.tgz", 1108 | "integrity": "sha512-rRprLwl8RVaS+Qvx3Wh5hPfPBn9++G6xkGlUupya0s5aDmNjI7z3lnRLB3u7sN4OmbB0pWgzhM9BEJyiWAwtAA==", 1109 | "dev": true 1110 | }, 1111 | "unc-path-regex": { 1112 | "version": "0.1.2", 1113 | "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", 1114 | "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", 1115 | "dev": true 1116 | }, 1117 | "underscore.string": { 1118 | "version": "3.3.6", 1119 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", 1120 | "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", 1121 | "dev": true, 1122 | "requires": { 1123 | "sprintf-js": "^1.1.1", 1124 | "util-deprecate": "^1.0.2" 1125 | } 1126 | }, 1127 | "uri-path": { 1128 | "version": "1.0.0", 1129 | "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", 1130 | "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", 1131 | "dev": true 1132 | }, 1133 | "util-deprecate": { 1134 | "version": "1.0.2", 1135 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1136 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1137 | "dev": true 1138 | }, 1139 | "v8flags": { 1140 | "version": "3.2.0", 1141 | "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", 1142 | "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", 1143 | "dev": true, 1144 | "requires": { 1145 | "homedir-polyfill": "^1.0.1" 1146 | } 1147 | }, 1148 | "which": { 1149 | "version": "1.3.1", 1150 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1151 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1152 | "dev": true, 1153 | "requires": { 1154 | "isexe": "^2.0.0" 1155 | } 1156 | }, 1157 | "wrappy": { 1158 | "version": "1.0.2", 1159 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1160 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1161 | "dev": true 1162 | } 1163 | } 1164 | } 1165 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery-quiz", 3 | "version": "0.0.1", 4 | "title": "jquery-quiz", 5 | "author": { 6 | "name": "JC Hamill", 7 | "url": "https://github.com/jchamill" 8 | }, 9 | "license": "MIT", 10 | "main": "dist/jquery.quiz.min.js", 11 | "description": "A simple jQuery quiz plugin.", 12 | "homepage": "http://jchamill.github.com/jquery-quiz/", 13 | "scripts": { 14 | "test": "echo \"Error: no test specified\" && exit 1" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "https://github.com/jchamill/jquery-quiz.git" 19 | }, 20 | "bugs": { 21 | "url": "https://github.com/jchamill/jquery-quiz/issues" 22 | }, 23 | "devDependencies": { 24 | "grunt": "^1.5.2", 25 | "grunt-cli": "^1.4.2", 26 | "grunt-contrib-cssmin": "^4.0.0", 27 | "grunt-contrib-uglify": "^5.0.1" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/jquery.quiz.css: -------------------------------------------------------------------------------- 1 | .quiz-container { 2 | padding: 1em; 3 | max-width: 100%; 4 | margin: 1em auto; 5 | } 6 | 7 | .quiz-container a { 8 | text-decoration: none; 9 | color: #333; 10 | } 11 | 12 | .quiz-header, 13 | .quiz-start-screen, 14 | .quiz-results-screen, 15 | .quiz-counter { 16 | text-align: center; 17 | } 18 | 19 | .question { 20 | font-size: 1.25em; 21 | } 22 | 23 | .answers { 24 | list-style: none; 25 | padding: 0; 26 | } 27 | 28 | .answers a { 29 | display: block; 30 | padding: 0.5em 1em; 31 | margin-bottom: 0.5em; 32 | background: #fff; 33 | border-radius: 10px; 34 | } 35 | 36 | .answers a.correct { 37 | background: #090; 38 | } 39 | .answers a.incorrect { 40 | background: #c00; 41 | } 42 | 43 | .answers a.correct, 44 | .answers a.incorrect { 45 | color: #fff; 46 | } 47 | 48 | .quiz-controls { 49 | background: #333; 50 | color: #fff; 51 | padding: 0.5em 1em; 52 | text-align: center; 53 | border-radius: 10px; 54 | } 55 | 56 | .quiz-response {} 57 | .quiz-results { 58 | font-size: 1.25em; 59 | } 60 | 61 | .quiz-buttons a, 62 | .quiz-container .quiz-button { 63 | display: inline-block; 64 | padding: 0.5em 1em; 65 | background: #333; 66 | color: #fff; 67 | border-radius: 10px; 68 | } 69 | .quiz-buttons a { 70 | background: #fff; 71 | color: #333; 72 | } 73 | 74 | /* Quiz State Overrides */ 75 | 76 | .quiz-results-state .quiz-controls { 77 | background: none; 78 | padding: 0; 79 | } 80 | .quiz-results-state .quiz-buttons a { 81 | background: #333; 82 | color: #fff; 83 | } -------------------------------------------------------------------------------- /src/jquery.quiz.js: -------------------------------------------------------------------------------- 1 | ;(function(factory) { 2 | 'use strict'; 3 | if (typeof define === 'function' && define.amd) { 4 | define(['jquery'], factory); 5 | } else if (typeof exports !== 'undefined') { 6 | module.exports = factory(require('jquery')); 7 | } else { 8 | factory(jQuery); 9 | } 10 | }(function($) { 11 | 'use strict'; 12 | 13 | $.quiz = function(el, options) { 14 | var base = this; 15 | 16 | // Access to jQuery version of element 17 | base.$el = $(el); 18 | 19 | // Add a reverse reference to the DOM object 20 | base.$el.data('quiz', base); 21 | 22 | base.options = $.extend($.quiz.defaultOptions, options); 23 | 24 | var questions = base.options.questions, 25 | numQuestions = questions.length, 26 | startScreen = base.options.startScreen, 27 | $startScreen = base.$el.find(startScreen), 28 | startButton = base.options.startButton, 29 | homeButton = base.options.homeButton, 30 | resultsScreen = base.options.resultsScreen, 31 | $resultsScreen = base.$el.find(resultsScreen), 32 | gameOverScreen = base.options.gameOverScreen, 33 | $gameOverScreen = base.$el.find(gameOverScreen), 34 | nextButtonText = base.options.nextButtonText, 35 | finishButtonText = base.options.finishButtonText, 36 | restartButtonText = base.options.restartButtonText, 37 | currentQuestion = 1, 38 | score = 0, 39 | answerLocked = false, 40 | $quizResults = null, 41 | $quizNextBtn = null, 42 | $quizFinishBtn = null, 43 | $quizRestartBtn = null, 44 | $quizControls = null, 45 | $questions = null, 46 | $quizCounter = null, 47 | $quizResponse = null, 48 | $questionContainer = null; 49 | 50 | base.methods = { 51 | init: function() { 52 | base.methods.setup(); 53 | 54 | base.$el.off(); 55 | 56 | base.$el.on('click', startButton, function(e) { 57 | e.preventDefault(); 58 | base.methods.start(); 59 | }); 60 | 61 | base.$el.on('click', homeButton, function(e) { 62 | e.preventDefault(); 63 | base.methods.home(); 64 | }); 65 | 66 | base.$el.on('click', '.answers a', function(e) { 67 | e.preventDefault(); 68 | base.methods.answerQuestion(this); 69 | }); 70 | 71 | base.$el.on('click', '.quiz-next-btn', function(e) { 72 | e.preventDefault(); 73 | base.methods.nextQuestion(); 74 | }); 75 | 76 | base.$el.on('click', '.quiz-finish-btn', function(e) { 77 | e.preventDefault(); 78 | base.methods.finish(); 79 | }); 80 | 81 | base.$el.on('click', '.quiz-restart-btn, .quiz-retry-btn', function(e) { 82 | e.preventDefault(); 83 | base.methods.restart(); 84 | }); 85 | }, 86 | setup: function() { 87 | var quizHtml = ''; 88 | 89 | if (base.options.counter) { 90 | quizHtml += '
'; 91 | } 92 | 93 | quizHtml += '
'; 94 | $.each(questions, function(i, question) { 95 | quizHtml += '
'; 96 | quizHtml += '

' + question.q + '

'; 97 | quizHtml += '
    '; 98 | $.each(question.options, function(index, answer) { 99 | quizHtml += '
  • ' + answer + '
  • '; 100 | }); 101 | quizHtml += '
'; 102 | quizHtml += '
'; 103 | }); 104 | quizHtml += '
'; 105 | 106 | // if results screen not in DOM, add it 107 | if ($resultsScreen.length === 0) { 108 | quizHtml += '
'; 109 | quizHtml += '

'; 110 | quizHtml += '
'; 111 | } 112 | 113 | quizHtml += '
'; 114 | quizHtml += '

'; 115 | quizHtml += '
'; 116 | quizHtml += '' + nextButtonText + ''; 117 | quizHtml += '' + finishButtonText + ''; 118 | quizHtml += '' + restartButtonText + ''; 119 | quizHtml += '
'; 120 | quizHtml += '
'; 121 | 122 | base.$el.append(quizHtml).addClass('quiz-container quiz-start-state'); 123 | 124 | if ($resultsScreen.length === 0) { 125 | $resultsScreen = base.$el.find(resultsScreen); 126 | } 127 | $quizResults = base.$el.find('.quiz-results'); 128 | $quizControls = base.$el.find('.quiz-controls'); 129 | $questions = base.$el.find('.questions'); 130 | $quizCounter = base.$el.find('.quiz-counter'); 131 | $quizResponse = base.$el.find('.quiz-response'); 132 | $questionContainer = base.$el.find('.question-container'); 133 | $quizNextBtn = base.$el.find('.quiz-next-btn'); 134 | $quizFinishBtn = base.$el.find('.quiz-finish-btn'); 135 | $quizRestartBtn = base.$el.find('.quiz-restart-btn'); 136 | 137 | $quizCounter.hide(); 138 | $questionContainer.hide(); 139 | $gameOverScreen.hide(); 140 | $resultsScreen.hide(); 141 | $quizControls.hide(); 142 | 143 | if (typeof base.options.setupCallback === 'function') { 144 | base.options.setupCallback(); 145 | } 146 | }, 147 | start: function() { 148 | base.$el.removeClass('quiz-start-state').addClass('quiz-questions-state'); 149 | $startScreen.hide(); 150 | $quizControls.hide(); 151 | $quizFinishBtn.hide(); 152 | $quizRestartBtn.hide(); 153 | $questions.show(); 154 | $quizCounter.show(); 155 | $questionContainer.first().show().addClass('active-question'); 156 | base.methods.updateCounter(); 157 | }, 158 | answerQuestion: function(answerEl) { 159 | if (answerLocked) { 160 | return; 161 | } 162 | answerLocked = true; 163 | 164 | var $answerEl = $(answerEl), 165 | response = '', 166 | selected = $answerEl.data('index'), 167 | currentQuestionIndex = currentQuestion - 1, 168 | correct = questions[currentQuestionIndex].correctIndex; 169 | 170 | if (selected === correct) { 171 | $answerEl.addClass('correct'); 172 | response = questions[currentQuestionIndex].correctResponse; 173 | score++; 174 | } else { 175 | $answerEl.addClass('incorrect'); 176 | response = questions[currentQuestionIndex].incorrectResponse; 177 | if (!base.options.allowIncorrect) { 178 | base.methods.gameOver(response); 179 | return; 180 | } 181 | } 182 | 183 | // check to see if we are at the last question 184 | if (currentQuestion++ === numQuestions) { 185 | $quizNextBtn.hide(); 186 | $quizFinishBtn.show(); 187 | } 188 | 189 | $quizResponse.html(response); 190 | $quizControls.fadeIn(); 191 | 192 | if (typeof base.options.answerCallback === 'function') { 193 | base.options.answerCallback(currentQuestion, selected, questions[currentQuestionIndex]); 194 | } 195 | }, 196 | nextQuestion: function() { 197 | answerLocked = false; 198 | 199 | base.$el.find('.active-question') 200 | .hide() 201 | .removeClass('active-question') 202 | .next('.question-container') 203 | .show() 204 | .addClass('active-question'); 205 | 206 | $quizControls.hide(); 207 | 208 | base.methods.updateCounter(); 209 | 210 | if (typeof base.options.nextCallback === 'function') { 211 | base.options.nextCallback(); 212 | } 213 | }, 214 | gameOver: function(response) { 215 | // if gameover screen not in DOM, add it 216 | if ($gameOverScreen.length === 0) { 217 | var quizHtml = ''; 218 | quizHtml += '
'; 219 | quizHtml += '

'; 220 | quizHtml += '

' + restartButtonText + '

'; 221 | quizHtml += '
'; 222 | base.$el.append(quizHtml); 223 | } 224 | base.$el.find('.quiz-gameover-response').html(response); 225 | $quizCounter.hide(); 226 | $questions.hide(); 227 | $quizFinishBtn.hide(); 228 | $gameOverScreen.show(); 229 | }, 230 | finish: function() { 231 | base.$el.removeClass('quiz-questions-state').addClass('quiz-results-state'); 232 | base.$el.find('.active-question').hide().removeClass('active-question'); 233 | $quizCounter.hide(); 234 | $quizResponse.hide(); 235 | $quizFinishBtn.hide(); 236 | $quizNextBtn.hide(); 237 | $quizRestartBtn.show(); 238 | $resultsScreen.show(); 239 | var resultsStr = base.options.resultsFormat.replace('%score', score).replace('%total', numQuestions); 240 | $quizResults.html(resultsStr); 241 | 242 | if (typeof base.options.finishCallback === 'function') { 243 | base.options.finishCallback(); 244 | } 245 | }, 246 | restart: function() { 247 | base.methods.reset(); 248 | base.$el.addClass('quiz-questions-state'); 249 | $questions.show(); 250 | $quizCounter.show(); 251 | $questionContainer.first().show().addClass('active-question'); 252 | base.methods.updateCounter(); 253 | }, 254 | reset: function() { 255 | answerLocked = false; 256 | currentQuestion = 1; 257 | score = 0; 258 | base.$el.find('.answers a').removeClass('correct incorrect'); 259 | base.$el.removeClass().addClass('quiz-container'); 260 | $quizRestartBtn.hide(); 261 | $gameOverScreen.hide(); 262 | $resultsScreen.hide(); 263 | $quizControls.hide(); 264 | $quizResponse.show(); 265 | $quizNextBtn.show(); 266 | $quizCounter.hide(); 267 | base.$el.find('.active-question').hide().removeClass('active-question'); 268 | 269 | if (typeof base.options.resetCallback === 'function') { 270 | base.options.resetCallback(); 271 | } 272 | }, 273 | home: function() { 274 | base.methods.reset(); 275 | base.$el.addClass('quiz-start-state'); 276 | $startScreen.show(); 277 | 278 | if (typeof base.options.homeCallback === 'function') { 279 | base.options.homeCallback(); 280 | } 281 | }, 282 | updateCounter: function() { 283 | var countStr = base.options.counterFormat.replace('%current', currentQuestion).replace('%total', numQuestions); 284 | $quizCounter.html(countStr); 285 | } 286 | }; 287 | 288 | base.methods.init(); 289 | }; 290 | 291 | $.quiz.defaultOptions = { 292 | allowIncorrect: true, 293 | counter: true, 294 | counterFormat: '%current/%total', 295 | startScreen: '.quiz-start-screen', 296 | startButton: '.quiz-start-btn', 297 | homeButton: '.quiz-home-btn', 298 | resultsScreen: '.quiz-results-screen', 299 | resultsFormat: 'You got %score out of %total correct!', 300 | gameOverScreen: '.quiz-gameover-screen', 301 | nextButtonText: 'Next', 302 | finishButtonText: 'Finish', 303 | restartButtonText: 'Restart' 304 | }; 305 | 306 | $.fn.quiz = function(options) { 307 | return this.each(function() { 308 | new $.quiz(this, options); 309 | }); 310 | }; 311 | })); --------------------------------------------------------------------------------