├── .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 |
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 |
17 |
18 |
19 |
20 |
81 |
82 |
--------------------------------------------------------------------------------
/demo/callbacks.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | jQuery Quiz: Callbacks
5 |
6 |
7 |
8 |
9 |
13 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
128 |
129 |
--------------------------------------------------------------------------------
/demo/custom-results-screen.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | jQuery Quiz
5 |
6 |
13 |
14 |
15 |
16 |
20 |
23 |
24 |
25 |
26 |
Thank You!
27 |
28 |
35 |
36 |
37 |
38 |
39 |
40 |
74 |
75 |
--------------------------------------------------------------------------------
/demo/custom-scoring.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | jQuery Quiz: Custom Scoring
5 |
6 |
7 |
8 |
17 |
18 |
19 |
20 |
110 |
111 |
--------------------------------------------------------------------------------
/demo/localization.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | jQuery Quiz
5 |
6 |
7 |
8 |
21 |
22 |
23 |
24 |
59 |
60 |
--------------------------------------------------------------------------------
/demo/multiple.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | jQuery Quiz
5 |
6 |
7 |
8 |
17 |
18 |
27 |
28 |
29 |
30 |
97 |
98 |
--------------------------------------------------------------------------------
/demo/no-fail.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | jQuery Quiz
5 |
6 |
7 |
8 |
9 |
13 |
14 |
Custom Start Screen
15 |
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+='
",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 += '
';
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 += '';
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 | }));
--------------------------------------------------------------------------------