From efa555d74d2edbb7cc4c2bff3156fd31ffdf875b Mon Sep 17 00:00:00 2001 From: Ines Akrap Date: Tue, 9 Mar 2021 14:35:07 +0100 Subject: [PATCH] Library code first commit --- .editorconfig | 13 + .eslintrc | 7 + .gitignore | 5 + CHANGELOG.md | 9 + LICENSE.md | 24 + assets/Logo_ProgUX.png | Bin 0 -> 15346 bytes assets/settings_modal.png | Bin 0 -> 55337 bytes assets/status_bar.png | Bin 0 -> 37436 bytes dist/dev/dev-bundle.css | 1 + dist/dev/dev-bundle.js | 1 + dist/index-dev.html | 11 + dist/index.html | 14 + dist/prod/bundle.js | 1 + package-lock.json | 4818 +++++++++++++++++ package.json | 55 + readme.md | 189 + rollup-config.js | 58 + src/dev/js/displayStatus.js | 56 + .../css/debugUtils/settingsModal.config.scss | 11 + .../css/debugUtils/settingsModal.scss | 275 + src/frontend/css/dev-styles.js | 3 + src/frontend/html/index-dev.html | 11 + src/frontend/html/index.html | 14 + src/frontend/js/config.js | 19 + src/frontend/js/debugUtils/icons/closeIcon.js | 5 + .../js/debugUtils/icons/settingsIcon.js | 6 + .../js/debugUtils/settingsModal.config.js | 193 + src/frontend/js/debugUtils/settingsModal.js | 173 + .../js/debugUtils/settingsModalControls.js | 227 + .../js/debugUtils/settingsModalDrag.js | 65 + src/frontend/js/index-dev.js | 57 + src/frontend/js/index-prod.js | 43 + .../js/utils/evaluateConnectionSpeed.js | 17 + src/frontend/js/utils/evaluateCpu.js | 29 + src/frontend/js/utils/evaluateDataSaving.js | 14 + src/frontend/js/utils/evaluateMemory.js | 28 + .../js/utils/evaluateReducedMotion.js | 8 + src/frontend/js/utils/evaluateTracking.js | 16 + src/frontend/js/utils/utils.js | 104 + 39 files changed, 6580 insertions(+) create mode 100644 .editorconfig create mode 100644 .eslintrc create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE.md create mode 100644 assets/Logo_ProgUX.png create mode 100644 assets/settings_modal.png create mode 100644 assets/status_bar.png create mode 100644 dist/dev/dev-bundle.css create mode 100644 dist/dev/dev-bundle.js create mode 100644 dist/index-dev.html create mode 100644 dist/index.html create mode 100644 dist/prod/bundle.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 readme.md create mode 100644 rollup-config.js create mode 100644 src/dev/js/displayStatus.js create mode 100644 src/frontend/css/debugUtils/settingsModal.config.scss create mode 100644 src/frontend/css/debugUtils/settingsModal.scss create mode 100644 src/frontend/css/dev-styles.js create mode 100644 src/frontend/html/index-dev.html create mode 100644 src/frontend/html/index.html create mode 100644 src/frontend/js/config.js create mode 100644 src/frontend/js/debugUtils/icons/closeIcon.js create mode 100644 src/frontend/js/debugUtils/icons/settingsIcon.js create mode 100644 src/frontend/js/debugUtils/settingsModal.config.js create mode 100644 src/frontend/js/debugUtils/settingsModal.js create mode 100644 src/frontend/js/debugUtils/settingsModalControls.js create mode 100644 src/frontend/js/debugUtils/settingsModalDrag.js create mode 100644 src/frontend/js/index-dev.js create mode 100644 src/frontend/js/index-prod.js create mode 100644 src/frontend/js/utils/evaluateConnectionSpeed.js create mode 100644 src/frontend/js/utils/evaluateCpu.js create mode 100644 src/frontend/js/utils/evaluateDataSaving.js create mode 100644 src/frontend/js/utils/evaluateMemory.js create mode 100644 src/frontend/js/utils/evaluateReducedMotion.js create mode 100644 src/frontend/js/utils/evaluateTracking.js create mode 100644 src/frontend/js/utils/utils.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..aaaa30d --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..f446ae2 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,7 @@ +{ + "root": true, + "extends": "airbnb-base", + "env": { + "browser": true + } +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f21c580 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +npm-debug.log +node_modules + +.DS_Store +.DS_Store? \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..a5df1bc --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log + +## 1.0.1 - 2021-02-23 + +- Adding dev init function to window + +## 1.0.0 - 2021-02-22 + +- First release of ProgUX library \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..0ae6e75 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,24 @@ +The MIT License + +Copyright (c) 2021 Netcentric, a Cognizant Digital Business + +Permission is hereby granted, free of charge, +to any person obtaining a copy of this software and +associated documentation files (the "Software"), to +deal in the Software without restriction, including +without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom +the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/assets/Logo_ProgUX.png b/assets/Logo_ProgUX.png new file mode 100644 index 0000000000000000000000000000000000000000..c4ca85849a027cbfd500b3eda5a08043e2236326 GIT binary patch literal 15346 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 literal 0 HcmV?d00001 diff --git a/assets/settings_modal.png b/assets/settings_modal.png new file mode 100644 index 0000000000000000000000000000000000000000..6efd81118beb422dc724a0be64906cd2a0570b51 GIT binary patch literal 55337 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 DmvaqM literal 0 HcmV?d00001 diff --git a/assets/status_bar.png b/assets/status_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..40100c943da1cd4374b088c7f22a3b8be846030e GIT binary patch literal 37436 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 literal 0 HcmV?d00001 diff --git a/dist/dev/dev-bundle.css b/dist/dev/dev-bundle.css new file mode 100644 index 0000000..fc172ea --- /dev/null +++ b/dist/dev/dev-bundle.css @@ -0,0 +1 @@ +.settingsModal{display:inline-block;position:absolute;z-index:10;font-family:Arial, sans-serif}.settingsModal[draggable="true"]{cursor:move}.settingsModal--open{background-color:#fff;color:#252525;box-shadow:0 8px 17px 2px rgba(0,0,0,0.14),0 3px 14px 2px rgba(0,0,0,0.12),0 5px 5px -3px rgba(0,0,0,0.2)}.settingsModal--open .settingsModal__openIcon{display:none}.settingsModal--closed .settingsModal__title,.settingsModal--closed .settingsModal__closeIcon,.settingsModal--closed .settingsModal__form,.settingsModal--closed .settingsModal__controller--view{display:none}.settingsModal--banner{display:flex}.settingsModal--banner .settingsModal__header,.settingsModal--banner .settingsModal__submit{display:none}.settingsModal--banner .settingsModal__controller--view .settingsModal__parameter{font-size:12px}.settingsModal__header{background-color:#16b1a3;color:#fff;font-size:18px;font-weight:bold;text-transform:uppercase;line-height:36px;padding:5px 20px;display:flex;align-items:center;justify-content:space-between}.settingsModal--closed .settingsModal__header{border-radius:50%;padding:10px;box-shadow:0 8px 17px 2px rgba(0,0,0,0.14),0 3px 14px 2px rgba(0,0,0,0.12),0 5px 5px -3px rgba(0,0,0,0.2)}.settingsModal__icon{fill:#fff}.settingsModal__closeIcon,.settingsModal__openIcon{cursor:pointer}.settingsModal__closeIcon{margin-right:-3px;margin-top:6px}.settingsModal__openIcon{height:24px;width:24px}.settingsModal__form{font-size:14px;padding:10px 20px}.settingsModal--banner .settingsModal__form{display:flex;background-color:#16b1a3;color:#fff;margin-bottom:0}.settingsModal__controller{display:flex}.settingsModal--banner .settingsModal__controller{margin:0 10px 0 0;border-right:1px solid #fff}.settingsModal--banner .settingsModal__controller:last-of-type{border-right:none}.settingsModal__controller--options{flex-direction:column;align-items:flex-start;justify-content:flex-start;margin:0 0 20px}.settingsModal__controller--toggle{flex-direction:row;align-items:center;justify-content:space-between;margin:10px 0 10px}.settingsModal--banner .settingsModal__controller--toggle{flex-direction:column;align-items:start;justify-content:start}.settingsModal__controller--view{padding:20px;margin:0;font-size:14px;border-top:1px solid #d4d4d4}.settingsModal--banner .settingsModal__controller--view{border-top:none;padding:10px;margin:0;width:80px;text-align:center;align-items:center;justify-content:space-evenly}.settingsModal__parameter{text-transform:uppercase;font-weight:bold}.settingsModal--banner .settingsModal__parameter{line-height:18px}.settingsModal__parameterValue{display:none}.settingsModal--banner .settingsModal__parameterValue{display:inline-block}.settingsModal--banner .settingsModal__parameterInput{display:none}.settingsModal__options{width:100%;display:flex;align-items:center;justify-content:space-evenly;border:1px solid #d4d4d4;padding:0;margin:0}.settingsModal__option{width:100%;list-style:none}.settingsModal__input{opacity:0;position:fixed;width:0}.settingsModal__input:checked+label{background-color:#16b1a3;color:#fff}.settingsModal__input:checked+.settingsModal__slider{background-color:#16b1a3;border-color:#16b1a3}.settingsModal__input:checked+.settingsModal__slider:after{background-color:#16b1a3;border-color:#16b1a3;-webkit-transform:translateX(25px);-ms-transform:translateX(25px);transform:translateX(25px)}.settingsModal__label{cursor:pointer;display:block;line-height:30px;padding:0 10px;text-align:center;transition:.3s}.settingsModal__label:hover{background-color:#eaeaea}.settingsModal__toggle{width:3em;height:9px;position:relative}.settingsModal__slider{cursor:pointer;position:absolute;width:42px;top:0;left:0;right:0;bottom:0;border:1px solid #252525;-webkit-transition:.3s;transition:.2s;border-radius:34px}.settingsModal__slider:after{position:absolute;content:"";height:18px;width:18px;top:calc(-50% - 2px);left:-1px;background-color:#252525;border-radius:50%;-webkit-transition:.2s;transition:.2s}.settingsModal__submit{cursor:pointer;width:100%;color:#fff;background-color:#16b1a3;border:1px solid #16b1a3;text-transform:uppercase;margin:20px 0;padding:10px 20px;font-weight:bold} diff --git a/dist/dev/dev-bundle.js b/dist/dev/dev-bundle.js new file mode 100644 index 0000000..5140afb --- /dev/null +++ b/dist/dev/dev-bundle.js @@ -0,0 +1 @@ +!function(){"use strict";const e=e=>"connection"in navigator?e.indexOf(navigator.connection.effectiveType)>=0?"slow":"fast":"unknown",t=e=>null!==sessionStorage.getItem(e),n=e=>{try{return t(e)?JSON.parse(sessionStorage.getItem(e)):{}}catch(e){return console.log(e),0}},o=(e,t)=>{try{sessionStorage.setItem(t,JSON.stringify(e))}catch(e){console.log(e)}};const a=(e,t)=>{o(e,t),function(e){const t=n(e),o=document.getElementsByTagName("html")[0];Object.entries(t).forEach((e=>{const[t,n]=e,a=`${t}-${n}`;o.classList.add(a)}))}(t)},s=t=>{const{lowRAM:n,lowCPU:o,slowConnectionTypes:a}=t;return{memoryLevel:(e=>{if(!("deviceMemory"in navigator))return"unknown";const t=navigator.deviceMemory;return t===e?"mid":t>e?"high":"low"})(n),cpuLevel:(e=>{if(!("hardwareConcurrency"in navigator))return"unknown";const t=navigator.hardwareConcurrency;return t===e?"mid":t>e?"high":"low"})(o),connectionSpeed:e(a),saveData:"connection"in navigator?navigator.connection.saveData:0,reducedMotion:window.matchMedia("(prefers-reduced-motion: reduce)").matches,doNotTrack:(()=>{const e="doNotTrack"in navigator,t="1"===navigator.doNotTrack;return e&&t})()}},l="settingsModal",c=l,i="settingsModal--open",d="settingsModal--closed",r="settingsModal--banner",u="settingsModal__header",p="settingsModal__title",g="settingsModal__form",v="settingsModal__submit",m="settingsModal__options",$="settingsModal__option",f="settingsModal__controller",h="settingsModal__controller--toggle",y="settingsModal__controller--options",w="settingsModal__controller--view",b="settingsModal__parameter",k="settingsModal__parameterValue",M="settingsModal__parameterInput",S="settingsModal__input",_="settingsModal__label",L="settingsModal__toggle",D="settingsModal__slider",E="settingsModal__icon",T="settingsModal__closeIcon",x="settingsModal__openIcon",I={settingsModalSubmitId:"settingsModalSubmit",settingsModalFormId:"settingsModalForm"},V={title:"memory level",id:"settingsModalMemoryLevel",valuePrefix:"memory-level",options:[{type:"radio",id:"memory-level-low",name:"memoryLevel",value:"low",label:"low"},{type:"radio",id:"memory-level-mid",name:"memoryLevel",value:"mid",label:"mid"},{type:"radio",id:"memory-level-high",name:"memoryLevel",value:"high",label:"high"},{type:"radio",id:"memory-level-unknown",name:"memoryLevel",value:"unknown",label:"unknown"}]},q={title:"CPU level",id:"settingsModalCpuLevel",valuePrefix:"cpu-level",options:[{type:"radio",id:"cpu-level-low",name:"cpuLevel",value:"low",label:"low"},{type:"radio",id:"cpu-level-mid",name:"cpuLevel",value:"mid",label:"mid"},{type:"radio",id:"cpu-level-high",name:"cpuLevel",value:"high",label:"high"},{type:"radio",id:"cpu-level-unknown",name:"cpuLevel",value:"unknown",label:"unknown"}]},C={title:"Connection speed",id:"settingsModalConnectionSpeed",valuePrefix:"connection-speed",options:[{type:"radio",id:"connection-speed-slow",name:"connectionSpeed",value:"slow",label:"slow"},{type:"radio",id:"connection-speed-fast",name:"connectionSpeed",value:"fast",label:"fast"},{type:"radio",id:"connection-speed-unknown",name:"connectionSpeed",value:"unknown",label:"unknown"}]},O={title:"Save data",id:"saveData",name:"saveData",value:"true",checkedValue:"true",uncheckedValue:"false"},A={title:"Reduced motion",id:"reducedMotion",name:"reducedMotion",value:"true",checkedValue:"true",uncheckedValue:"false"},N={title:"Do not track",id:"doNotTrack",name:"doNotTrack",value:"true",checkedValue:"true",uncheckedValue:"false"},P={memoryLevel:V,cpuLevel:q,connectionSpeed:C},j={saveData:O,reducedMotion:A,doNotTrack:N},U={title:"Banner view",id:"view",name:"view",value:"disabled",checkedValue:"enabled",uncheckedValue:"disabled"};function B(e){const t=function(e){let t="";return e.forEach((e=>{t+=`
  • \n \n \n
  • `})),t}(e.options);return`
    \n

    ${e.title}

    \n

    \n
      \n ${t}\n
    \n
    `}function K(e){return`
    \n

    ${e.title}

    \n

    ${e.value}

    \n \n
    `}const F=e=>{const t=function(e){const{mode:t,posTop:n,posLeft:o,isDraggable:a}=e;let s="closed"===t?`${c}--closed`:`${c}--open`;return"banner"===t&&(s+=` ${c}--banner`),`
    `}(e),n=``;return`${t}\n ${`
    \n

    Settings

    \n \n \n \n\n \n \n \n \n \n\n \n
    `}\n ${`
    `}\n ${B(V)}\n ${B(q)}\n ${B(C)}\n ${K(O)}\n ${K(A)}\n ${K(N)}\n ${n}\n
    \n ${function(e,t){return`
    \n

    ${e.title}

    \n \n
    `}(U,e)}\n
    `};let z,J;function R(e){z=e.offsetX,J=e.offsetY,e.dataTransfer.setData("text/plain",e.target.id)}function H(e){e.preventDefault()}function X(e){try{const t=JSON.parse(sessionStorage.getItem(e));Object.keys(P).forEach((e=>{const n=P[e];!function(e,t){const n=[...document.querySelector(`.${g}`).querySelectorAll(e)].find((e=>e.id===t));if(!n)return;n.setAttribute("checked","");const{value:o}=n,a=n.closest(`.${f}`).querySelector(`.${k}`);a&&(a.innerHTML=o)}(`#${n.id} input`,`${n.valuePrefix}-${t[e]}`)})),Object.keys(j).forEach((t=>{!function(e,t,n){try{const o=JSON.parse(sessionStorage.getItem(n)),a=document.querySelector(`.${g}`).querySelector(`#${e}`);if("false"===o[t])return;a.setAttribute("checked","checked")}catch(e){console.log("Unable to parse modal settings",e)}}(j[t].id,t,e)}))}catch(e){console.log("Unable to parse modal settings",e)}}function Y(e){e.stopPropagation(),e.preventDefault();!function(e){"checked"===e.getAttribute("checked")?e.removeAttribute("checked","false"):e.setAttribute("checked","checked")}(e.target.parentElement.querySelector("input"))}function G(e){const t=[...e],n=[...Object.keys(P),...Object.keys(j)],o=function(e){const t=window.location.search;if(!t)return;return t.replace("?","").split("&").map((e=>e.split("="))).filter((t=>!e.includes(t[0])))}(n)||[],a=n.map((e=>t.find((t=>t[0]===e))||[e,j[e].uncheckedValue]));return[...o,...a].map((e=>`${e[0]}=${e[1]}`)).join("&")}function Q(e){e.preventDefault();!function(e){const t=`${window.location.href.split("?")[0]}?${e}`;window.location.href=t}(G(new FormData(document.getElementById(I.settingsModalFormId))))}function W(e,t,n){const a=e.querySelector(`.${x}`),s=e.querySelector(`.${T}`),l=e.querySelector(`.${w} .${L}`);a.addEventListener("click",(()=>function(e,t,n){e.classList.remove(`${d}`),e.classList.add(`${i}`);const a={...t};a.mode="open",o(a,n)}(e,t,n))),s.addEventListener("click",(()=>function(e,t,n){e.classList.remove(`${i}`),e.classList.add(`${d}`);const a={...t};a.mode="closed",o(a,n)}(e,t,n))),l.addEventListener("click",(a=>function(e,t,n,a){if(e.stopPropagation(),e.preventDefault(),"checked"===e.target.parentElement.querySelector("input").getAttribute("checked")){t.classList.add(`${r}`);const e={...n};return e.mode="banner",void o(e,a)}t.classList.remove(`${r}`);const s={...n};s.mode="open",o(s,a)}(a,e,t,n)))}function Z(e,t,n){e.addEventListener("dragstart",R,0),document.body.addEventListener("dragover",H,0),document.body.addEventListener("drop",(e=>function(e,t,n){e.preventDefault(),e.stopPropagation();const a=e.dataTransfer.getData("text"),s=document.getElementById(a),l=e.pageX-z,c=e.pageY-J;var i,d,r;d=l,r=c,(i=s).style.top=`${r}px`,i.style.left=`${d}px`;const u={...t};u.posTop=c,u.posLeft=l,o(u,n),e.dataTransfer.clearData()}(e,t,n)),0)}const ee=e=>{const{defaultDevSettings:t,sessionStorageKey:n,sessionStorageDevKey:o}=e;X(n),function(){const e=document.querySelectorAll(`.${L}`),t=document.getElementById(I.settingsModalSubmitId);e.forEach((e=>{e.addEventListener("click",Y)})),t.addEventListener("click",Q)}();const a=document.querySelector(`.${c}`);W(a,t,o),t.isDraggable&&Z(a,t,o)},te={settings:{lowRAM:4,lowCPU:4,slowConnectionTypes:["slow-2g","2g","3g"]},sessionStorageKey:"progressiveUserSettings",sessionStorageDevKey:"progressiveUserDevSettings",defaultDevSettings:{isDraggable:1,mode:"closed",posTop:20,posLeft:20}},ne=o=>{const l={...te,...o},{sessionStorageKey:c,sessionStorageDevKey:i,defaultDevSettings:d}=l,r=(()=>{const e=new URLSearchParams(window.location.search).entries(),t={};return[...e].forEach((e=>{const[n,o]=e;t[n]=o})),t})(),u=n(c),p=n(i),g=t(c)?(t=>{const{slowConnectionTypes:n}=t;return{connectionSpeed:e(n)}})(l.settings):s(l.settings),v=Object.assign(u,g,r);a(v,c),window.addEventListener("load",(()=>{const e=Object.keys(p).length?p:d;document.body.insertAdjacentHTML("afterbegin",F(e)),ee(l)}))};window.progUXdev=ne}(); diff --git a/dist/index-dev.html b/dist/index-dev.html new file mode 100644 index 0000000..1b22cc0 --- /dev/null +++ b/dist/index-dev.html @@ -0,0 +1,11 @@ + + + Progressive UX Dev Example + + + + + +

    Progressive Page - Dev

    + + \ No newline at end of file diff --git a/dist/index.html b/dist/index.html new file mode 100644 index 0000000..f68998e --- /dev/null +++ b/dist/index.html @@ -0,0 +1,14 @@ + + + Progressive UX Prod Example + + + +

    Progressive Page - Prod

    + + diff --git a/dist/prod/bundle.js b/dist/prod/bundle.js new file mode 100644 index 0000000..623348f --- /dev/null +++ b/dist/prod/bundle.js @@ -0,0 +1 @@ +!function(){"use strict";const n=n=>"connection"in navigator?n.indexOf(navigator.connection.effectiveType)>=0?"slow":"fast":"unknown",e=n=>null!==sessionStorage.getItem(n),o=n=>{try{return e(n)?JSON.parse(sessionStorage.getItem(n)):{}}catch(n){return 0}};const t=(n,e)=>{((n,e)=>{try{sessionStorage.setItem(e,JSON.stringify(n))}catch(n){}})(n,e),function(n){const e=o(n),t=document.getElementsByTagName("html")[0];Object.entries(e).forEach((n=>{const[e,o]=n,r=`${e}-${o}`;t.classList.add(r)}))}(e)},r=e=>{const{lowRAM:o,lowCPU:t,slowConnectionTypes:r}=e;return{memoryLevel:(n=>{if(!("deviceMemory"in navigator))return"unknown";const e=navigator.deviceMemory;return e===n?"mid":e>n?"high":"low"})(o),cpuLevel:(n=>{if(!("hardwareConcurrency"in navigator))return"unknown";const e=navigator.hardwareConcurrency;return e===n?"mid":e>n?"high":"low"})(t),connectionSpeed:n(r),saveData:"connection"in navigator?navigator.connection.saveData:0,reducedMotion:window.matchMedia("(prefers-reduced-motion: reduce)").matches,doNotTrack:(()=>{const n="doNotTrack"in navigator,e="1"===navigator.doNotTrack;return n&&e})()}},s={settings:{lowRAM:4,lowCPU:4,slowConnectionTypes:["slow-2g","2g","3g"]},sessionStorageKey:"progressiveUserSettings"},i=i=>{const c={...s,...i},{sessionStorageKey:a}=c,g=o(a),d=e(a)?(e=>{const{slowConnectionTypes:o}=e;return{connectionSpeed:n(o)}})(c.settings):r(c.settings),u=Object.assign(g,d);t(u,a)};window.progUX=i}(); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..392157a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4818 @@ +{ + "name": "@nc/progux", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@eslint/eslintrc": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", + "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@koa/cors": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@koa/cors/-/cors-3.1.0.tgz", + "integrity": "sha512-7ulRC1da/rBa6kj6P4g2aJfnET3z8Uf3SWu60cjbtxTA5g8lxRdX/Bd2P92EagGwwAhANeNw8T8if99rJliR6Q==", + "dev": true, + "requires": { + "vary": "^1.1.2" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/node": { + "version": "14.14.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz", + "integrity": "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "optional": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true, + "optional": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escape-sequences": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-5.1.2.tgz", + "integrity": "sha512-JcpoVp1W1bl1Qn4cVuiXEhD6+dyXKSOgCn2zlzE8inYgCJCBy1aPnUhlz6I4DFum8D4ovb9Qi/iAjUcGvG2lqw==", + "dev": true, + "requires": { + "array-back": "^4.0.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-back": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz", + "integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true, + "optional": true + }, + "array-includes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz", + "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "get-intrinsic": "^1.0.1", + "is-string": "^1.0.5" + } + }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "optional": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "byte-size": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-6.2.0.tgz", + "integrity": "sha512-6EspYUCAPMc7E2rltBgKwhG+Cmk0pDm9zDtF1Awe2dczNUL3YpZ8mTs/dueOTS1hqGWBOatqef4jYMGjln7WmA==", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "dev": true, + "requires": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true, + "optional": true + } + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true, + "optional": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "co-body": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", + "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", + "dev": true, + "requires": { + "inflation": "^2.0.0", + "qs": "^6.5.2", + "raw-body": "^2.3.3", + "type-is": "^1.6.16" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "optional": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "optional": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "command-line-args": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.1.1.tgz", + "integrity": "sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg==", + "dev": true, + "requires": { + "array-back": "^3.0.1", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "dependencies": { + "array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true + }, + "typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "dev": true + } + } + }, + "command-line-usage": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.1.tgz", + "integrity": "sha512-F59pEuAR9o1SF/bD0dQBDluhpT4jJQNWUHEuVBqpDmCUo6gPjCi+m9fCWnWZVR/oG6cMTUms4h+3NPl74wGXvA==", + "dev": true, + "requires": { + "array-back": "^4.0.1", + "chalk": "^2.4.2", + "table-layout": "^1.0.1", + "typical": "^5.2.0" + }, + "dependencies": { + "typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true + } + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "common-log-format": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/common-log-format/-/common-log-format-1.0.0.tgz", + "integrity": "sha512-fFn/WPNbsTCGTTwdCpZfVZSa5mgqMEkA0gMTRApFSlEsYN+9B2FPfiqch5FT+jsv5IV1RHV3GeZvCa7Qg+jssw==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "confusing-browser-globals": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true, + "optional": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "dev": true, + "requires": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + } + }, + "copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=", + "dev": true + }, + "copyfiles": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.3.0.tgz", + "integrity": "sha512-73v7KFuDFJ/ofkQjZBMjMBFWGgkS76DzXvBMUh7djsMOE5EELWtAO/hRB6Wr5Vj5Zg+YozvoHemv0vnXpqxmOQ==", + "dev": true, + "requires": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "yargs": "^15.3.1" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-mixin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/create-mixin/-/create-mixin-3.0.0.tgz", + "integrity": "sha512-LkdMqnWT9LaqBN4huqpUnMz56Yr1mVSoCduAd2xXefgH/YZP2sXCMAyztXjk4q8hTF/TlcDa+zQW2aTgGdjjKQ==", + "dev": true + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "optional": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.0-next.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", + "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.1", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.3", + "string.prototype.trimstart": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.20.0.tgz", + "integrity": "sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.3.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "file-entry-cache": "^6.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.4", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "eslint-config-airbnb-base": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", + "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "^1.2.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "optional": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "file-entry-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", + "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dev": true, + "requires": { + "array-back": "^3.0.1" + }, + "dependencies": { + "array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true + } + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "optional": true, + "requires": { + "globule": "^1.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true, + "optional": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "globule": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", + "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", + "dev": true, + "optional": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "optional": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "http-assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz", + "integrity": "sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==", + "dev": true, + "requires": { + "deep-equal": "~1.0.1", + "http-errors": "~1.7.2" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + } + } + }, + "http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + } + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "in-publish": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==", + "dev": true, + "optional": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "optional": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-function": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", + "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true, + "optional": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true, + "optional": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true, + "optional": true + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true, + "optional": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true, + "optional": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "dev": true, + "requires": { + "tsscmp": "1.0.6" + } + }, + "koa": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.1.tgz", + "integrity": "sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w==", + "dev": true, + "requires": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.8.0", + "debug": "~3.1.0", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^1.2.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + } + }, + "koa-bodyparser": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", + "integrity": "sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==", + "dev": true, + "requires": { + "co-body": "^6.0.0", + "copy-to": "^2.0.1" + } + }, + "koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", + "dev": true + }, + "koa-compress": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/koa-compress/-/koa-compress-3.1.0.tgz", + "integrity": "sha512-0m24/yS/GbhWI+g9FqtvStY+yJwTObwoxOvPok6itVjRen7PBWkjsJ8pre76m+99YybXLKhOJ62mJ268qyBFMQ==", + "dev": true, + "requires": { + "bytes": "^3.0.0", + "compressible": "^2.0.0", + "koa-is-json": "^1.0.0", + "statuses": "^1.0.0" + } + }, + "koa-conditional-get": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-conditional-get/-/koa-conditional-get-2.0.0.tgz", + "integrity": "sha1-pD83I8HQFLcwo07Oit8wuTyCM/I=", + "dev": true + }, + "koa-convert": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", + "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", + "dev": true, + "requires": { + "co": "^4.6.0", + "koa-compose": "^3.0.0" + }, + "dependencies": { + "koa-compose": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", + "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", + "dev": true, + "requires": { + "any-promise": "^1.1.0" + } + } + } + }, + "koa-etag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/koa-etag/-/koa-etag-3.0.0.tgz", + "integrity": "sha1-nvc4Ld1agqsN6xU0FckVg293HT8=", + "dev": true, + "requires": { + "etag": "^1.3.0", + "mz": "^2.1.0" + } + }, + "koa-is-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", + "integrity": "sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ=", + "dev": true + }, + "koa-json": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/koa-json/-/koa-json-2.0.2.tgz", + "integrity": "sha1-Nq8U5uofXWRtfESihXAcb4Wk/eQ=", + "dev": true, + "requires": { + "koa-is-json": "1", + "streaming-json-stringify": "3" + } + }, + "koa-morgan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/koa-morgan/-/koa-morgan-1.0.1.tgz", + "integrity": "sha1-CAUuDODYOdPEMXi5CluzQkvvH5k=", + "dev": true, + "requires": { + "morgan": "^1.6.1" + } + }, + "koa-range": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/koa-range/-/koa-range-0.3.0.tgz", + "integrity": "sha1-NYjjSWRzqDmhvSZNKkKx2FvX/qw=", + "dev": true, + "requires": { + "stream-slice": "^0.1.2" + } + }, + "koa-route": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/koa-route/-/koa-route-3.2.0.tgz", + "integrity": "sha1-dimLmaa8+p44yrb+XHmocz51i84=", + "dev": true, + "requires": { + "debug": "*", + "methods": "~1.1.0", + "path-to-regexp": "^1.2.0" + }, + "dependencies": { + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "koa-send": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", + "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "resolve-path": "^1.4.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "koa-static": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", + "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "koa-send": "^5.0.0" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "load-module": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/load-module/-/load-module-3.0.0.tgz", + "integrity": "sha512-ZqprfrTx4vfH5+1mgpspPh5JYsNyA193NkMUdb3GwpmVqMczOh8cUDJgZBmEZVlSR42JBGYTUxlBAX9LHIBtIA==", + "dev": true, + "requires": { + "array-back": "^4.0.1" + } + }, + "local-web-server": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/local-web-server/-/local-web-server-4.2.1.tgz", + "integrity": "sha512-v71LZool2w7uYA+tDP5HhfjzUxz5SFfcrPPB/zC98yFFawt7A6fcmAr2MR4Q9AHk/A8oyd/wrhEJBJLndwHxNQ==", + "dev": true, + "requires": { + "lws": "^3.1.0", + "lws-basic-auth": "^2.0.0", + "lws-blacklist": "^3.0.0", + "lws-body-parser": "^2.0.0", + "lws-compress": "^2.0.0", + "lws-conditional-get": "^2.0.0", + "lws-cors": "^3.0.0", + "lws-index": "^2.0.0", + "lws-json": "^2.0.0", + "lws-log": "^2.0.0", + "lws-mime": "^2.0.0", + "lws-range": "^3.0.0", + "lws-request-monitor": "^2.0.0", + "lws-rewrite": "^3.1.1", + "lws-spa": "^3.0.0", + "lws-static": "^2.0.0", + "node-version-matches": "^2.0.1" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "lodash.assignwith": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz", + "integrity": "sha1-EnqX8CrcQXUalU0ksN4X4QDgOOs=", + "dev": true + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "dev": true + }, + "lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "optional": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "optional": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "lws": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lws/-/lws-3.1.0.tgz", + "integrity": "sha512-I8rTgZxz8OJL0hjdlDxs6WpcVG7WSyalVHPQXXK+WPNVjm3KhkT5gV0Qmsgm2FRLbRUp15tso80xmDxMsyt7zA==", + "dev": true, + "requires": { + "ansi-escape-sequences": "^5.1.2", + "array-back": "^4.0.1", + "byte-size": "^6.2.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "create-mixin": "^3.0.0", + "koa": "^2.11.0", + "load-module": "^3.0.0", + "lodash.assignwith": "^4.2.0", + "node-version-matches": "^2.0.1", + "open": "^7.0.4", + "qrcode-terminal": "^0.12.0", + "reduce-flatten": "^3.0.0", + "typical": "^6.0.0", + "walk-back": "^4.0.0" + } + }, + "lws-basic-auth": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lws-basic-auth/-/lws-basic-auth-2.0.0.tgz", + "integrity": "sha512-zzyoGFLQPuKaQJvHMLmmSyfT6lIvocwcDXllTVW5brD0t0YgHYopILkzja+x+MIlJX/YhNKniaTSasujniYVjw==", + "dev": true, + "requires": { + "basic-auth": "^2.0.1" + } + }, + "lws-blacklist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lws-blacklist/-/lws-blacklist-3.0.0.tgz", + "integrity": "sha512-KNXGDBmbj+UGfWMBAefe2vrfuWpEQms/9Fd7kfMScTqAKF6nrVoEs4pkxfefArG3bX0bu7jWLyB4tJGma5WC6Q==", + "dev": true, + "requires": { + "array-back": "^4.0.1", + "path-to-regexp": "^6.1.0" + } + }, + "lws-body-parser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lws-body-parser/-/lws-body-parser-2.0.0.tgz", + "integrity": "sha512-QFDzln3sSdKWL9fVNWy2+ZmrKy/XaYRO0/FFB0MBrDCsNnzepeCD4I7rOOfyuphLn42yR8XUpWdcJ3Ii5aauRA==", + "dev": true, + "requires": { + "koa-bodyparser": "^4.2.1" + } + }, + "lws-compress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lws-compress/-/lws-compress-2.0.0.tgz", + "integrity": "sha512-5qDXI9pukVYWm07WjAOfpItLXKtL8lCHvjmW4RiXULhTRJj1qqBjNcmqReyk8L7NLUKhc+8eqoDDJFKURQEp0w==", + "dev": true, + "requires": { + "koa-compress": "^3.0.0" + } + }, + "lws-conditional-get": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lws-conditional-get/-/lws-conditional-get-2.0.0.tgz", + "integrity": "sha512-U05yDlFJKIYa7gJZYfnc1HIEuXbKpDJztgkvNYyxCqJC28j/k9ORoNnFNOIHpBh/jlPJgV8x7uH34mIxFAryWA==", + "dev": true, + "requires": { + "koa-conditional-get": "^2.0.0", + "koa-etag": "^3.0.0" + } + }, + "lws-cors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lws-cors/-/lws-cors-3.0.0.tgz", + "integrity": "sha512-diUkoyVZyzLB8LamdtUYYAfJdPAyu/+IjE3ZUcdnNQz9koECe4O2x3SWD7LSV43pd3CKgyiwwSxWJ4hTBZFIvQ==", + "dev": true, + "requires": { + "@koa/cors": "^3.0.0" + } + }, + "lws-index": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lws-index/-/lws-index-2.0.0.tgz", + "integrity": "sha512-qfkeQmKYnd13LmQubzI5LtFV2N8PJQG4QvgSoefoiB3dWre9k2T4C7ajjOTKO8mgSzYpUEREduNcQcLyt62n0g==", + "dev": true, + "requires": { + "serve-index-75lb": "^2.0.1" + } + }, + "lws-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lws-json/-/lws-json-2.0.0.tgz", + "integrity": "sha512-vqUFrAQ5BGpkMS2Mm/ZhgvUMi6Tgia7YtESG7pKjNoiSsD+TxncG0nqp8YjUh2xrEzi/SYFc/ed+9ZOl/t0A0g==", + "dev": true, + "requires": { + "koa-json": "^2.0.2" + } + }, + "lws-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lws-log/-/lws-log-2.0.0.tgz", + "integrity": "sha512-YveoazSZ0Qb1Tljdm8G8yn9c+mAMXgvLMACZzh5aZIk7p8YJwiXf9r1S+xY7wbXEcKG629KfVO0B5G5gRFcyDQ==", + "dev": true, + "requires": { + "koa-morgan": "^1.0.1", + "stream-log-stats": "^3.0.2" + } + }, + "lws-mime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lws-mime/-/lws-mime-2.0.0.tgz", + "integrity": "sha512-mfrAgRQ5+hkQ7LJ6EAgwnUeymNeYxwLXZY3UQ6C2hSTr7BqMSzm9k5O0C8wWP2dzdhChzITYKwzWbUnAYVBwtA==", + "dev": true + }, + "lws-range": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lws-range/-/lws-range-3.0.0.tgz", + "integrity": "sha512-7ZhA/LqQnKjolKBo/2BFj9DyDDXcJGY3v05TwYRD0qDGrxW4vuatEjluC3SV7ZO/k4PxDLdxuk+RCgL5t3ThtQ==", + "dev": true, + "requires": { + "koa-range": "^0.3.0" + } + }, + "lws-request-monitor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lws-request-monitor/-/lws-request-monitor-2.0.0.tgz", + "integrity": "sha512-ZTo0/pS42qiejcYlL+wlpurSbDSS0J7pDDohqBx7jjUQkgni2Qd8cPzn/kW8QI82gXgDmdZH+ps0vheLHlgdgg==", + "dev": true, + "requires": { + "byte-size": "^6.2.0" + } + }, + "lws-rewrite": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lws-rewrite/-/lws-rewrite-3.1.1.tgz", + "integrity": "sha512-cOeaPXIlLUVLxS6BZ52QzZVzI8JjCzlWD4RWizB5Hd+0YGO0SPa3Vgk7CIghtAOsSdjtXg/wSOap2H1h+tw8BQ==", + "dev": true, + "requires": { + "array-back": "^4.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "koa-route": "^3.2.0", + "path-to-regexp": "^6.1.0" + } + }, + "lws-spa": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lws-spa/-/lws-spa-3.0.0.tgz", + "integrity": "sha512-Tz10LfuOTUsRG6z+OCJ/vBN+4LQWoAGIJ1R02CFPrDk0pY3rHezM7/cCpq6Z6dXD+ipdNE8alkVn4zL2M+eVGg==", + "dev": true, + "requires": { + "koa-send": "^5.0.0" + } + }, + "lws-static": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lws-static/-/lws-static-2.0.0.tgz", + "integrity": "sha512-P25A0+IXdkB6Y6gZAG7X0mnaa+FJ8aTiWLUgM5kazaWmruRO7lyhSjitsA3y5TLI3DpPCZn0mWE4SRREujUZLg==", + "dev": true, + "requires": { + "koa-static": "^5.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "optional": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "optional": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "dev": true + }, + "mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "dev": true, + "requires": { + "mime-db": "1.45.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dev": true, + "requires": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "optional": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true, + "optional": true + } + } + }, + "node-sass": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", + "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", + "dev": true, + "optional": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "2.2.5", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "optional": true + } + } + }, + "node-version-matches": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-version-matches/-/node-version-matches-2.0.1.tgz", + "integrity": "sha512-oqk6+05FC0dNVY5NuXuhPEMq+m1b9ZjS9SIhVE9EjwCHZspnmjSO8npbKAEieinR8GeEgbecoQcYIvI/Kwcf6Q==", + "dev": true, + "requires": { + "semver": "^6.3.0" + } + }, + "noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "optional": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", + "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + } + }, + "object.values": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", + "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=", + "dev": true + }, + "open": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/open/-/open-7.3.1.tgz", + "integrity": "sha512-f2wt9DCBKKjlFbjzGb8MOAW8LH8F0mrs1zc7KTjAJ9PZNQbfenzWbNP1VZJvw6ICMG9r14Ah6yfwPn7T7i646A==", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", + "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true, + "optional": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "optional": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "optional": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true, + "optional": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true, + "optional": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qrcode-terminal": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", + "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", + "dev": true + }, + "qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "optional": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "optional": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "optional": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "optional": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "optional": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "reduce-flatten": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-3.0.0.tgz", + "integrity": "sha512-eczl8wAYBxJ6Egl6I1ECIF+8z6sHu+KE7BzaEDZTpPXKXfy9SUDQlVYwkRcNTjJLC3Iakxbhss50KuT/R6SYfg==", + "dev": true + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "optional": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "optional": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-path": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", + "integrity": "sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=", + "dev": true, + "requires": { + "http-errors": "~1.6.2", + "path-is-absolute": "1.0.1" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "2.26.11", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.26.11.tgz", + "integrity": "sha512-xyfxxhsE6hW57xhfL1I+ixH8l2bdoIMaAecdQiWF3N7IgJEMu99JG+daBiSZQjnBpzFxa0/xZm+3pbCdAQehHw==", + "dev": true, + "requires": { + "fsevents": "~2.1.2" + } + }, + "rollup-plugin-scss": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-scss/-/rollup-plugin-scss-2.6.1.tgz", + "integrity": "sha512-IWREkMDJLJbS3aa1aakYYdJc3yPUb4BBrmK8hgThmtr7hWevBvCZ3b0SXm/Tgx53RxV9q1Btf4hD7nczJiDsfw==", + "dev": true, + "requires": { + "node-sass": "4", + "rollup-pluginutils": "2" + } + }, + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass-graph": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "optional": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "optional": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "optional": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true, + "optional": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true, + "optional": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "optional": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "optional": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "optional": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "optional": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "optional": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "optional": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "optional": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "optional": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index-75lb": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/serve-index-75lb/-/serve-index-75lb-2.0.1.tgz", + "integrity": "sha512-/d9r8bqJlFQcwy0a0nb1KnWAA+Mno+V+VaoKocdkbW5aXKRQd/+4bfnRhQRQr6uEoYwTRJ4xgztOyCJvWcpBpQ==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.18", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true, + "optional": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-log-stats": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stream-log-stats/-/stream-log-stats-3.0.2.tgz", + "integrity": "sha512-393j7aeF9iRdHvyANqEQU82UQmpw2CTxgsT83caefh+lOxavVLbVrw8Mr4zjXeZLh2+xeHZMKfVx4T0rJ/EchA==", + "dev": true, + "requires": { + "JSONStream": "^1.3.5", + "ansi-escape-sequences": "^5.1.2", + "byte-size": "^6.2.0", + "common-log-format": "^1.0.0", + "lodash.throttle": "^4.1.1", + "stream-via": "^1.0.4", + "table-layout": "~1.0.0" + } + }, + "stream-slice": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/stream-slice/-/stream-slice-0.1.2.tgz", + "integrity": "sha1-LcT04bk2+xPz6zmi3vGTJ5jQeks=", + "dev": true + }, + "stream-via": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-via/-/stream-via-1.0.4.tgz", + "integrity": "sha512-DBp0lSvX5G9KGRDTkR/R+a29H+Wk2xItOF+MpZLLNDWbEV9tGPnqLPxHEYjmiz8xGtJHRIqmI+hCjmNzqoA4nQ==", + "dev": true + }, + "streaming-json-stringify": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/streaming-json-stringify/-/streaming-json-stringify-3.1.0.tgz", + "integrity": "sha1-gCAEN6mTzDnE/gAmO3s7kDrIevU=", + "dev": true, + "requires": { + "json-stringify-safe": "5", + "readable-stream": "2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "optional": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "optional": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", + "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "dev": true, + "requires": { + "ajv": "^7.0.2", + "lodash": "^4.17.20", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ajv": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.1.0.tgz", + "integrity": "sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "table-layout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.1.tgz", + "integrity": "sha512-dEquqYNJiGwY7iPfZ3wbXDI944iqanTSchrACLL2nOB+1r+h1Nzu2eH+DuPPvWvm5Ry7iAPeFlgEtP5bIp5U7Q==", + "dev": true, + "requires": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "dependencies": { + "typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true + } + } + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "optional": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "terser": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz", + "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "optional": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true, + "optional": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.2" + } + }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typical": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-6.0.1.tgz", + "integrity": "sha512-+g3NEp7fJLe9DPa1TArHm9QAA7YciZmWnfAqEaFrBihQ7epOv9i99rjtgb6Iz0wh3WuQDjsCTDfgRoGnmHN81A==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true, + "optional": true + }, + "v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "walk-back": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-4.0.0.tgz", + "integrity": "sha512-kudCA8PXVQfrqv2mFTG72vDBRi8BKWxGgFLwPpzHcpZnSwZk93WMwUDVcLHWNsnm+Y0AC4Vb6MUNRgaHfyV2DQ==", + "dev": true + }, + "watch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/watch/-/watch-1.0.2.tgz", + "integrity": "sha1-NApxe952Vyb6CqB9ch4BR6VR3ww=", + "dev": true, + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "optional": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "optional": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrapjs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.0.tgz", + "integrity": "sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ==", + "dev": true, + "requires": { + "reduce-flatten": "^2.0.0", + "typical": "^5.0.0" + }, + "dependencies": { + "reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "dev": true + }, + "typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true + } + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true, + "optional": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "ylru": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", + "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..dcc243f --- /dev/null +++ b/package.json @@ -0,0 +1,55 @@ +{ + "name": "@nc/progux", + "version": "1.0.1", + "description": "Progressive user experience library", + "license": "MIT", + "main": "dist/prod/bundle.js", + "publishConfig": { + "registry": "http://repo-npm.int.netcentric.biz/repository/npm-nc/" + }, + "repository": { + "type": "git", + "url": "ssh://git@source.int.netcentric.biz:7999/npm-nc/progux.git" + }, + "contributors": [ + { + "name": "Scott Francis", + "email": "scottfrancisfrancis@hotmail.com" + }, + { + "name": "Nikolaos Zisis", + "email": "nikos.el.zisis@gmail.com" + }, + { + "name": "Ines Akrap", + "email": "akrap.ines@gmail.com" + } + ], + "scripts": { + "watch": "npm run watch-js-css | npm run watch-html", + "watch-js-css": "watch 'npm run build-js-css' src/frontend/js src/frontend/css", + "watch-html": "watch 'npm run copy-html' src/frontend/html", + "copy-html": "copyfiles -f src/frontend/html/*.html dist", + "build-js-css": "rollup --config rollup-config.js", + "webserver": "ws --static.index dist/index.html", + "webserver-dev": "ws --static.index dist/index-dev.html", + "start": "npm run webserver | npm run watch", + "start-dev": "npm run webserver-dev | npm run watch" + }, + "devDependencies": { + "copyfiles": "2.3.0", + "eslint": "^7.20.0", + "eslint-config-airbnb-base": "^14.2.1", + "eslint-plugin-import": "^2.22.1", + "local-web-server": "4.2.1", + "rollup": "2.26.11", + "rollup-plugin-scss": "2.6.1", + "rollup-plugin-terser": "7.0.2", + "watch": "1.0.2" + }, + "keywords": [ + "performance", + "progressive-user-experience", + "adaptive-loading" + ] +} diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..f820fa1 --- /dev/null +++ b/readme.md @@ -0,0 +1,189 @@ + + +![ProgUX logo](assets/Logo_ProgUX.png "") + +# @nc/ProgUX 1.0.1 + +Progressive User Experience Library (ProgUX) is designed to help developers make decisions on the end experience they deliver to the end users. + +Once added to a web application an object will be added to the session storage and classes added to the HTML tag that will indicate: + +* Users Preferences + * Prefers Reduced Motion + * Save Data Settings + * Tracking Settings +* Network + * Connection Speed +* Device Capabilities + * CPU Capacity + * Memory Level + +Each of these can be used to decide what features, content, JavaScript, CSS, etc. will be delivered to the user to create a progressive user experience. + +Idea is similar to one provided in [react-adapitve-hooks](https://github.com/GoogleChromeLabs/react-adaptive-hooks), however ProgUX is not limited to React, adds to CSS and provides a small simulator + + + +## Installation + +To start using ProgUX inline the code from `dist/prod/bundle.js` and call the progUX() to initialise the script. +If you want to override any of the configurations pass it to the function as an object. + +``` + +``` + + + +## Usage + +How your application changes and adapts to the environmental constraints and capabilities is ultimately up to you. ProgUX will not perform any magic that will change your application, it simply provides each developer who uses it a snapshot with which they can make decisions. + +Ultimately how you use this is up-to-you, below we describe how you can gain access to this information. + +Once installed and the application has reloaded developers will have access to an object in the session storage as well as a number of classes to reference in the `` tag. + + +### Session Storage Object + +The object will contain the following keys and values: + +```javascript +connectionSpeed: String // 'slow/fast/unknown' +cpuLevel: String // 'low/mid/high/unknown' +memoryLevel: String // 'low/mid/high/unknown' +reducedMotion: Boolean +saveData: Boolean +tracking: Boolean +``` + + +### CSS Classes + +The `` tag will contain the following classes + +``` +connectionSpeed-[slow/fast/unknown] +cpuLevel-[low/mid/high/unknown] +memoryLevel-[low/mid/high/unknown] +reducedMotion-[true/false] +saveData-[true/false] +tracking-[enabled/disabled] +``` + +The output will look similar to this + +``` + +``` + +You then have access to the classes to make decisions in your code, for example + +``` +.connectionSpeed-slow { + .stage-image { + display: block; + } + + .stage-video { + display: none; + } +} +``` + +_To try to limit the impact of unnecessary JavaScript checks ProgUX will only update the `connectionSpeed` during a user session. This is simply because we believe that this is the only one of our checks likely to change during a session._ + + +### Development/debugging Environment + +To aid development we have provided a `dist/dev/dev-bundle.js` and `dist/dev/dev-bundle.css` files that contain extra features. + +Using this script will run the checks in exactly the same way as the production script but contains a modal that allows you to change the settings on the fly. + +You can inline this script as well or use it as modules (JS). CSS you can add to your project and link to the stylesheet in the head. + + +#### Settings Modal + +Once your application has loaded you will see a cog icon (by default in the top left of your screen), if you click the icon it will open the settings modal. + +![Alt](assets/settings_modal.png "") + +The modal will automatically be set to reflect the current settings and to make adjustments to this you simply alter the controls to your new desired configuration and hit the 'Submit' button. This will force a page reload, the session storage object and the classes in the HTML will have been updated + +Inside the modal there is also a toggle switch to show a 'Current Status' bar. + +![Alt](assets/status_bar.png "") + +This is designed so that if you need to take screenshots of particular variations of the application it will be easy to identify the ProgUX settings at that time. + +The Status Bar is moveable to provide you with the best result. + + +### Configuration + +ProgUX provides a `config.js` file found in `src/js`. + +Inside the file you will find an object with the following properties + +```javascript +// prod and dev +settings: + lowRAM: Number // 0.25, 0.5, 1, 2, 4, 8 + lowCPU: Number // > 0 + slowConnectionTypes: Array // 'slow-2g','2g','3g', or '4g' +sessionStorageKey: String // 'progressiveUserSettings', +// dev only +sessionStorageDevKey: String // 'progressiveUserDevSettings', +defaultDevSettings: + isDraggable: Boolean + mode: String // 'closed','open' + posTop: Number // 20 (in px) + posLeft: Number // 20 (in px) + +``` +You can use this attribute names and structure when overriding wanted attributes. + + +### Overriding config + +Oveeride of the default congiguration is possible by passing the object with new values for wanted properties to init function (progUX() or progUXdev()) + +Overriding the values will set the thresholds tested by ProgUX in your application. +For instance, by default `slowConnectionTypes` is set to `['slow-2g', '2g', '3g']`, if you considered '3g' to not be a slow connection you could remove it. + +Overriding the sessionStorageKey will alter the name of the object saved in your session storage, etc. + + + +## Browser Support + +Unfortunately, not all modern browsers support all the APIs, so please check support list before using and plan fallback. + +* [Network Information API - saveData](https://developer.mozilla.org/en-US/docs/Web/API/Network_Information_API) is available in [Chrome 61+, Opera 48+, Edge 79+, Chrome for Android 76+, Firefox for Android 68+](https://caniuse.com/#search=saveData) + +* [Navigator API - doNotTrack](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/doNotTrack) is available in [Chrome 23+, Firefox 32+, Opera 12.1+, Edge 17+, Chrome for Android 76+, Firefox for Android 68+](https://caniuse.com/?search=navigator.doNotTrack) + +* [Prefers Reduced Motion Media Query](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion) is available in [Chrome 74+, Firefox 63+, Safari 10.1+ Opera 12.1+, Edge 79+, Chrome for Android 76+, Firefox for Android 68+, iOS Safari 10.3+](https://caniuse.com/?search=prefers-reduced-motion) + +* [Network Information API - effectiveType](https://developer.mozilla.org/en-US/docs/Web/API/NetworkInformation/effectiveType) is available in [Chrome 61+, Opera 48+, Edge 79+, Chrome for Android 76+, Firefox for Android 68+](https://caniuse.com/#search=effectiveType) + +* [Hardware Concurrency API](https://developer.mozilla.org/en-US/docs/Web/API/NavigatorConcurrentHardware/hardwareConcurrency) is available in [Chrome 37+, Safari 10.1+, Firefox 48+, Opera 24+, Edge 15+, Chrome for Android 76+, Safari on iOS 10.3+, Firefox for Android 68+, Opera for Android 46+](https://caniuse.com/#search=navigator.hardwareConcurrency) + +* [Device Memory API](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/deviceMemory) is available in [Chrome 63+, Opera 50+, Edge 79+, Chrome for Android 76+, Opera for Android 46+](https://caniuse.com/#search=deviceMemory) + + + +## Contributing +Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. + + + +## License +[MIT](https://choosealicense.com/licenses/mit/) diff --git a/rollup-config.js b/rollup-config.js new file mode 100644 index 0000000..ee25c14 --- /dev/null +++ b/rollup-config.js @@ -0,0 +1,58 @@ +import { terser } from 'rollup-plugin-terser'; +import scss from 'rollup-plugin-scss'; + +export default [{ + input: 'src/frontend/js/index-prod.js', + plugins: [terser({ + toplevel: true, + keep_classnames: false, + compress: { + arrows: true, + arguments: false, + booleans: true, + booleans_as_integers: true, + collapse_vars: true, + comparisons: true, + computed_props: true, + conditionals: true, + dead_code: true, + directives: true, + drop_console: true, + drop_debugger: true, + ecma: 5 + }, + })], + output: { + file: 'dist/prod/bundle.js', + format: 'iife' + } +}, { + input: 'src/frontend/js/index-dev.js', + plugins: [terser({ + toplevel: true, + keep_classnames: false, + compress: { + arrows: true, + arguments: false, + booleans: true, + booleans_as_integers: true, + collapse_vars: true, + comparisons: true, + computed_props: true, + conditionals: true, + dead_code: true, + directives: true, + drop_console: false, + drop_debugger: false, + ecma: 5 + }, + }), scss({ + output: 'dist/dev/dev-bundle.css', + outputStyle: 'compressed', + watch: ['src/frontend/css/debugUtils'], + })], + output: { + file: 'dist/dev/dev-bundle.js', + format: 'iife' + }, +}]; diff --git a/src/dev/js/displayStatus.js b/src/dev/js/displayStatus.js new file mode 100644 index 0000000..96ed7ef --- /dev/null +++ b/src/dev/js/displayStatus.js @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2021 Netcentric, a Cognizant Digital Business + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import { defaultConfig } from '../../frontend/js/config'; + +function findStorageValues(storageKey) { + try { + const hasSessionStorageEntry = sessionStorage.getItem(storageKey) !== null; + return hasSessionStorageEntry ? JSON.parse(sessionStorage.getItem(storageKey)) : {}; + } catch (e) { + console.log(e); + return {}; + } +} + +function addStatusToPage(storageKey) { + const storageValues = findStorageValues(storageKey); + const statusPanel = document.querySelector('.statusPanel'); + let content = ''; + + Object.entries(storageValues).forEach((pair) => { + const [key, value] = pair; + content += ` + + + `; + }); + + content += '
    + ${key} + + ${value} +
    '; + + statusPanel.insertAdjacentHTML('afterbegin', content); +} + +addStatusToPage(defaultConfig.sessionStorageKey); diff --git a/src/frontend/css/debugUtils/settingsModal.config.scss b/src/frontend/css/debugUtils/settingsModal.config.scss new file mode 100644 index 0000000..ef150a4 --- /dev/null +++ b/src/frontend/css/debugUtils/settingsModal.config.scss @@ -0,0 +1,11 @@ +$sm-primaryFontColor: #252525; +$sm-secondaryFontColor: #fff; +$sm-backgroundColor: #fff; +$sm-highlightColor: #16b1a3; +$sm-buttonColor: $sm-highlightColor; +$sm-buttonFontColor: $sm-secondaryFontColor; +$sm-optionsBorderColor: #d4d4d4; +$sm-sliderUnselectedColour: $sm-primaryFontColor; +$sm-sliderSelectedColour: $sm-highlightColor; +$sm-iconColor: $sm-secondaryFontColor; +$sm-labelHoverColor: #eaeaea; diff --git a/src/frontend/css/debugUtils/settingsModal.scss b/src/frontend/css/debugUtils/settingsModal.scss new file mode 100644 index 0000000..d483c53 --- /dev/null +++ b/src/frontend/css/debugUtils/settingsModal.scss @@ -0,0 +1,275 @@ +@import "settingsModal.config"; + +.settingsModal { + $root: &; + + display: inline-block; + position: absolute; + z-index: 10; + font-family: Arial, sans-serif; + + &[draggable="true"] { + cursor: move; + } + + &--open { + background-color: $sm-backgroundColor; + color: $sm-primaryFontColor; + box-shadow: 0 8px 17px 2px rgba(0,0,0,0.14), 0 3px 14px 2px rgba(0,0,0,0.12), 0 5px 5px -3px rgba(0,0,0,0.2); + + #{$root}__openIcon { + display: none; + } + } + + &--closed { + + #{$root}__title, + #{$root}__closeIcon, + #{$root}__form, + #{$root}__controller--view { + display: none; + } + + } + + &--banner { + display: flex; + + #{$root}__header, + #{$root}__submit { + display: none; + } + + #{$root}__controller--view #{$root}__parameter { + font-size: 12px; + } + } + + &__header { + background-color: $sm-highlightColor; + color: $sm-secondaryFontColor; + font-size: 18px; + font-weight: bold; + text-transform: uppercase; + line-height: 36px; + padding: 5px 20px; + display: flex; + align-items: center; + justify-content: space-between; + + #{$root}--closed & { + border-radius: 50%; + padding: 10px; + box-shadow: 0 8px 17px 2px rgba(0,0,0,0.14), 0 3px 14px 2px rgba(0,0,0,0.12), 0 5px 5px -3px rgba(0,0,0,0.2); + } + } + + &__icon { + fill: $sm-iconColor; + } + + &__closeIcon, + &__openIcon { + cursor: pointer; + } + + &__closeIcon { + margin-right: -3px; + margin-top: 6px; + } + + &__openIcon { + height: 24px; + width: 24px; + } + + &__form { + font-size: 14px; + padding: 10px 20px; + + #{$root}--banner & { + display: flex; + background-color: $sm-highlightColor; + color: $sm-backgroundColor; + margin-bottom: 0; + } + } + + &__controller { + display: flex; + + #{$root}--banner & { + margin: 0 10px 0 0; + border-right: 1px solid $sm-backgroundColor; + } + + &:last-of-type { + + #{$root}--banner & { + border-right: none; + } + } + + &--options { + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + margin: 0 0 20px; + } + + &--toggle { + flex-direction: row; + align-items: center; + justify-content: space-between; + margin: 10px 0 10px; + + #{$root}--banner & { + flex-direction: column; + align-items: start; + justify-content: start; + } + } + + &--view { + padding: 20px; + margin: 0; + font-size: 14px; + border-top: 1px solid $sm-optionsBorderColor; + + #{$root}--banner & { + border-top: none; + padding: 10px; + margin: 0; + width: 80px; + text-align: center; + align-items: center; + justify-content: space-evenly; + } + } + } + + &__parameter { + text-transform: uppercase; + font-weight: bold; + + #{$root}--banner & { + line-height: 18px; + } + } + + &__parameterValue { + display: none; + + #{$root}--banner & { + display: inline-block; + } + } + + &__parameterInput { + + #{$root}--banner & { + display: none; + } + } + + &__options { + width: 100%; + display: flex; + align-items: center; + justify-content: space-evenly; + border: 1px solid $sm-optionsBorderColor; + padding: 0; + margin: 0; + } + + &__option { + width: 100%; + list-style: none; + } + + &__input { + opacity: 0; + position: fixed; + width: 0; + + &:checked { + + & + label { + background-color: $sm-sliderSelectedColour; + color: $sm-secondaryFontColor; + } + + & + #{$root}__slider { + background-color: $sm-sliderSelectedColour; + border-color: $sm-sliderSelectedColour; + } + + & + #{$root}__slider:after { + background-color: $sm-sliderSelectedColour; + border-color: $sm-sliderSelectedColour; + -webkit-transform: translateX(25px); + -ms-transform: translateX(25px); + transform: translateX(25px); + } + } + } + + &__label { + cursor: pointer; + display: block; + line-height: 30px; + padding: 0 10px; + text-align: center; + transition: .3s; + + &:hover { + background-color: $sm-labelHoverColor; + } + } + + &__toggle { + width: 3em; + height: 9px; + position: relative; + } + + &__slider { + cursor: pointer; + position: absolute; + width: 42px; + top: 0; + left: 0; + right: 0; + bottom: 0; + border: 1px solid $sm-sliderUnselectedColour; + -webkit-transition: .3s; + transition: .2s; + border-radius: 34px; + + &:after { + position: absolute; + content: ""; + height: 18px; + width: 18px; + top: calc(-50% - 2px); + left: -1px; + background-color: $sm-sliderUnselectedColour; + border-radius: 50%; + -webkit-transition: .2s; + transition: .2s; + } + } + + &__submit { + cursor: pointer; + width: 100%; + color: $sm-buttonFontColor; + background-color: $sm-buttonColor; + border: 1px solid $sm-buttonColor; + text-transform: uppercase; + margin: 20px 0; + padding: 10px 20px; + font-weight: bold; + } +} diff --git a/src/frontend/css/dev-styles.js b/src/frontend/css/dev-styles.js new file mode 100644 index 0000000..31df1d4 --- /dev/null +++ b/src/frontend/css/dev-styles.js @@ -0,0 +1,3 @@ +// Import stylesheets to be compiled to dev-bundle.css + +import './debugUtils/settingsModal.scss'; diff --git a/src/frontend/html/index-dev.html b/src/frontend/html/index-dev.html new file mode 100644 index 0000000..1b22cc0 --- /dev/null +++ b/src/frontend/html/index-dev.html @@ -0,0 +1,11 @@ + + + Progressive UX Dev Example + + + + + +

    Progressive Page - Dev

    + + \ No newline at end of file diff --git a/src/frontend/html/index.html b/src/frontend/html/index.html new file mode 100644 index 0000000..f68998e --- /dev/null +++ b/src/frontend/html/index.html @@ -0,0 +1,14 @@ + + + Progressive UX Prod Example + + + +

    Progressive Page - Prod

    + + diff --git a/src/frontend/js/config.js b/src/frontend/js/config.js new file mode 100644 index 0000000..4c4ce15 --- /dev/null +++ b/src/frontend/js/config.js @@ -0,0 +1,19 @@ +export const defaultConfig = { + settings: { + lowRAM: 4, + lowCPU: 4, + slowConnectionTypes: ['slow-2g', '2g', '3g'], + }, + sessionStorageKey: 'progressiveUserSettings', +}; + +export const devConfig = { + ...defaultConfig, + sessionStorageDevKey: 'progressiveUserDevSettings', + defaultDevSettings: { + isDraggable: true, + mode: 'closed', + posTop: 20, + posLeft: 20, + }, +}; diff --git a/src/frontend/js/debugUtils/icons/closeIcon.js b/src/frontend/js/debugUtils/icons/closeIcon.js new file mode 100644 index 0000000..678242c --- /dev/null +++ b/src/frontend/js/debugUtils/icons/closeIcon.js @@ -0,0 +1,5 @@ +const closeIcon = ` + +`; + +export default closeIcon; diff --git a/src/frontend/js/debugUtils/icons/settingsIcon.js b/src/frontend/js/debugUtils/icons/settingsIcon.js new file mode 100644 index 0000000..dc8fc45 --- /dev/null +++ b/src/frontend/js/debugUtils/icons/settingsIcon.js @@ -0,0 +1,6 @@ +const settingsIcon = ` + + +`; + +export default settingsIcon; diff --git a/src/frontend/js/debugUtils/settingsModal.config.js b/src/frontend/js/debugUtils/settingsModal.config.js new file mode 100644 index 0000000..e32c025 --- /dev/null +++ b/src/frontend/js/debugUtils/settingsModal.config.js @@ -0,0 +1,193 @@ +const baseModalClass = 'settingsModal'; +const modalClasses = { + settingsModalBaseClass: baseModalClass, + settingsModalBaseOpenClass: `${baseModalClass}--open`, + settingsModalBaseClosedClass: `${baseModalClass}--closed`, + settingsModalBannerClass: `${baseModalClass}--banner`, + settingsModalHeaderClass: `${baseModalClass}__header`, + settingsModalTitleClass: `${baseModalClass}__title`, + settingsModalFormClass: `${baseModalClass}__form`, + settingsModalSubmitClass: `${baseModalClass}__submit`, + settingsModalOptionsClass: `${baseModalClass}__options`, + settingsModalOptionClass: `${baseModalClass}__option`, + settingsModalControllerClass: `${baseModalClass}__controller`, + settingsModalControllerToggleClass: `${baseModalClass}__controller--toggle`, + settingsModalControllerOptionsClass: `${baseModalClass}__controller--options`, + settingsModalControllerViewClass: `${baseModalClass}__controller--view`, + settingsModalParameterClass: `${baseModalClass}__parameter`, + settingsModalParameterValueClass: `${baseModalClass}__parameterValue`, + settingsModalParameterInputClass: `${baseModalClass}__parameterInput`, + settingsModalInputClass: `${baseModalClass}__input`, + settingsModalLabelClass: `${baseModalClass}__label`, + settingsModalToggleClass: `${baseModalClass}__toggle`, + settingsModalSliderClass: `${baseModalClass}__slider`, + settingsModalOverlayClass: `${baseModalClass}__overlay`, + settingsModalOverlayOpenClass: `${baseModalClass}__overlay--open`, + settingsModalOverlayClosedClass: `${baseModalClass}__overlay--closed`, + settingsModalOverlayIconClass: `${baseModalClass}__icon`, + settingsModalOverlayCloseIconClass: `${baseModalClass}__closeIcon`, + settingsModalOverlayOpenIconClass: `${baseModalClass}__openIcon`, +}; + +const modalFormIds = { + settingsModalSubmitId: `${baseModalClass}Submit`, + settingsModalFormId: `${baseModalClass}Form`, +}; + +const memoryLevelConfig = { + title: 'memory level', + id: 'settingsModalMemoryLevel', + valuePrefix: 'memory-level', + options: [{ + type: 'radio', + id: 'memory-level-low', + name: 'memoryLevel', + value: 'low', + label: 'low', + }, + { + type: 'radio', + id: 'memory-level-mid', + name: 'memoryLevel', + value: 'mid', + label: 'mid', + }, + { + type: 'radio', + id: 'memory-level-high', + name: 'memoryLevel', + value: 'high', + label: 'high', + }, + { + type: 'radio', + id: 'memory-level-unknown', + name: 'memoryLevel', + value: 'unknown', + label: 'unknown', + }], +}; + +const cpuLevelConfig = { + title: 'CPU level', + id: 'settingsModalCpuLevel', + valuePrefix: 'cpu-level', + options: [{ + type: 'radio', + id: 'cpu-level-low', + name: 'cpuLevel', + value: 'low', + label: 'low', + }, + { + type: 'radio', + id: 'cpu-level-mid', + name: 'cpuLevel', + value: 'mid', + label: 'mid', + }, + { + type: 'radio', + id: 'cpu-level-high', + name: 'cpuLevel', + value: 'high', + label: 'high', + }, + { + type: 'radio', + id: 'cpu-level-unknown', + name: 'cpuLevel', + value: 'unknown', + label: 'unknown', + }], +}; + +const connectionSpeedConfig = { + title: 'Connection speed', + id: 'settingsModalConnectionSpeed', + valuePrefix: 'connection-speed', + options: [{ + type: 'radio', + id: 'connection-speed-slow', + name: 'connectionSpeed', + value: 'slow', + label: 'slow', + }, + { + type: 'radio', + id: 'connection-speed-fast', + name: 'connectionSpeed', + value: 'fast', + label: 'fast', + }, + { + type: 'radio', + id: 'connection-speed-unknown', + name: 'connectionSpeed', + value: 'unknown', + label: 'unknown', + }], +}; + +const saveDataConfig = { + title: 'Save data', + id: 'saveData', + name: 'saveData', + value: 'true', + checkedValue: 'true', + uncheckedValue: 'false', +}; + +const reducedMotionConfig = { + title: 'Reduced motion', + id: 'reducedMotion', + name: 'reducedMotion', + value: 'true', + checkedValue: 'true', + uncheckedValue: 'false', +}; + +const trackingConfig = { + title: 'Do not track', + id: 'doNotTrack', + name: 'doNotTrack', + value: 'true', + checkedValue: 'true', + uncheckedValue: 'false', +}; + +const selects = { + memoryLevel: memoryLevelConfig, + cpuLevel: cpuLevelConfig, + connectionSpeed: connectionSpeedConfig, +}; + +const toggles = { + saveData: saveDataConfig, + reducedMotion: reducedMotionConfig, + doNotTrack: trackingConfig, +}; + +const viewSwitchConfig = { + title: 'Banner view', + id: 'view', + name: 'view', + value: 'disabled', + checkedValue: 'enabled', + uncheckedValue: 'disabled', +}; + +export { + memoryLevelConfig, + cpuLevelConfig, + connectionSpeedConfig, + saveDataConfig, + reducedMotionConfig, + trackingConfig, + selects, + toggles, + viewSwitchConfig, + baseModalClass, + modalClasses, + modalFormIds, +}; diff --git a/src/frontend/js/debugUtils/settingsModal.js b/src/frontend/js/debugUtils/settingsModal.js new file mode 100644 index 0000000..2ce717b --- /dev/null +++ b/src/frontend/js/debugUtils/settingsModal.js @@ -0,0 +1,173 @@ +/** + * Copyright (c) 2021 Netcentric, a Cognizant Digital Business + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import { + memoryLevelConfig, + cpuLevelConfig, + connectionSpeedConfig, + saveDataConfig, + reducedMotionConfig, + trackingConfig, + viewSwitchConfig, + modalClasses, + modalFormIds, +} from './settingsModal.config'; +import settingsIcon from './icons/settingsIcon'; +import closeIcon from './icons/closeIcon'; + +function buildModalBaseOpen(devSettings) { + const { + mode, + posTop, + posLeft, + isDraggable, + } = devSettings; + const style = `top: ${posTop}px; left: ${posLeft}px;` + let modeClass = mode === 'closed' ? `${modalClasses.settingsModalBaseClass}--closed` : `${modalClasses.settingsModalBaseClass}--open`; + if (mode === 'banner') { + modeClass += ` ${modalClasses.settingsModalBaseClass}--banner`; + } + + return `
    `; +} + +function buildModalHeader() { + return `
    +

    Settings

    + + ${closeIcon} + + + ${settingsIcon} + +
    `; +} + +function buildModalBaseEnd() { + return '
    '; +} + +function buildFormStart() { + return `
    `; +} + +function buildSubmitButton() { + return ``; +} + +function buildViewSwitch(config, devSettings) { + return `
    +

    ${config.title}

    + +
    `; +} + +function buildFormEnd() { + return '
    '; +} + +function buildOptions(options) { + let allOptions = ''; + + options.forEach((option) => { + allOptions += `
  • + + +
  • `; + }); + + return allOptions; +} + +function buildController(config) { + const options = buildOptions(config.options); + + return `
    +

    ${config.title}

    +

    +
      + ${options} +
    +
    `; +} + +function buildToggleController(config) { + return `
    +

    ${config.title}

    +

    ${config.value}

    + +
    `; +} + +const buildModal = (devSettings) => { + const modalBaseStart = buildModalBaseOpen(devSettings); + const modalBaseEnd = buildModalBaseEnd(); + const modalHeader = buildModalHeader(); + const formStart = buildFormStart(); + const submitButton = buildSubmitButton(); + const formEnd = buildFormEnd(); + + const memoryLevelController = buildController(memoryLevelConfig); + const cpuLevelController = buildController(cpuLevelConfig); + const connectionSpeedController = buildController(connectionSpeedConfig); + const saveDataController = buildToggleController(saveDataConfig); + const reducedMotionController = buildToggleController(reducedMotionConfig); + const trackingController = buildToggleController(trackingConfig); + const viewController = buildViewSwitch(viewSwitchConfig, devSettings); + + return `${modalBaseStart} + ${modalHeader} + ${formStart} + ${memoryLevelController} + ${cpuLevelController} + ${connectionSpeedController} + ${saveDataController} + ${reducedMotionController} + ${trackingController} + ${submitButton} + ${formEnd} + ${viewController} + ${modalBaseEnd}`; +}; + +export default buildModal; diff --git a/src/frontend/js/debugUtils/settingsModalControls.js b/src/frontend/js/debugUtils/settingsModalControls.js new file mode 100644 index 0000000..6cb800b --- /dev/null +++ b/src/frontend/js/debugUtils/settingsModalControls.js @@ -0,0 +1,227 @@ +/** + * Copyright (c) 2021 Netcentric, a Cognizant Digital Business + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import { + selects, + toggles, + modalClasses, + modalFormIds, +} from './settingsModal.config'; +import { onDragStart, onDragEnd, onDragOver } from './settingsModalDrag'; +import { writeValuesToStorage } from '../utils/utils'; + +function configureRadioButtonSettings(inputSelector, currentValue) { + const settingsModalForm = document.querySelector(`.${modalClasses.settingsModalFormClass}`); + const settingsModalInputs = [...settingsModalForm.querySelectorAll(inputSelector)]; + + const currentValueNode = settingsModalInputs.find((input) => input.id === currentValue); + if (!currentValueNode) { return; } + currentValueNode.setAttribute('checked', ''); + const { value } = currentValueNode; + const valueField = currentValueNode.closest(`.${modalClasses.settingsModalControllerClass}`).querySelector(`.${modalClasses.settingsModalParameterValueClass}`); + if (!valueField) { return; } + valueField.innerHTML = value; +} + +function configureToggleSwitch(inputId, dataKey, sessionStorageKey) { + try { + const currentValues = JSON.parse(sessionStorage.getItem(sessionStorageKey)); + const settingsModalForm = document.querySelector(`.${modalClasses.settingsModalFormClass}`); + const settingsModalInput = settingsModalForm.querySelector(`#${inputId}`); + + const currentToggleValue = currentValues[dataKey]; + if (currentToggleValue === 'false') { return; } + settingsModalInput.setAttribute('checked', 'checked'); + } catch (e) { + console.log('Unable to parse modal settings', e); + } +} + +function configureSettingsModal(sessionStorageKey) { + try { + const currentValues = JSON.parse(sessionStorage.getItem(sessionStorageKey)); + + Object.keys(selects).forEach((setting) => { + const settingData = selects[setting]; + configureRadioButtonSettings(`#${settingData.id} input`, `${settingData.valuePrefix}-${currentValues[setting]}`); + }); + Object.keys(toggles).forEach((setting) => { + const toggleId = toggles[setting].id; + configureToggleSwitch(toggleId, setting, sessionStorageKey); + }); + } catch (e) { + console.log('Unable to parse modal settings', e); + } +} + +function displaySettings(modalBase, devSettings, sessionStorageDevKey) { + modalBase.classList.remove(`${modalClasses.settingsModalBaseClosedClass}`); + modalBase.classList.add(`${modalClasses.settingsModalBaseOpenClass}`); + + const newSettings = { ...devSettings }; + newSettings.mode = 'open'; + writeValuesToStorage(newSettings, sessionStorageDevKey); +} + +function closeSettings(modalBase, devSettings, sessionStorageDevKey) { + modalBase.classList.remove(`${modalClasses.settingsModalBaseOpenClass}`); + modalBase.classList.add(`${modalClasses.settingsModalBaseClosedClass}`); + + const newSettings = { ...devSettings }; + newSettings.mode = 'closed'; + writeValuesToStorage(newSettings, sessionStorageDevKey); +} + +function toggleInput(inputElement) { + const isChecked = inputElement.getAttribute('checked') === 'checked'; + + if (isChecked) { + inputElement.removeAttribute('checked', 'false'); + } else { + inputElement.setAttribute('checked', 'checked'); + } +} + +function handleSliderClick(event) { + event.stopPropagation(); + event.preventDefault(); + + const element = event.target.parentElement; + const inputElement = element.querySelector('input'); + + toggleInput(inputElement); +} + +function collectFormValues() { + return new FormData(document.getElementById(modalFormIds.settingsModalFormId)); +} + +function findNonSettingsQueryStringValues(settingsKeys) { + const queryString = window.location.search; + if (!queryString) { return; } + + const queryStringValues = queryString.replace('?', '').split('&'); + const queryStringKeyValues = queryStringValues.map((value) => value.split('=')); + const filteredValues = queryStringKeyValues.filter((value) => !settingsKeys.includes(value[0])); + + return filteredValues; +} + +function formatQueryString(queryStringValues) { + const querySubstrings = queryStringValues.map((setting) => `${setting[0]}=${setting[1]}`); + const queryString = querySubstrings.join('&'); + + return queryString; +} + +function buildQueryString(formValues) { + const entries = [...formValues]; + const settingsKeys = [...Object.keys(selects), ...Object.keys(toggles)]; + const nonSettingQueryStringValues = findNonSettingsQueryStringValues(settingsKeys) || []; + + const newSettingsQueryStringValues = settingsKeys.map((setting) => { + const newValue = entries.find((entry) => entry[0] === setting); + return newValue || [setting, toggles[setting].uncheckedValue]; + }); + + return formatQueryString([...nonSettingQueryStringValues, ...newSettingsQueryStringValues]); +} + +function reloadPage(queryString) { + const url = window.location.href.split('?')[0]; + const reloadUrl = `${url}?${queryString}`; + + window.location.href = reloadUrl; +} + +function handleSubmit(event) { + event.preventDefault(); + + const formValues = collectFormValues(); + const queryString = buildQueryString(formValues); + + reloadPage(queryString); +} + +function changeView(event, modalBase, devSettings, sessionStorageDevKey) { + event.stopPropagation(); + event.preventDefault(); + + const toggleElement = event.target.parentElement; + const inputElement = toggleElement.querySelector('input'); + + const isChecked = inputElement.getAttribute('checked') === 'checked'; + if (isChecked) { + modalBase.classList.add(`${modalClasses.settingsModalBannerClass}`); + + const newSettings = { ...devSettings }; + newSettings.mode = 'banner'; + writeValuesToStorage(newSettings, sessionStorageDevKey); + return; + } + modalBase.classList.remove(`${modalClasses.settingsModalBannerClass}`); + const newSettings = { ...devSettings }; + newSettings.mode = 'open'; + writeValuesToStorage(newSettings, sessionStorageDevKey); +} + +function addFormEventListeners() { + const toggleControls = document.querySelectorAll(`.${modalClasses.settingsModalToggleClass}`); + const settingsModalSubmit = document.getElementById(modalFormIds.settingsModalSubmitId); + + toggleControls.forEach((control) => { + control.addEventListener('click', handleSliderClick); + }); + + settingsModalSubmit.addEventListener('click', handleSubmit); +} + +function addModeSwitchEvents(modalBase, devSettings, sessionStorageDevKey) { + const settingsOpenIcon = modalBase.querySelector(`.${modalClasses.settingsModalOverlayOpenIconClass}`); + const settingsCloseIcon = modalBase.querySelector(`.${modalClasses.settingsModalOverlayCloseIconClass}`); + const viewSwitch = modalBase.querySelector(`.${modalClasses.settingsModalControllerViewClass} .${modalClasses.settingsModalToggleClass}`); + + settingsOpenIcon.addEventListener('click', () => displaySettings(modalBase, devSettings, sessionStorageDevKey)); + settingsCloseIcon.addEventListener('click', () => closeSettings(modalBase, devSettings, sessionStorageDevKey)); + viewSwitch.addEventListener('click', (e) => changeView(e, modalBase, devSettings, sessionStorageDevKey)); +} + +function addModalDragEvents(modalBase, devSettings, sessionStorageDevKey) { + modalBase.addEventListener('dragstart', onDragStart, false); + document.body.addEventListener('dragover', onDragOver, false); + document.body.addEventListener('drop', (e) => onDragEnd(e, devSettings, sessionStorageDevKey), false); +} + +export const initModalControls = (config) => { + const { defaultDevSettings, sessionStorageKey, sessionStorageDevKey } = config; + + configureSettingsModal(sessionStorageKey); + addFormEventListeners(); + + const modalBase = document.querySelector(`.${modalClasses.settingsModalBaseClass}`); + + addModeSwitchEvents(modalBase, defaultDevSettings, sessionStorageDevKey); + if (defaultDevSettings.isDraggable) { + addModalDragEvents(modalBase, defaultDevSettings, sessionStorageDevKey); + } +}; + +export default initModalControls; diff --git a/src/frontend/js/debugUtils/settingsModalDrag.js b/src/frontend/js/debugUtils/settingsModalDrag.js new file mode 100644 index 0000000..c9ab95c --- /dev/null +++ b/src/frontend/js/debugUtils/settingsModalDrag.js @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2021 Netcentric, a Cognizant Digital Business + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import { writeValuesToStorage } from '../utils/utils'; + +let cursorOffsetX; +let cursorOffsetY; + +function onDragStart(e) { + cursorOffsetX = e.offsetX; + cursorOffsetY = e.offsetY; + e.dataTransfer.setData('text/plain', e.target.id); +} + +function onDragOver(e) { + e.preventDefault(); +} + +function setCoordinates(el, xPos, yPos) { + el.style.top = `${yPos}px`; + el.style.left = `${xPos}px`; +} + +function onDragEnd(e, devSettings, storageKey) { + e.preventDefault(); + e.stopPropagation(); + + const id = e.dataTransfer.getData('text'); + const draggableElement = document.getElementById(id); + const newX = e.pageX - cursorOffsetX; + const newY = e.pageY - cursorOffsetY; + + setCoordinates(draggableElement, newX, newY); + + const newSettings = { ...devSettings }; + newSettings.posTop = newY; + newSettings.posLeft = newX; + writeValuesToStorage(newSettings, storageKey); + + e.dataTransfer.clearData(); +} + +export { + onDragStart, + onDragEnd, + onDragOver, +}; diff --git a/src/frontend/js/index-dev.js b/src/frontend/js/index-dev.js new file mode 100644 index 0000000..facdde3 --- /dev/null +++ b/src/frontend/js/index-dev.js @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2021 Netcentric, a Cognizant Digital Business + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +// Dev modal stylesheet import for rollup +import '../css/dev-styles'; + +import { + findQueryStringParameters, + hasStorageValues, updateSettings, + runNonPersistentChecks, + runAllChecks, + findStorageValues, +} from './utils/utils'; +import buildModal from './debugUtils/settingsModal'; +import { initModalControls } from './debugUtils/settingsModalControls'; +import { devConfig } from './config'; + +const progUXdev = (params) => { + const config = { ...devConfig, ...params }; + const { sessionStorageKey, sessionStorageDevKey, defaultDevSettings } = config; + const userOverrides = findQueryStringParameters(); + const currentSettings = findStorageValues(sessionStorageKey); + const devSettings = findStorageValues(sessionStorageDevKey); + const valuesToUpdate = hasStorageValues(sessionStorageKey) + ? runNonPersistentChecks(config.settings) : runAllChecks(config.settings); + const state = Object.assign(currentSettings, valuesToUpdate, userOverrides); + + updateSettings(state, sessionStorageKey); + + window.addEventListener('load', () => { + const settings = Object.keys(devSettings).length ? devSettings : defaultDevSettings; + document.body.insertAdjacentHTML('afterbegin', buildModal(settings)); + + initModalControls(config); + }); +}; + +export default progUXdev; +window.progUXdev = progUXdev; diff --git a/src/frontend/js/index-prod.js b/src/frontend/js/index-prod.js new file mode 100644 index 0000000..3c50fa2 --- /dev/null +++ b/src/frontend/js/index-prod.js @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2021 Netcentric, a Cognizant Digital Business + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import { + hasStorageValues, + updateSettings, + runNonPersistentChecks, + runAllChecks, + findStorageValues, +} from './utils/utils'; +import { defaultConfig } from './config'; + +const progUX = (params) => { + const config = { ...defaultConfig, ...params }; + const { sessionStorageKey } = config; + const currentSettings = findStorageValues(sessionStorageKey); + const valuesToUpdate = hasStorageValues(sessionStorageKey) + ? runNonPersistentChecks(config.settings) : runAllChecks(config.settings); + const state = Object.assign(currentSettings, valuesToUpdate); + + updateSettings(state, sessionStorageKey); +}; + +export default progUX; +window.progUX = progUX; diff --git a/src/frontend/js/utils/evaluateConnectionSpeed.js b/src/frontend/js/utils/evaluateConnectionSpeed.js new file mode 100644 index 0000000..c8c2cd8 --- /dev/null +++ b/src/frontend/js/utils/evaluateConnectionSpeed.js @@ -0,0 +1,17 @@ +/** + * Identifies the effective type of a connection. + * + * A String containing one of 'slow-2g', '2g', '3g', or '4g'. + * + * @returns {String} containing the speed, slow, fast or unknown + */ + +const findConnectionSpeed = (slowConnectionTypes) => { + if (!('connection' in navigator)) { + return 'unknown'; + } + + return slowConnectionTypes.indexOf(navigator.connection.effectiveType) >= 0 ? 'slow' : 'fast'; +}; + +export default findConnectionSpeed; diff --git a/src/frontend/js/utils/evaluateCpu.js b/src/frontend/js/utils/evaluateCpu.js new file mode 100644 index 0000000..8d7c709 --- /dev/null +++ b/src/frontend/js/utils/evaluateCpu.js @@ -0,0 +1,29 @@ +/** + * ---navigator.hardwareConcurrency---- + * Identifies the logical processors of a device. + * + * A Number indicating the number of logical processors. + * logical processors = N. of CPU cores * N. of threads per core + * + * @returns {String} containing the cpu level, low, mid, high or unknown + */ + +const findCpuLevel = (lowCPU) => { + if (!('hardwareConcurrency' in navigator)) { + return 'unknown'; + } + + const logicalProcessors = navigator.hardwareConcurrency; + + if (logicalProcessors === lowCPU) { + return 'mid'; + } + + if (logicalProcessors > lowCPU) { + return 'high'; + } + + return 'low'; +}; + +export default findCpuLevel; diff --git a/src/frontend/js/utils/evaluateDataSaving.js b/src/frontend/js/utils/evaluateDataSaving.js new file mode 100644 index 0000000..689b939 --- /dev/null +++ b/src/frontend/js/utils/evaluateDataSaving.js @@ -0,0 +1,14 @@ +/** + * Identifies the save-data preference from a client. + * + * A boolean true or false + * + * @returns {boolean} + */ + +const evaluateDataSaving = () => { + const hasAttribute = 'connection' in navigator; + return hasAttribute ? navigator.connection.saveData : false; +}; + +export default evaluateDataSaving; diff --git a/src/frontend/js/utils/evaluateMemory.js b/src/frontend/js/utils/evaluateMemory.js new file mode 100644 index 0000000..e6b4ae2 --- /dev/null +++ b/src/frontend/js/utils/evaluateMemory.js @@ -0,0 +1,28 @@ +/** + * ---navigator.deviceMemory---- + * Identifies the RAM memory of a device. + * + * A floating point number, one of 0.25, 0.5, 1, 2, 4, 8. + * + * @returns {String} containing the memory level, low, mid, high or unknown + */ + +const findMemoryLevel = (lowRAM) => { + if (!('deviceMemory' in navigator)) { + return 'unknown'; + } + + const memory = navigator.deviceMemory; + + if (memory === lowRAM) { + return 'mid'; + } + + if (memory > lowRAM) { + return 'high'; + } + + return 'low'; +}; + +export default findMemoryLevel; diff --git a/src/frontend/js/utils/evaluateReducedMotion.js b/src/frontend/js/utils/evaluateReducedMotion.js new file mode 100644 index 0000000..d6b78ae --- /dev/null +++ b/src/frontend/js/utils/evaluateReducedMotion.js @@ -0,0 +1,8 @@ +/** + * Identifies if user selected prefers-reduced-motion option + * + * @returns {boolean} + */ +const evaluateReducedMotion = () => window.matchMedia('(prefers-reduced-motion: reduce)').matches; + +export default evaluateReducedMotion; diff --git a/src/frontend/js/utils/evaluateTracking.js b/src/frontend/js/utils/evaluateTracking.js new file mode 100644 index 0000000..98c0461 --- /dev/null +++ b/src/frontend/js/utils/evaluateTracking.js @@ -0,0 +1,16 @@ +/** + * Identifies the tracking preferences of a user. + * + * navigator.doNotTrack === 1 indicates the user should not be tracked + * + * @returns {Boolean} + */ + +const evaluateTracking = () => { + const hasAttribute = 'doNotTrack' in navigator; + const doNotTrackActive = navigator.doNotTrack === '1'; + + return hasAttribute && doNotTrackActive; +}; + +export default evaluateTracking; diff --git a/src/frontend/js/utils/utils.js b/src/frontend/js/utils/utils.js new file mode 100644 index 0000000..9012dd4 --- /dev/null +++ b/src/frontend/js/utils/utils.js @@ -0,0 +1,104 @@ +/** + * Copyright (c) 2021 Netcentric, a Cognizant Digital Business + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import findMemoryLevel from './evaluateMemory'; +import findCpuLevel from './evaluateCpu'; +import findConnectionSpeed from './evaluateConnectionSpeed'; +import evaluateDataSaving from './evaluateDataSaving'; +import evaluateTracking from './evaluateTracking'; +import evaluateReducedMotion from './evaluateReducedMotion'; + +export const findQueryStringParameters = () => { + const urlParams = new URLSearchParams(window.location.search); + const entries = urlParams.entries(); + const returnObj = {}; + + [...entries].forEach((pair) => { + const [attribute, value] = pair; + returnObj[attribute] = value; + }); + + return returnObj; +}; + +export const hasStorageValues = (storageKey) => sessionStorage.getItem(storageKey) !== null; + +export const findStorageValues = (storageKey) => { + try { + return hasStorageValues(storageKey) ? JSON.parse(sessionStorage.getItem(storageKey)) : {}; + } catch (e) { + console.log(e); + return false; + } +}; + +export const writeValuesToStorage = (dataObject, storageKey) => { + try { + sessionStorage.setItem(storageKey, JSON.stringify(dataObject)); + } catch (e) { + console.log(e); + } +}; + +function addClassesToHtml(storageKey) { + const storageValues = findStorageValues(storageKey); + const html = document.getElementsByTagName('html')[0]; + + Object.entries(storageValues).forEach((pair) => { + const [key, value] = pair; + const className = `${key}-${value}`; + + html.classList.add(className); + }); +} + +export const updateSettings = (dataObject, storageKey) => { + writeValuesToStorage(dataObject, storageKey); + addClassesToHtml(storageKey); +}; + +export const runAllChecks = (settings) => { + const { lowRAM, lowCPU, slowConnectionTypes } = settings; + const memoryLevel = findMemoryLevel(lowRAM); + const cpuLevel = findCpuLevel(lowCPU); + const connectionSpeed = findConnectionSpeed(slowConnectionTypes); + const saveData = evaluateDataSaving(); + const reducedMotion = evaluateReducedMotion(); + const doNotTrack = evaluateTracking(); + + return { + memoryLevel, + cpuLevel, + connectionSpeed, + saveData, + reducedMotion, + doNotTrack, + }; +}; + +export const runNonPersistentChecks = (settings) => { + const { slowConnectionTypes } = settings; + const connectionSpeed = findConnectionSpeed(slowConnectionTypes); + + return { + connectionSpeed, + }; +};