From 5001bbd798cedc0c769e2d452e8545a1b836fc4c Mon Sep 17 00:00:00 2001 From: Martin Donnelly Date: Tue, 19 May 2020 10:05:04 +0100 Subject: [PATCH] init --- .eslintrc.json | 55 + .gitignore | 148 + db/jobs.db | Bin 0 -> 220160 bytes db/menu.db | 0 dist/build/bundle.css | 6 + dist/build/bundle.css.map | 18 + dist/build/bundle.js | 1 + dist/build/bundle.js.map | 1 + dist/favicon.png | Bin 0 -> 25805 bytes dist/global.css | 0 dist/index.html | 18 + grabber.js | 27 + lib/connect.js | 6 + lib/dbmanager.js | 66 + lib/filter_3_days.js | 18 + lib/filter_for_local_jobs.js | 14 + lib/filter_glasgow.js | 7 + lib/filter_last_week.js | 18 + lib/filter_location.js | 8 + lib/filter_md_jobs.js | 16 + lib/filter_out_all_articles.js | 8 + lib/filter_reject.js | 18 + lib/filter_show.js | 6 + lib/filter_today_only.js | 20 + lib/scraper.js | 165 + package-lock.json | 2763 +++++++++++++ package.json | 31 + scrapers/indeed.js | 150 + scrapers/indeed.orig.js | 184 + scrapers/jobserve.js | 87 + scrapers/totaljobs.js | 138 + server/controllers/jobs.controller.js | 62 + server/routes/jobs.route.js | 17 + server/server.js | 49 + .../indeed/indeed-2020-04-16--013308.html | 1931 +++++++++ .../indeed/indeed-2020-04-16--092311.html | 1984 +++++++++ .../indeed/indeed-2020-04-16--105727.html | 1782 ++++++++ .../indeed/indeed-2020-04-16--105848.html | 1778 ++++++++ test/data/indeed/page.html | 1779 ++++++++ test/data/indeed/page2.html | 2438 +++++++++++ .../totaljobs-2020-04-16--121504.html | 3565 +++++++++++++++++ test/indeed.js | 41 + test/totaljobs.js | 41 + 43 files changed, 19464 insertions(+) create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 db/jobs.db create mode 100644 db/menu.db create mode 100644 dist/build/bundle.css create mode 100644 dist/build/bundle.css.map create mode 100644 dist/build/bundle.js create mode 100644 dist/build/bundle.js.map create mode 100644 dist/favicon.png create mode 100644 dist/global.css create mode 100644 dist/index.html create mode 100644 grabber.js create mode 100644 lib/connect.js create mode 100644 lib/dbmanager.js create mode 100644 lib/filter_3_days.js create mode 100644 lib/filter_for_local_jobs.js create mode 100644 lib/filter_glasgow.js create mode 100644 lib/filter_last_week.js create mode 100644 lib/filter_location.js create mode 100644 lib/filter_md_jobs.js create mode 100644 lib/filter_out_all_articles.js create mode 100644 lib/filter_reject.js create mode 100644 lib/filter_show.js create mode 100644 lib/filter_today_only.js create mode 100644 lib/scraper.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 scrapers/indeed.js create mode 100644 scrapers/indeed.orig.js create mode 100644 scrapers/jobserve.js create mode 100644 scrapers/totaljobs.js create mode 100644 server/controllers/jobs.controller.js create mode 100644 server/routes/jobs.route.js create mode 100644 server/server.js create mode 100644 test/data/indeed/indeed-2020-04-16--013308.html create mode 100644 test/data/indeed/indeed-2020-04-16--092311.html create mode 100644 test/data/indeed/indeed-2020-04-16--105727.html create mode 100644 test/data/indeed/indeed-2020-04-16--105848.html create mode 100644 test/data/indeed/page.html create mode 100644 test/data/indeed/page2.html create mode 100644 test/data/totaljobs/totaljobs-2020-04-16--121504.html create mode 100644 test/indeed.js create mode 100644 test/totaljobs.js diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..a242ad8 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,55 @@ +{ + "parserOptions": { + "ecmaVersion": 2017, + "sourceType": "module", + "ecmaFeatures": { + "jsx": false + } + }, + "env": { + "browser": true, + "node": true, + "es6": true + }, + "rules": { + "arrow-spacing": "error", + "block-scoped-var": "error", + "block-spacing": "error", + "brace-style": ["error", "stroustrup", {}], + "camelcase": "error", + "comma-dangle": ["error", "never"], + "comma-spacing": ["error", { "before": false, "after": true }], + "comma-style": [1, "last"], + "consistent-this": [1, "_this"], + "curly": [1, "multi"], + "eol-last": 1, + "eqeqeq": 1, + "func-names": 1, + "indent": ["error", 2, { "SwitchCase": 1 }], + "lines-around-comment": ["error", { "beforeBlockComment": true, "allowArrayStart": true }], + "max-len": [1, 180, 2], // 2 spaces per tab, max 80 chars per line + "new-cap": 1, + "newline-before-return": "error", + "no-array-constructor": 1, + "no-inner-declarations": [1, "both"], + "no-mixed-spaces-and-tabs": 1, + "no-multi-spaces": 2, + "no-new-object": 1, + "no-shadow-restricted-names": 1, + "object-curly-spacing": ["error", "always"], + "padded-blocks": ["error", { "blocks": "never", "switches": "always" }], + "prefer-const": "error", + "prefer-template": "error", + "one-var": 0, + "quote-props": ["error", "always"], + "quotes": [1, "single"], + "radix": 1, + "semi": [1, "always"], + "space-before-blocks": [1, "always"], + "space-infix-ops": 1, + "vars-on-top": 1, + "no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 1 }], + "spaced-comment": ["error", "always", { "markers": ["/"] }] + } + +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c8f8389 --- /dev/null +++ b/.gitignore @@ -0,0 +1,148 @@ +# Created by .ignore support plugin (hsz.mobi) +### Node template +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +### macOS template +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +.idea/ +# User-specific stuff: +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/dictionaries + +# Sensitive or high-churn files: +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.xml +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml + +# Gradle: +.idea/**/gradle.xml +.idea/**/libraries + +# CMake +cmake-build-debug/ + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Elastic Beanstalk Files +.elasticbeanstalk/* +!.elasticbeanstalk/*.cfg.yml +!.elasticbeanstalk/*.global.yml +/src/bundle.js +/src/bundle.js.map +/live/ +!/output/ diff --git a/db/jobs.db b/db/jobs.db new file mode 100644 index 0000000000000000000000000000000000000000..bb2b34e860d62c29c320a927b393bbd2fe7be019 GIT binary patch literal 220160 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 .label-body{display:inline-block;margin-left:.5rem;font-weight:normal;background-color:#dcc894}table th,table td{padding:1rem;text-align:left}table th{background:var(--light-color)}.navbar{position:fixed;display:flex;justify-content:space-between;align-items:center;padding:0.7rem 0rem;z-index:2;width:100%;opacity:0.9;margin-bottom:1rem;min-height:var(--navbar-height)}.navbar ul{display:flex}.navbar a{color:#fff;padding:0.45rem;margin:0 0.25rem}.navbar a:hover{color:var(--light-color)}.navbar .welcome span{margin-right:0.6rem}.navbar .navbar-section{align-items:center;display:flex;display:-ms-flexbox;flex:1 0 0;-ms-flex-align:center}.navbar .navbar-section:not(:first-child):last-child{justify-content:flex-end}.navbar .navbar-brand{font-size:125%;font-weight:bold}@media(max-width: 700px){.hide-sm{display:none}.grid-2,.grid-3,.grid-4{grid-template-columns:1fr}.x-large{font-size:3rem}.large{font-size:2rem}.lead{font-size:1rem}.navbar{display:flex;text-align:center}.navbar ul{text-align:center;justify-content:center}}.table-responsive{display:block;overflow-x:auto;width:100%}.cardV2{border-radius:4px;background-color:#fff;box-shadow:0 0 4px 0 rgba(0, 0, 0, 0.14), 0 3px 4px 0 rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2);min-width:0}table{max-width:100%;width:100%;border:0;margin-bottom:1rem;border-collapse:collapse}tr{border-top:1px solid #ccc}tbody tr:nth-of-type(odd){background-color:rgba(0, 0, 0, 0.04)}tbody td{border-top:1px solid #e1e1e1}hr{margin-top:2.2rem;margin-bottom:2rem;border-width:0;border-top:1px solid var(--dark-color)}.modalWindow{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(0, 0, 0, 0.2);z-index:99999;opacity:0;pointer-events:none;text-align:center}.modalWindow:target{opacity:1;pointer-events:auto}.modalWindow > div{width:500px;position:relative;margin:10% auto;background:#fff}header + div.container{position:relative;top:var(--navbar-height);min-height:calc(100vh - var(--navbar-height))}.mui-dropdown{display:inline-block;position:relative}[data-mui-toggle="dropdown"]{outline:0}.mui-dropdown__menu{position:absolute;display:none;min-width:160px;padding:5px 3px;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#FFF;border-radius:2px;z-index:1;background-clip:padding-box;border:1px solid var(--light-color);box-shadow:0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12)}@media all and (-ms-high-contrast: none), (-ms-high-contrast: active){.mui-dropdown__menu{border-top:1px solid rgba(0, 0, 0, 0.12);border-left:1px solid rgba(0, 0, 0, 0.12)}}@supports (-ms-ime-align: auto){.mui-dropdown__menu{border-top:1px solid rgba(0, 0, 0, 0.12);border-left:1px solid rgba(0, 0, 0, 0.12)}}.mui-dropdown__menu.mui--is-open{display:block}.mui-dropdown__menu > li > a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.429;color:rgba(0, 0, 0, 0.87);text-decoration:none;white-space:nowrap}.mui-dropdown__menu > li > a:hover,.mui-dropdown__menu > li > a:focus{text-decoration:none;color:rgba(0, 0, 0, 0.87);background-color:#EEEEEE}.mui-dropdown__menu > .mui--is-disabled > a,.mui-dropdown__menu > .mui--is-disabled > a:hover,.mui-dropdown__menu > .mui--is-disabled > a:focus{color:#EEEEEE}.mui-dropdown__menu > .mui--is-disabled > a:hover,.mui-dropdown__menu > .mui--is-disabled > a:focus{text-decoration:none;background-color:transparent;background-image:none;cursor:not-allowed}.mui-dropdown__menu--right{left:auto;right:0}.mui-dropdown--up > .mui-dropdown__menu{margin:0 0 2px}.mui-dropdown--right > .mui-dropdown__menu{margin:0 0 0 2px}.mui-dropdown--left > .mui-dropdown__menu{margin:0 2px 0 0}.alias{cursor:alias}.all-scroll{cursor:all-scroll}.auto{cursor:auto}.cell{cursor:cell}.context-menu{cursor:context-menu}.col-resize{cursor:col-resize}.copy{cursor:copy}.crosshair{cursor:crosshair}.default{cursor:default}.e-resize{cursor:e-resize}.ew-resize{cursor:ew-resize}.grab{cursor:-webkit-grab;cursor:grab}.grabbing{cursor:-webkit-grabbing;cursor:grabbing}.help{cursor:help}.move{cursor:move}.n-resize{cursor:n-resize}.ne-resize{cursor:ne-resize}.nesw-resize{cursor:nesw-resize}.ns-resize{cursor:ns-resize}.nw-resize{cursor:nw-resize}.nwse-resize{cursor:nwse-resize}.no-drop{cursor:no-drop}.none{cursor:none}.not-allowed{cursor:not-allowed}.pointer{cursor:pointer}.progress{cursor:progress}.row-resize{cursor:row-resize}.s-resize{cursor:s-resize}.se-resize{cursor:se-resize}.sw-resize{cursor:sw-resize}.text{cursor:text}.url{cursor:url(myBall.cur), auto}.w-resize{cursor:w-resize}.wait{cursor:wait}.zoom-in{cursor:zoom-in}.zoom-out{cursor:zoom-out}.view{height:100vh} +.detail.svelte-1rxym9d{width:100%;border-top:2px solid #e1e1e1;height:50vh;max-height:50vh;overflow-y:scroll}.detailHead.svelte-1rxym9d{box-sizing:border-box;margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row.svelte-1rxym9d{margin:1% 0;overflow:auto;display:flex} +.lister.svelte-rqr115{height:50vh;max-height:50vh;overflow-y:scroll} +menu.svelte-ssrzvc{border-right:2px solid #e1e1e1;background-color:#f4f4f4;height:100vh} + +/*# sourceMappingURL=bundle.css.map */ \ No newline at end of file diff --git a/dist/build/bundle.css.map b/dist/build/bundle.css.map new file mode 100644 index 0000000..e2ebbc1 --- /dev/null +++ b/dist/build/bundle.css.map @@ -0,0 +1,18 @@ +{ + "version": 3, + "file": "bundle.css", + "sources": [ + "../../App.svelte", + "../../Detail.svelte", + "../../Lister.svelte", + "../../Menu.svelte" + ], + "sourcesContent": [ + "\n\n\n\n\n
\n \n
\n
\n \n
\n
\n \n \n
\n
\n
\n", + "\n\n\n\n\n{#if visible}\n
\n\n{/if}\n", + "\n\n\n\n\n
\n \n \n \n \n \n \n \n \n \n \n {#each $JobList as item, _id}\n \n \n \n \n \n \n {/each}\n \n
\n Title\n \n Site\n \n Company\n \n Date\n
{item.title}{item.site}{item.company}{item.date}
\n
\n\n\n", + "\n\n\n\n\n

Jobs

\n
\n\n \n
\n" + ], + "names": [], + "mappings": "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" +} \ No newline at end of file diff --git a/dist/build/bundle.js b/dist/build/bundle.js new file mode 100644 index 0000000..0d6656b --- /dev/null +++ b/dist/build/bundle.js @@ -0,0 +1 @@ +var app=function(){"use strict";function t(){}function e(t){return t()}function n(){return Object.create(null)}function r(t){t.forEach(e)}function o(t){return"function"==typeof t}function s(t,e){return t!=t?e==e:t!==e||t&&"object"==typeof t||"function"==typeof t}function c(e,n,r){e.$$.on_destroy.push(function(e,...n){if(null==e)return t;const r=e.subscribe(...n);return r.unsubscribe?()=>r.unsubscribe():r}(n,r))}function a(t,e){t.appendChild(e)}function l(t,e,n){t.insertBefore(e,n||null)}function i(t){t.parentNode.removeChild(t)}function u(t){return document.createElement(t)}function f(t){return document.createTextNode(t)}function d(){return f(" ")}function p(t,e,n){null==n?t.removeAttribute(e):t.getAttribute(e)!==n&&t.setAttribute(e,n)}function h(t,e){e=""+e,t.data!==e&&(t.data=e)}let m;function g(t){m=t}const y=[],b=[],$=[],v=[],x=Promise.resolve();let _=!1;function w(t){$.push(t)}let j=!1;const k=new Set;function C(){if(!j){j=!0;do{for(let t=0;t{S.delete(t),r&&(n&&t.d(1),r())}),t.o(e)}}function O(t){t&&t.c()}function A(t,n,s){const{fragment:c,on_mount:a,on_destroy:l,after_update:i}=t.$$;c&&c.m(n,s),w(()=>{const n=a.map(e).filter(o);l?l.push(...n):r(n),t.$$.on_mount=[]}),i.forEach(w)}function T(t,e){const n=t.$$;null!==n.fragment&&(r(n.on_destroy),n.fragment&&n.fragment.d(e),n.on_destroy=n.fragment=null,n.ctx=[])}function q(t,e){-1===t.$$.dirty[0]&&(y.push(t),_||(_=!0,x.then(C)),t.$$.dirty.fill(0)),t.$$.dirty[e/31|0]|=1<{const o=r.length?r[0]:n;return p.ctx&&a(p.ctx[t],p.ctx[t]=o)&&(p.bound[t]&&p.bound[t](o),h&&q(e,t)),n}):[],p.update(),h=!0,r(p.before_update),p.fragment=!!c&&c(p.ctx),o.target){if(o.hydrate){const t=function(t){return Array.from(t.childNodes)}(o.target);p.fragment&&p.fragment.l(t),t.forEach(i)}else p.fragment&&p.fragment.c();o.intro&&L(e.$$.fragment),A(e,o.target,o.anchor),C()}g(f)}class D{$destroy(){T(this,1),this.$destroy=t}$on(t,e){const n=this.$$.callbacks[t]||(this.$$.callbacks[t]=[]);return n.push(e),()=>{const t=n.indexOf(e);-1!==t&&n.splice(t,1)}}$set(){}}function P(e){let n;return{c(){n=u("menu"),n.innerHTML="

Jobs

\n
\n\n ",p(n,"class","svelte-ssrzvc")},m(t,e){l(t,n,e)},p:t,i:t,o:t,d(t){t&&i(n)}}}class R extends D{constructor(t){super(),E(this,t,null,P,s,{})}}const H=[];function z(e,n=t){let r;const o=[];function c(t){if(s(e,t)&&(e=t,r)){const t=!H.length;for(let t=0;t{const t=o.indexOf(l);-1!==t&&o.splice(t,1),0===o.length&&(r(),r=null)}}}}var M=function t(e){function n(t){return function(e,n){return s(e,Object.assign({method:t},n))}}function r(t){return function(e,n,r){return s(e,Object.assign({method:t,data:n},r))}}function o(t,e,n){if(Array.isArray(t))return t.concat(e);if(e&&"object"==typeof e){var r,s={};if(t)for(r in t)s[n?r.toLowerCase():r]=t[r];for(r in e){var c=n?r.toLowerCase():r;"headers"===c&&(n=!0),s[c]=r in s?o(s[c],e[r],n):e[r]}return s}return e}function s(t,n){"string"!=typeof t&&(t=(n=t).url);var r=o(e,n||{}),s=r.data;if(r.transformRequest)for(var c=0;c{const e=JSON.parse(t.data);B.set(e)}).catch(t=>{console.error("getJobList",t)})},loadJobDetail(t){if(console.log("loadJobDetail: "+t),t){const e=`${I.jobs}/${t}`;M.get(e).then(t=>{const e=JSON.parse(t.data);U.set(e)}).catch(t=>{console.error("loadJobDetail",t)})}}};function G(t,e,n){const r=t.slice();return r[2]=e[n],r[4]=n,r}function K(t){let e,n,r,s,c,m,g,y,b,$,v,x,_,w,j=t[2].title+"",k=t[2].site+"",C=t[2].company+"",J=t[2].date+"";return{c(){e=u("tr"),n=u("td"),r=f(j),s=d(),c=u("td"),m=f(k),g=d(),y=u("td"),b=f(C),$=d(),v=u("td"),x=f(J),_=d(),p(e,"class","dataRow")},m(i,u,f){var d,p,h,j;l(i,e,u),a(e,n),a(n,r),a(e,s),a(e,c),a(c,m),a(e,g),a(e,y),a(y,b),a(e,$),a(e,v),a(v,x),a(e,_),f&&w(),p="click",h=function(){o(t[1](t[2]._id))&&t[1](t[2]._id).apply(this,arguments)},(d=e).addEventListener(p,h,j),w=()=>d.removeEventListener(p,h,j)},p(e,n){t=e,1&n&&j!==(j=t[2].title+"")&&h(r,j),1&n&&k!==(k=t[2].site+"")&&h(m,k),1&n&&C!==(C=t[2].company+"")&&h(b,C),1&n&&J!==(J=t[2].date+"")&&h(x,J)},d(t){t&&i(e),w()}}}function Q(e){let n,r,o,s,c,f=e[0],h=[];for(let t=0;t\n Title\n \n \n Site\n \n \n Company\n \n \n Date\n ',s=d(),c=u("tbody");for(let t=0;tn(0,r=t));return[r,t=>{F.loadJobDetail(t)}]}class W extends D{constructor(t){super(),E(this,t,V,Q,s,{})}}function X(t){let e,n,r,o,s,c,m,g,y,b,$,v,x,_,w,j,k,C,J,S,L,N,O,A,T,q,E,D,P,R,H,z,M,I,B,U,F=t[1].title+"",G=t[1].company+"",K=t[1].location+"",Q=t[1].salary+"",V=t[1].date+"",W=t[1].site+"",X=t[1].summary+"";return{c(){e=u("div"),n=u("div"),r=u("div"),o=u("div"),s=f(F),c=d(),m=u("div"),g=u("div"),y=f("Company: "),b=u("span"),$=f(G),v=d(),x=u("div"),_=f("Location: "),w=u("span"),j=f(K),k=d(),C=u("div"),J=u("div"),S=f("Salary: "),L=u("span"),N=f(Q),O=d(),A=u("div"),T=f("Scraped: "),q=u("span"),E=f(V),D=d(),P=u("div"),R=f("Site: "),H=u("a"),z=f(W),I=d(),B=u("blockquote"),U=f(X),p(o,"class","col-12 text-primary lead"),p(r,"class","row svelte-1rxym9d"),p(b,"class","text-primary"),p(g,"class","col-6"),p(w,"class","text-primary"),p(x,"class","col-6"),p(m,"class","row svelte-1rxym9d"),p(L,"class","text-primary"),p(J,"class","col-1-3rd"),p(q,"class","text-primary"),p(A,"class","col-1-3rd"),p(H,"href",M=t[1].url),p(H,"class","text-capitalize"),p(H,"target","_blank"),p(P,"class","col-1-3rd"),p(C,"class","row svelte-1rxym9d"),p(n,"class","detailHead bg-light svelte-1rxym9d"),p(e,"class","detail svelte-1rxym9d")},m(t,i){l(t,e,i),a(e,n),a(n,r),a(r,o),a(o,s),a(n,c),a(n,m),a(m,g),a(g,y),a(g,b),a(b,$),a(m,v),a(m,x),a(x,_),a(x,w),a(w,j),a(n,k),a(n,C),a(C,J),a(J,S),a(J,L),a(L,N),a(C,O),a(C,A),a(A,T),a(A,q),a(q,E),a(C,D),a(C,P),a(P,R),a(P,H),a(H,z),a(e,I),a(e,B),a(B,U)},p(t,e){2&e&&F!==(F=t[1].title+"")&&h(s,F),2&e&&G!==(G=t[1].company+"")&&h($,G),2&e&&K!==(K=t[1].location+"")&&h(j,K),2&e&&Q!==(Q=t[1].salary+"")&&h(N,Q),2&e&&V!==(V=t[1].date+"")&&h(E,V),2&e&&W!==(W=t[1].site+"")&&h(z,W),2&e&&M!==(M=t[1].url)&&p(H,"href",M),2&e&&X!==(X=t[1].summary+"")&&h(U,X)},d(t){t&&i(e)}}}function Y(e){let n,r=e[0]&&X(e);return{c(){r&&r.c(),n=f("")},m(t,e){r&&r.m(t,e),l(t,n,e)},p(t,[e]){t[0]?r?r.p(t,e):(r=X(t),r.c(),r.m(n.parentNode,n)):r&&(r.d(1),r=null)},i:t,o:t,d(t){r&&r.d(t),t&&i(n)}}}function Z(t,e,n){let r;c(t,U,t=>n(1,r=t));let o=!1;return U.subscribe(t=>{n(0,o=!function(t){for(const e in t)if(t.hasOwnProperty(e))return!1;return!0}(t))}),[o,r]}class tt extends D{constructor(t){super(),E(this,t,Z,Y,s,{})}}function et(e){let n,r,o,s,c,f,h;const m=new R({}),g=new W({}),y=new tt({});return{c(){n=u("main"),r=u("div"),o=u("div"),O(m.$$.fragment),s=d(),c=u("div"),O(g.$$.fragment),f=d(),O(y.$$.fragment),p(o,"class","col-2"),p(c,"class","col-10"),p(r,"class","grid view")},m(t,e){l(t,n,e),a(n,r),a(r,o),A(m,o,null),a(r,s),a(r,c),A(g,c,null),a(c,f),A(y,c,null),h=!0},p:t,i(t){h||(L(m.$$.fragment,t),L(g.$$.fragment,t),L(y.$$.fragment,t),h=!0)},o(t){N(m.$$.fragment,t),N(g.$$.fragment,t),N(y.$$.fragment,t),h=!1},d(t){t&&i(n),T(m),T(g),T(y)}}}const nt=new class extends D{constructor(t){super(),E(this,t,null,et,s,{})}}({target:document.body});return F.getJobList(),nt}(); diff --git a/dist/build/bundle.js.map b/dist/build/bundle.js.map new file mode 100644 index 0000000..0675142 --- /dev/null +++ b/dist/build/bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bundle.js","sources":["../../node_modules/svelte/internal/index.mjs","../../src/components/Menu.svelte","../../node_modules/svelte/store/index.mjs","../../node_modules/redaxios/dist/redaxios.module.js","../../src/state/state.js","../../src/components/Lister.svelte","../../src/components/Detail.svelte","../../src/main.js"],"sourcesContent":["function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n // @ts-ignore\n for (const k in src)\n tar[k] = src[k];\n return tar;\n}\nfunction is_promise(value) {\n return value && typeof value === 'object' && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n element.__svelte_meta = {\n loc: { file, line, column, char }\n };\n}\nfunction run(fn) {\n return fn();\n}\nfunction blank_object() {\n return Object.create(null);\n}\nfunction run_all(fns) {\n fns.forEach(run);\n}\nfunction is_function(thing) {\n return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nfunction not_equal(a, b) {\n return a != a ? b == b : a !== b;\n}\nfunction validate_store(store, name) {\n if (store != null && typeof store.subscribe !== 'function') {\n throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n }\n}\nfunction subscribe(store, ...callbacks) {\n if (store == null) {\n return noop;\n }\n const unsub = store.subscribe(...callbacks);\n return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n let value;\n subscribe(store, _ => value = _)();\n return value;\n}\nfunction component_subscribe(component, store, callback) {\n component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n if (definition) {\n const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n return definition[0](slot_ctx);\n }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n return definition[1] && fn\n ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n if (definition[2] && fn) {\n const lets = definition[2](fn(dirty));\n if ($$scope.dirty === undefined) {\n return lets;\n }\n if (typeof lets === 'object') {\n const merged = [];\n const len = Math.max($$scope.dirty.length, lets.length);\n for (let i = 0; i < len; i += 1) {\n merged[i] = $$scope.dirty[i] | lets[i];\n }\n return merged;\n }\n return $$scope.dirty | lets;\n }\n return $$scope.dirty;\n}\nfunction exclude_internal_props(props) {\n const result = {};\n for (const k in props)\n if (k[0] !== '$')\n result[k] = props[k];\n return result;\n}\nfunction compute_rest_props(props, keys) {\n const rest = {};\n keys = new Set(keys);\n for (const k in props)\n if (!keys.has(k) && k[0] !== '$')\n rest[k] = props[k];\n return rest;\n}\nfunction once(fn) {\n let ran = false;\n return function (...args) {\n if (ran)\n return;\n ran = true;\n fn.call(this, ...args);\n };\n}\nfunction null_to_empty(value) {\n return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value = ret) {\n store.set(value);\n return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n ? () => window.performance.now()\n : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n now = fn;\n}\nfunction set_raf(fn) {\n raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n tasks.forEach(task => {\n if (!task.c(now)) {\n tasks.delete(task);\n task.f();\n }\n });\n if (tasks.size !== 0)\n raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n let task;\n if (tasks.size === 0)\n raf(run_tasks);\n return {\n promise: new Promise(fulfill => {\n tasks.add(task = { c: callback, f: fulfill });\n }),\n abort() {\n tasks.delete(task);\n }\n };\n}\n\nfunction append(target, node) {\n target.appendChild(node);\n}\nfunction insert(target, node, anchor) {\n target.insertBefore(node, anchor || null);\n}\nfunction detach(node) {\n node.parentNode.removeChild(node);\n}\nfunction destroy_each(iterations, detaching) {\n for (let i = 0; i < iterations.length; i += 1) {\n if (iterations[i])\n iterations[i].d(detaching);\n }\n}\nfunction element(name) {\n return document.createElement(name);\n}\nfunction element_is(name, is) {\n return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n const target = {};\n for (const k in obj) {\n if (has_prop(obj, k)\n // @ts-ignore\n && exclude.indexOf(k) === -1) {\n // @ts-ignore\n target[k] = obj[k];\n }\n }\n return target;\n}\nfunction svg_element(name) {\n return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n return document.createTextNode(data);\n}\nfunction space() {\n return text(' ');\n}\nfunction empty() {\n return text('');\n}\nfunction listen(node, event, handler, options) {\n node.addEventListener(event, handler, options);\n return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n return function (event) {\n event.preventDefault();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_propagation(fn) {\n return function (event) {\n event.stopPropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction self(fn) {\n return function (event) {\n // @ts-ignore\n if (event.target === this)\n fn.call(this, event);\n };\n}\nfunction attr(node, attribute, value) {\n if (value == null)\n node.removeAttribute(attribute);\n else if (node.getAttribute(attribute) !== value)\n node.setAttribute(attribute, value);\n}\nfunction set_attributes(node, attributes) {\n // @ts-ignore\n const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n for (const key in attributes) {\n if (attributes[key] == null) {\n node.removeAttribute(key);\n }\n else if (key === 'style') {\n node.style.cssText = attributes[key];\n }\n else if (key === '__value' || descriptors[key] && descriptors[key].set) {\n node[key] = attributes[key];\n }\n else {\n attr(node, key, attributes[key]);\n }\n }\n}\nfunction set_svg_attributes(node, attributes) {\n for (const key in attributes) {\n attr(node, key, attributes[key]);\n }\n}\nfunction set_custom_element_data(node, prop, value) {\n if (prop in node) {\n node[prop] = value;\n }\n else {\n attr(node, prop, value);\n }\n}\nfunction xlink_attr(node, attribute, value) {\n node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group) {\n const value = [];\n for (let i = 0; i < group.length; i += 1) {\n if (group[i].checked)\n value.push(group[i].__value);\n }\n return value;\n}\nfunction to_number(value) {\n return value === '' ? undefined : +value;\n}\nfunction time_ranges_to_array(ranges) {\n const array = [];\n for (let i = 0; i < ranges.length; i += 1) {\n array.push({ start: ranges.start(i), end: ranges.end(i) });\n }\n return array;\n}\nfunction children(element) {\n return Array.from(element.childNodes);\n}\nfunction claim_element(nodes, name, attributes, svg) {\n for (let i = 0; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeName === name) {\n let j = 0;\n while (j < node.attributes.length) {\n const attribute = node.attributes[j];\n if (attributes[attribute.name]) {\n j++;\n }\n else {\n node.removeAttribute(attribute.name);\n }\n }\n return nodes.splice(i, 1)[0];\n }\n }\n return svg ? svg_element(name) : element(name);\n}\nfunction claim_text(nodes, data) {\n for (let i = 0; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeType === 3) {\n node.data = '' + data;\n return nodes.splice(i, 1)[0];\n }\n }\n return text(data);\n}\nfunction claim_space(nodes) {\n return claim_text(nodes, ' ');\n}\nfunction set_data(text, data) {\n data = '' + data;\n if (text.data !== data)\n text.data = data;\n}\nfunction set_input_value(input, value) {\n if (value != null || input.value) {\n input.value = value;\n }\n}\nfunction set_input_type(input, type) {\n try {\n input.type = type;\n }\n catch (e) {\n // do nothing\n }\n}\nfunction set_style(node, key, value, important) {\n node.style.setProperty(key, value, important ? 'important' : '');\n}\nfunction select_option(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n if (option.__value === value) {\n option.selected = true;\n return;\n }\n }\n}\nfunction select_options(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n option.selected = ~value.indexOf(option.__value);\n }\n}\nfunction select_value(select) {\n const selected_option = select.querySelector(':checked') || select.options[0];\n return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n if (crossorigin === undefined) {\n crossorigin = false;\n try {\n if (typeof window !== 'undefined' && window.parent) {\n void window.parent.document;\n }\n }\n catch (error) {\n crossorigin = true;\n }\n }\n return crossorigin;\n}\nfunction add_resize_listener(node, fn) {\n const computed_style = getComputedStyle(node);\n const z_index = (parseInt(computed_style.zIndex) || 0) - 1;\n if (computed_style.position === 'static') {\n node.style.position = 'relative';\n }\n const iframe = element('iframe');\n iframe.setAttribute('style', `display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ` +\n `overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: ${z_index};`);\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n let unsubscribe;\n if (is_crossorigin()) {\n iframe.src = `data:text/html,`;\n unsubscribe = listen(window, 'message', (event) => {\n if (event.source === iframe.contentWindow)\n fn();\n });\n }\n else {\n iframe.src = 'about:blank';\n iframe.onload = () => {\n unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n };\n }\n append(node, iframe);\n return () => {\n detach(iframe);\n if (unsubscribe)\n unsubscribe();\n };\n}\nfunction toggle_class(element, name, toggle) {\n element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail) {\n const e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, false, false, detail);\n return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n return Array.from(parent.querySelectorAll(selector));\n}\nclass HtmlTag {\n constructor(html, anchor = null) {\n this.e = element('div');\n this.a = anchor;\n this.u(html);\n }\n m(target, anchor = null) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert(target, this.n[i], anchor);\n }\n this.t = target;\n }\n u(html) {\n this.e.innerHTML = html;\n this.n = Array.from(this.e.childNodes);\n }\n p(html) {\n this.d();\n this.u(html);\n this.m(this.t, this.a);\n }\n d() {\n this.n.forEach(detach);\n }\n}\n\nconst active_docs = new Set();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n while (i--)\n hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n return hash >>> 0;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n const step = 16.666 / duration;\n let keyframes = '{\\n';\n for (let p = 0; p <= 1; p += step) {\n const t = a + (b - a) * ease(p);\n keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n }\n const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n const name = `__svelte_${hash(rule)}_${uid}`;\n const doc = node.ownerDocument;\n active_docs.add(doc);\n const stylesheet = doc.__svelte_stylesheet || (doc.__svelte_stylesheet = doc.head.appendChild(element('style')).sheet);\n const current_rules = doc.__svelte_rules || (doc.__svelte_rules = {});\n if (!current_rules[name]) {\n current_rules[name] = true;\n stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n }\n const animation = node.style.animation || '';\n node.style.animation = `${animation ? `${animation}, ` : ``}${name} ${duration}ms linear ${delay}ms 1 both`;\n active += 1;\n return name;\n}\nfunction delete_rule(node, name) {\n const previous = (node.style.animation || '').split(', ');\n const next = previous.filter(name\n ? anim => anim.indexOf(name) < 0 // remove specific animation\n : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n );\n const deleted = previous.length - next.length;\n if (deleted) {\n node.style.animation = next.join(', ');\n active -= deleted;\n if (!active)\n clear_rules();\n }\n}\nfunction clear_rules() {\n raf(() => {\n if (active)\n return;\n active_docs.forEach(doc => {\n const stylesheet = doc.__svelte_stylesheet;\n let i = stylesheet.cssRules.length;\n while (i--)\n stylesheet.deleteRule(i);\n doc.__svelte_rules = {};\n });\n active_docs.clear();\n });\n}\n\nfunction create_animation(node, from, fn, params) {\n if (!from)\n return noop;\n const to = node.getBoundingClientRect();\n if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n return noop;\n const { delay = 0, duration = 300, easing = identity, \n // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n start: start_time = now() + delay, \n // @ts-ignore todo:\n end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n let running = true;\n let started = false;\n let name;\n function start() {\n if (css) {\n name = create_rule(node, 0, 1, duration, delay, easing, css);\n }\n if (!delay) {\n started = true;\n }\n }\n function stop() {\n if (css)\n delete_rule(node, name);\n running = false;\n }\n loop(now => {\n if (!started && now >= start_time) {\n started = true;\n }\n if (started && now >= end) {\n tick(1, 0);\n stop();\n }\n if (!running) {\n return false;\n }\n if (started) {\n const p = now - start_time;\n const t = 0 + 1 * easing(p / duration);\n tick(t, 1 - t);\n }\n return true;\n });\n start();\n tick(0, 1);\n return stop;\n}\nfunction fix_position(node) {\n const style = getComputedStyle(node);\n if (style.position !== 'absolute' && style.position !== 'fixed') {\n const { width, height } = style;\n const a = node.getBoundingClientRect();\n node.style.position = 'absolute';\n node.style.width = width;\n node.style.height = height;\n add_transform(node, a);\n }\n}\nfunction add_transform(node, a) {\n const b = node.getBoundingClientRect();\n if (a.left !== b.left || a.top !== b.top) {\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n current_component = component;\n}\nfunction get_current_component() {\n if (!current_component)\n throw new Error(`Function called outside component initialization`);\n return current_component;\n}\nfunction beforeUpdate(fn) {\n get_current_component().$$.before_update.push(fn);\n}\nfunction onMount(fn) {\n get_current_component().$$.on_mount.push(fn);\n}\nfunction afterUpdate(fn) {\n get_current_component().$$.after_update.push(fn);\n}\nfunction onDestroy(fn) {\n get_current_component().$$.on_destroy.push(fn);\n}\nfunction createEventDispatcher() {\n const component = get_current_component();\n return (type, detail) => {\n const callbacks = component.$$.callbacks[type];\n if (callbacks) {\n // TODO are there situations where events could be dispatched\n // in a server (non-DOM) environment?\n const event = custom_event(type, detail);\n callbacks.slice().forEach(fn => {\n fn.call(component, event);\n });\n }\n };\n}\nfunction setContext(key, context) {\n get_current_component().$$.context.set(key, context);\n}\nfunction getContext(key) {\n return get_current_component().$$.context.get(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n const callbacks = component.$$.callbacks[event.type];\n if (callbacks) {\n callbacks.slice().forEach(fn => fn(event));\n }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nconst render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n if (!update_scheduled) {\n update_scheduled = true;\n resolved_promise.then(flush);\n }\n}\nfunction tick() {\n schedule_update();\n return resolved_promise;\n}\nfunction add_render_callback(fn) {\n render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n flush_callbacks.push(fn);\n}\nlet flushing = false;\nconst seen_callbacks = new Set();\nfunction flush() {\n if (flushing)\n return;\n flushing = true;\n do {\n // first, call beforeUpdate functions\n // and update components\n for (let i = 0; i < dirty_components.length; i += 1) {\n const component = dirty_components[i];\n set_current_component(component);\n update(component.$$);\n }\n dirty_components.length = 0;\n while (binding_callbacks.length)\n binding_callbacks.pop()();\n // then, once components are updated, call\n // afterUpdate functions. This may cause\n // subsequent updates...\n for (let i = 0; i < render_callbacks.length; i += 1) {\n const callback = render_callbacks[i];\n if (!seen_callbacks.has(callback)) {\n // ...so guard against infinite loops\n seen_callbacks.add(callback);\n callback();\n }\n }\n render_callbacks.length = 0;\n } while (dirty_components.length);\n while (flush_callbacks.length) {\n flush_callbacks.pop()();\n }\n update_scheduled = false;\n flushing = false;\n seen_callbacks.clear();\n}\nfunction update($$) {\n if ($$.fragment !== null) {\n $$.update();\n run_all($$.before_update);\n const dirty = $$.dirty;\n $$.dirty = [-1];\n $$.fragment && $$.fragment.p($$.ctx, dirty);\n $$.after_update.forEach(add_render_callback);\n }\n}\n\nlet promise;\nfunction wait() {\n if (!promise) {\n promise = Promise.resolve();\n promise.then(() => {\n promise = null;\n });\n }\n return promise;\n}\nfunction dispatch(node, direction, kind) {\n node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n outros = {\n r: 0,\n c: [],\n p: outros // parent group\n };\n}\nfunction check_outros() {\n if (!outros.r) {\n run_all(outros.c);\n }\n outros = outros.p;\n}\nfunction transition_in(block, local) {\n if (block && block.i) {\n outroing.delete(block);\n block.i(local);\n }\n}\nfunction transition_out(block, local, detach, callback) {\n if (block && block.o) {\n if (outroing.has(block))\n return;\n outroing.add(block);\n outros.c.push(() => {\n outroing.delete(block);\n if (callback) {\n if (detach)\n block.d(1);\n callback();\n }\n });\n block.o(local);\n }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n let config = fn(node, params);\n let running = false;\n let animation_name;\n let task;\n let uid = 0;\n function cleanup() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n tick(0, 1);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n if (task)\n task.abort();\n running = true;\n add_render_callback(() => dispatch(node, true, 'start'));\n task = loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(1, 0);\n dispatch(node, true, 'end');\n cleanup();\n return running = false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(t, 1 - t);\n }\n }\n return running;\n });\n }\n let started = false;\n return {\n start() {\n if (started)\n return;\n delete_rule(node);\n if (is_function(config)) {\n config = config();\n wait().then(go);\n }\n else {\n go();\n }\n },\n invalidate() {\n started = false;\n },\n end() {\n if (running) {\n cleanup();\n running = false;\n }\n }\n };\n}\nfunction create_out_transition(node, fn, params) {\n let config = fn(node, params);\n let running = true;\n let animation_name;\n const group = outros;\n group.r += 1;\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n add_render_callback(() => dispatch(node, false, 'start'));\n loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(0, 1);\n dispatch(node, false, 'end');\n if (!--group.r) {\n // this will result in `end()` being called,\n // so we don't need to clean up here\n run_all(group.c);\n }\n return false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(1 - t, t);\n }\n }\n return running;\n });\n }\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config();\n go();\n });\n }\n else {\n go();\n }\n return {\n end(reset) {\n if (reset && config.tick) {\n config.tick(1, 0);\n }\n if (running) {\n if (animation_name)\n delete_rule(node, animation_name);\n running = false;\n }\n }\n };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n let config = fn(node, params);\n let t = intro ? 0 : 1;\n let running_program = null;\n let pending_program = null;\n let animation_name = null;\n function clear_animation() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function init(program, duration) {\n const d = program.b - t;\n duration *= Math.abs(d);\n return {\n a: t,\n b: program.b,\n d,\n duration,\n start: program.start,\n end: program.start + duration,\n group: program.group\n };\n }\n function go(b) {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n const program = {\n start: now() + delay,\n b\n };\n if (!b) {\n // @ts-ignore todo: improve typings\n program.group = outros;\n outros.r += 1;\n }\n if (running_program) {\n pending_program = program;\n }\n else {\n // if this is an intro, and there's a delay, we need to do\n // an initial tick and/or apply CSS animation immediately\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, b, duration, delay, easing, css);\n }\n if (b)\n tick(0, 1);\n running_program = init(program, duration);\n add_render_callback(() => dispatch(node, b, 'start'));\n loop(now => {\n if (pending_program && now > pending_program.start) {\n running_program = init(pending_program, duration);\n pending_program = null;\n dispatch(node, running_program.b, 'start');\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n }\n }\n if (running_program) {\n if (now >= running_program.end) {\n tick(t = running_program.b, 1 - t);\n dispatch(node, running_program.b, 'end');\n if (!pending_program) {\n // we're done\n if (running_program.b) {\n // intro — we can tidy up immediately\n clear_animation();\n }\n else {\n // outro — needs to be coordinated\n if (!--running_program.group.r)\n run_all(running_program.group.c);\n }\n }\n running_program = null;\n }\n else if (now >= running_program.start) {\n const p = now - running_program.start;\n t = running_program.a + running_program.d * easing(p / running_program.duration);\n tick(t, 1 - t);\n }\n }\n return !!(running_program || pending_program);\n });\n }\n }\n return {\n run(b) {\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config();\n go(b);\n });\n }\n else {\n go(b);\n }\n },\n end() {\n clear_animation();\n running_program = pending_program = null;\n }\n };\n}\n\nfunction handle_promise(promise, info) {\n const token = info.token = {};\n function update(type, index, key, value) {\n if (info.token !== token)\n return;\n info.resolved = value;\n let child_ctx = info.ctx;\n if (key !== undefined) {\n child_ctx = child_ctx.slice();\n child_ctx[key] = value;\n }\n const block = type && (info.current = type)(child_ctx);\n let needs_flush = false;\n if (info.block) {\n if (info.blocks) {\n info.blocks.forEach((block, i) => {\n if (i !== index && block) {\n group_outros();\n transition_out(block, 1, 1, () => {\n info.blocks[i] = null;\n });\n check_outros();\n }\n });\n }\n else {\n info.block.d(1);\n }\n block.c();\n transition_in(block, 1);\n block.m(info.mount(), info.anchor);\n needs_flush = true;\n }\n info.block = block;\n if (info.blocks)\n info.blocks[index] = block;\n if (needs_flush) {\n flush();\n }\n }\n if (is_promise(promise)) {\n const current_component = get_current_component();\n promise.then(value => {\n set_current_component(current_component);\n update(info.then, 1, info.value, value);\n set_current_component(null);\n }, error => {\n set_current_component(current_component);\n update(info.catch, 2, info.error, error);\n set_current_component(null);\n });\n // if we previously had a then/catch block, destroy it\n if (info.current !== info.pending) {\n update(info.pending, 0);\n return true;\n }\n }\n else {\n if (info.current !== info.then) {\n update(info.then, 1, info.value, promise);\n return true;\n }\n info.resolved = promise;\n }\n}\n\nconst globals = (typeof window !== 'undefined'\n ? window\n : typeof globalThis !== 'undefined'\n ? globalThis\n : global);\n\nfunction destroy_block(block, lookup) {\n block.d(1);\n lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n transition_out(block, 1, 1, () => {\n lookup.delete(block.key);\n });\n}\nfunction fix_and_destroy_block(block, lookup) {\n block.f();\n destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n block.f();\n outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n let o = old_blocks.length;\n let n = list.length;\n let i = o;\n const old_indexes = {};\n while (i--)\n old_indexes[old_blocks[i].key] = i;\n const new_blocks = [];\n const new_lookup = new Map();\n const deltas = new Map();\n i = n;\n while (i--) {\n const child_ctx = get_context(ctx, list, i);\n const key = get_key(child_ctx);\n let block = lookup.get(key);\n if (!block) {\n block = create_each_block(key, child_ctx);\n block.c();\n }\n else if (dynamic) {\n block.p(child_ctx, dirty);\n }\n new_lookup.set(key, new_blocks[i] = block);\n if (key in old_indexes)\n deltas.set(key, Math.abs(i - old_indexes[key]));\n }\n const will_move = new Set();\n const did_move = new Set();\n function insert(block) {\n transition_in(block, 1);\n block.m(node, next, lookup.has(block.key));\n lookup.set(block.key, block);\n next = block.first;\n n--;\n }\n while (o && n) {\n const new_block = new_blocks[n - 1];\n const old_block = old_blocks[o - 1];\n const new_key = new_block.key;\n const old_key = old_block.key;\n if (new_block === old_block) {\n // do nothing\n next = new_block.first;\n o--;\n n--;\n }\n else if (!new_lookup.has(old_key)) {\n // remove old block\n destroy(old_block, lookup);\n o--;\n }\n else if (!lookup.has(new_key) || will_move.has(new_key)) {\n insert(new_block);\n }\n else if (did_move.has(old_key)) {\n o--;\n }\n else if (deltas.get(new_key) > deltas.get(old_key)) {\n did_move.add(new_key);\n insert(new_block);\n }\n else {\n will_move.add(old_key);\n o--;\n }\n }\n while (o--) {\n const old_block = old_blocks[o];\n if (!new_lookup.has(old_block.key))\n destroy(old_block, lookup);\n }\n while (n)\n insert(new_blocks[n - 1]);\n return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n const keys = new Set();\n for (let i = 0; i < list.length; i++) {\n const key = get_key(get_context(ctx, list, i));\n if (keys.has(key)) {\n throw new Error(`Cannot have duplicate keys in a keyed each`);\n }\n keys.add(key);\n }\n}\n\nfunction get_spread_update(levels, updates) {\n const update = {};\n const to_null_out = {};\n const accounted_for = { $$scope: 1 };\n let i = levels.length;\n while (i--) {\n const o = levels[i];\n const n = updates[i];\n if (n) {\n for (const key in o) {\n if (!(key in n))\n to_null_out[key] = 1;\n }\n for (const key in n) {\n if (!accounted_for[key]) {\n update[key] = n[key];\n accounted_for[key] = 1;\n }\n }\n levels[i] = n;\n }\n else {\n for (const key in o) {\n accounted_for[key] = 1;\n }\n }\n }\n for (const key in to_null_out) {\n if (!(key in update))\n update[key] = undefined;\n }\n return update;\n}\nfunction get_spread_object(spread_props) {\n return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\n// source: https://html.spec.whatwg.org/multipage/indices.html\nconst boolean_attributes = new Set([\n 'allowfullscreen',\n 'allowpaymentrequest',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'ismap',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected'\n]);\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, classes_to_add) {\n const attributes = Object.assign({}, ...args);\n if (classes_to_add) {\n if (attributes.class == null) {\n attributes.class = classes_to_add;\n }\n else {\n attributes.class += ' ' + classes_to_add;\n }\n }\n let str = '';\n Object.keys(attributes).forEach(name => {\n if (invalid_attribute_name_character.test(name))\n return;\n const value = attributes[name];\n if (value === true)\n str += \" \" + name;\n else if (boolean_attributes.has(name.toLowerCase())) {\n if (value)\n str += \" \" + name;\n }\n else if (value != null) {\n str += ` ${name}=\"${String(value).replace(/\"/g, '"').replace(/'/g, ''')}\"`;\n }\n });\n return str;\n}\nconst escaped = {\n '\"': '"',\n \"'\": ''',\n '&': '&',\n '<': '<',\n '>': '>'\n};\nfunction escape(html) {\n return String(html).replace(/[\"'&<>]/g, match => escaped[match]);\n}\nfunction each(items, fn) {\n let str = '';\n for (let i = 0; i < items.length; i += 1) {\n str += fn(items[i], i);\n }\n return str;\n}\nconst missing_component = {\n $$render: () => ''\n};\nfunction validate_component(component, name) {\n if (!component || !component.$$render) {\n if (name === 'svelte:component')\n name += ' this={...}';\n throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules`);\n }\n return component;\n}\nfunction debug(file, line, column, values) {\n console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n console.log(values); // eslint-disable-line no-console\n return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n function $$render(result, props, bindings, slots) {\n const parent_component = current_component;\n const $$ = {\n on_destroy,\n context: new Map(parent_component ? parent_component.$$.context : []),\n // these will be immediately discarded\n on_mount: [],\n before_update: [],\n after_update: [],\n callbacks: blank_object()\n };\n set_current_component({ $$ });\n const html = fn(result, props, bindings, slots);\n set_current_component(parent_component);\n return html;\n }\n return {\n render: (props = {}, options = {}) => {\n on_destroy = [];\n const result = { title: '', head: '', css: new Set() };\n const html = $$render(result, props, {}, options);\n run_all(on_destroy);\n return {\n html,\n css: {\n code: Array.from(result.css).map(css => css.code).join('\\n'),\n map: null // TODO\n },\n head: result.title + result.head\n };\n },\n $$render\n };\n}\nfunction add_attribute(name, value, boolean) {\n if (value == null || (boolean && !value))\n return '';\n return ` ${name}${value === true ? '' : `=${typeof value === 'string' ? JSON.stringify(escape(value)) : `\"${value}\"`}`}`;\n}\nfunction add_classes(classes) {\n return classes ? ` class=\"${classes}\"` : ``;\n}\n\nfunction bind(component, name, callback) {\n const index = component.$$.props[name];\n if (index !== undefined) {\n component.$$.bound[index] = callback;\n callback(component.$$.ctx[index]);\n }\n}\nfunction create_component(block) {\n block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor) {\n const { fragment, on_mount, on_destroy, after_update } = component.$$;\n fragment && fragment.m(target, anchor);\n // onMount happens before the initial afterUpdate\n add_render_callback(() => {\n const new_on_destroy = on_mount.map(run).filter(is_function);\n if (on_destroy) {\n on_destroy.push(...new_on_destroy);\n }\n else {\n // Edge case - component was destroyed immediately,\n // most likely as a result of a binding initialising\n run_all(new_on_destroy);\n }\n component.$$.on_mount = [];\n });\n after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n const $$ = component.$$;\n if ($$.fragment !== null) {\n run_all($$.on_destroy);\n $$.fragment && $$.fragment.d(detaching);\n // TODO null out other refs, including component.$$ (but need to\n // preserve final state?)\n $$.on_destroy = $$.fragment = null;\n $$.ctx = [];\n }\n}\nfunction make_dirty(component, i) {\n if (component.$$.dirty[0] === -1) {\n dirty_components.push(component);\n schedule_update();\n component.$$.dirty.fill(0);\n }\n component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, dirty = [-1]) {\n const parent_component = current_component;\n set_current_component(component);\n const prop_values = options.props || {};\n const $$ = component.$$ = {\n fragment: null,\n ctx: null,\n // state\n props,\n update: noop,\n not_equal,\n bound: blank_object(),\n // lifecycle\n on_mount: [],\n on_destroy: [],\n before_update: [],\n after_update: [],\n context: new Map(parent_component ? parent_component.$$.context : []),\n // everything else\n callbacks: blank_object(),\n dirty\n };\n let ready = false;\n $$.ctx = instance\n ? instance(component, prop_values, (i, ret, ...rest) => {\n const value = rest.length ? rest[0] : ret;\n if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n if ($$.bound[i])\n $$.bound[i](value);\n if (ready)\n make_dirty(component, i);\n }\n return ret;\n })\n : [];\n $$.update();\n ready = true;\n run_all($$.before_update);\n // `false` as a special case of no DOM component\n $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n if (options.target) {\n if (options.hydrate) {\n const nodes = children(options.target);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.l(nodes);\n nodes.forEach(detach);\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.c();\n }\n if (options.intro)\n transition_in(component.$$.fragment);\n mount_component(component, options.target, options.anchor);\n flush();\n }\n set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n SvelteElement = class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n connectedCallback() {\n // @ts-ignore todo: improve typings\n for (const key in this.$$.slotted) {\n // @ts-ignore todo: improve typings\n this.appendChild(this.$$.slotted[key]);\n }\n }\n attributeChangedCallback(attr, _oldValue, newValue) {\n this[attr] = newValue;\n }\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n // TODO should this delegate to addEventListener?\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set() {\n // overridden by instance, if it has props\n }\n };\n}\nclass SvelteComponent {\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set() {\n // overridden by instance, if it has props\n }\n}\n\nfunction dispatch_dev(type, detail) {\n document.dispatchEvent(custom_event(type, Object.assign({ version: '3.22.2' }, detail)));\n}\nfunction append_dev(target, node) {\n dispatch_dev(\"SvelteDOMInsert\", { target, node });\n append(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n dispatch_dev(\"SvelteDOMInsert\", { target, node, anchor });\n insert(target, node, anchor);\n}\nfunction detach_dev(node) {\n dispatch_dev(\"SvelteDOMRemove\", { node });\n detach(node);\n}\nfunction detach_between_dev(before, after) {\n while (before.nextSibling && before.nextSibling !== after) {\n detach_dev(before.nextSibling);\n }\n}\nfunction detach_before_dev(after) {\n while (after.previousSibling) {\n detach_dev(after.previousSibling);\n }\n}\nfunction detach_after_dev(before) {\n while (before.nextSibling) {\n detach_dev(before.nextSibling);\n }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) {\n const modifiers = options === true ? [\"capture\"] : options ? Array.from(Object.keys(options)) : [];\n if (has_prevent_default)\n modifiers.push('preventDefault');\n if (has_stop_propagation)\n modifiers.push('stopPropagation');\n dispatch_dev(\"SvelteDOMAddEventListener\", { node, event, handler, modifiers });\n const dispose = listen(node, event, handler, options);\n return () => {\n dispatch_dev(\"SvelteDOMRemoveEventListener\", { node, event, handler, modifiers });\n dispose();\n };\n}\nfunction attr_dev(node, attribute, value) {\n attr(node, attribute, value);\n if (value == null)\n dispatch_dev(\"SvelteDOMRemoveAttribute\", { node, attribute });\n else\n dispatch_dev(\"SvelteDOMSetAttribute\", { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n node[property] = value;\n dispatch_dev(\"SvelteDOMSetProperty\", { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n node.dataset[property] = value;\n dispatch_dev(\"SvelteDOMSetDataset\", { node, property, value });\n}\nfunction set_data_dev(text, data) {\n data = '' + data;\n if (text.data === data)\n return;\n dispatch_dev(\"SvelteDOMSetData\", { node: text, data });\n text.data = data;\n}\nfunction validate_each_argument(arg) {\n if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n let msg = '{#each} only iterates over array-like objects.';\n if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n msg += ' You can use a spread to convert this iterable into an array.';\n }\n throw new Error(msg);\n }\n}\nfunction validate_slots(name, slot, keys) {\n for (const slot_key of Object.keys(slot)) {\n if (!~keys.indexOf(slot_key)) {\n console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n }\n }\n}\nclass SvelteComponentDev extends SvelteComponent {\n constructor(options) {\n if (!options || (!options.target && !options.$$inline)) {\n throw new Error(`'target' is a required option`);\n }\n super();\n }\n $destroy() {\n super.$destroy();\n this.$destroy = () => {\n console.warn(`Component was already destroyed`); // eslint-disable-line no-console\n };\n }\n $capture_state() { }\n $inject_state() { }\n}\nfunction loop_guard(timeout) {\n const start = Date.now();\n return () => {\n if (Date.now() - start > timeout) {\n throw new Error(`Infinite loop detected`);\n }\n };\n}\n\nexport { HtmlTag, SvelteComponent, SvelteComponentDev, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_location, add_render_callback, add_resize_listener, add_transform, afterUpdate, append, append_dev, assign, attr, attr_dev, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_component, claim_element, claim_space, claim_text, clear_loops, component_subscribe, compute_rest_props, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, escape, escaped, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, getContext, get_binding_group_value, get_current_component, get_slot_changes, get_slot_context, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, has_prop, identity, init, insert, insert_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_function, is_promise, listen, listen_dev, loop, loop_guard, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_data, set_data_dev, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, spread, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, update_keyed_each, validate_component, validate_each_argument, validate_each_keys, validate_slots, validate_store, xlink_attr };\n","\n\n\n\n\n

Jobs

\n
\n\n \n
\n","import { noop, safe_not_equal, subscribe, run_all, is_function } from '../internal';\nexport { get_store_value as get } from '../internal';\n\nconst subscriber_queue = [];\n/**\n * Creates a `Readable` store that allows reading by subscription.\n * @param value initial value\n * @param {StartStopNotifier}start start and stop notifications for subscriptions\n */\nfunction readable(value, start) {\n return {\n subscribe: writable(value, start).subscribe,\n };\n}\n/**\n * Create a `Writable` store that allows both updating and reading by subscription.\n * @param {*=}value initial value\n * @param {StartStopNotifier=}start start and stop notifications for subscriptions\n */\nfunction writable(value, start = noop) {\n let stop;\n const subscribers = [];\n function set(new_value) {\n if (safe_not_equal(value, new_value)) {\n value = new_value;\n if (stop) { // store is ready\n const run_queue = !subscriber_queue.length;\n for (let i = 0; i < subscribers.length; i += 1) {\n const s = subscribers[i];\n s[1]();\n subscriber_queue.push(s, value);\n }\n if (run_queue) {\n for (let i = 0; i < subscriber_queue.length; i += 2) {\n subscriber_queue[i][0](subscriber_queue[i + 1]);\n }\n subscriber_queue.length = 0;\n }\n }\n }\n }\n function update(fn) {\n set(fn(value));\n }\n function subscribe(run, invalidate = noop) {\n const subscriber = [run, invalidate];\n subscribers.push(subscriber);\n if (subscribers.length === 1) {\n stop = start(set) || noop;\n }\n run(value);\n return () => {\n const index = subscribers.indexOf(subscriber);\n if (index !== -1) {\n subscribers.splice(index, 1);\n }\n if (subscribers.length === 0) {\n stop();\n stop = null;\n }\n };\n }\n return { set, update, subscribe };\n}\nfunction derived(stores, fn, initial_value) {\n const single = !Array.isArray(stores);\n const stores_array = single\n ? [stores]\n : stores;\n const auto = fn.length < 2;\n return readable(initial_value, (set) => {\n let inited = false;\n const values = [];\n let pending = 0;\n let cleanup = noop;\n const sync = () => {\n if (pending) {\n return;\n }\n cleanup();\n const result = fn(single ? values[0] : values, set);\n if (auto) {\n set(result);\n }\n else {\n cleanup = is_function(result) ? result : noop;\n }\n };\n const unsubscribers = stores_array.map((store, i) => subscribe(store, (value) => {\n values[i] = value;\n pending &= ~(1 << i);\n if (inited) {\n sync();\n }\n }, () => {\n pending |= (1 << i);\n }));\n inited = true;\n sync();\n return function stop() {\n run_all(unsubscribers);\n cleanup();\n };\n });\n}\n\nexport { derived, readable, writable };\n","export default(function e(t){function r(e){return function(t,r){return a(t,Object.assign({method:e},r))}}function o(e){return function(t,r,o){return a(t,Object.assign({method:e,data:r},o))}}function n(e,t,r){if(Array.isArray(e))return e.concat(t);if(t&&\"object\"==typeof t){var o,a={};if(e)for(o in e)a[r?o.toLowerCase():o]=e[o];for(o in t){var i=r?o.toLowerCase():o;\"headers\"===i&&(r=!0),a[i]=o in a?n(a[i],t[o],r):t[o]}return a}return t}function a(e,r){\"string\"!=typeof e&&(e=(r=e).url);var o=n(t,r||{}),a=o.data;if(o.transformRequest)for(var i=0;i {\n // console.log('>> retrieved', d);\n const data = JSON.parse(d.data);\n \n JobList.set(data);\n }).catch((err) => {\n console.error('getJobList', err);\n });\n },\n \n loadJobDetail(id) {\n console.log(`loadJobDetail: ${id}`);\n if (id) {\n const u = `${urls.jobs}/${id}`;\n axios.get(u).then((d) => {\n const data = JSON.parse(d.data);\n\n JobDetails.set(data);\n }).catch((err) => {\n console.error('loadJobDetail', err);\n });\n }\n }\n\n};\n\nexport { JobList, JobDetails, actions };\n","\n\n\n\n\n
\n \n \n \n \n \n \n \n \n \n \n {#each $JobList as item, _id}\n \n \n \n \n \n \n {/each}\n \n
\n Title\n \n Site\n \n Company\n \n Date\n
{item.title}{item.site}{item.company}{item.date}
\n
\n\n\n","\n\n\n\n\n{#if visible}\n
\n
\n
\n
\n {$JobDetails.title}\n
\n\n
\n
\n
\n Company: {$JobDetails.company}\n
\n
\n Location: {$JobDetails.location}\n
\n
\n\n
\n
\n Salary: {$JobDetails.salary}\n
\n
\n Scraped: {$JobDetails.date}\n
\n
\n Site: {$JobDetails.site}\n
\n\n
\n\n\n
\n
\n {$JobDetails.summary}\n
\n
\n\n{/if}\n","import App from './App.svelte';\n\nimport { actions } from './state/state';\n\nconst app = new App({\n 'target': document.body\n});\n\nactions.getJobList();\n\nexport default app;\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/favicon.png b/dist/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..f8b097caee60447ce9c4d741d3241073ff41716e GIT binary patch literal 25805 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 rH!gL^VcJetabWy=7n + + + + + + Svelte app + + + + + + + + + + + diff --git a/grabber.js b/grabber.js new file mode 100644 index 0000000..0a8547e --- /dev/null +++ b/grabber.js @@ -0,0 +1,27 @@ +/** + * Created by WebStorm. + * User: martin + * Date: 16/04/2020 + * Time: 23:35 + + */ +const CronJob = require('cron').CronJob; +const IndeedScraper = require('./scrapers/indeed'); +const TotaljobsScraper = require('./scrapers/totaljobs'); + +(async function () { + console.log('Started..'); + const indeedScraper = new IndeedScraper(); + const totaljobsScraper = new TotaljobsScraper(); + + new CronJob('5 6-23/3 * * *', async function() { + await indeedScraper.go('london'); + await totaljobsScraper.go('london'); + await indeedScraper.go('glasgow'); + await totaljobsScraper.go('glasgow'); + await indeedScraper.go('edinburgh'); + await totaljobsScraper.go('edinburgh'); + await indeedScraper.go('milton keynes'); + await totaljobsScraper.go('milton keynes'); + }, null, true); +})(); diff --git a/lib/connect.js b/lib/connect.js new file mode 100644 index 0000000..3cc182a --- /dev/null +++ b/lib/connect.js @@ -0,0 +1,6 @@ +const sqlite3 = require('sqlite3').verbose(); +const db = new sqlite3.Database(`${__dirname}/../db/jobs.db`); + +console.log(`${__dirname}/../db/jobs.db`); + +module.exports = db; diff --git a/lib/dbmanager.js b/lib/dbmanager.js new file mode 100644 index 0000000..b7dc299 --- /dev/null +++ b/lib/dbmanager.js @@ -0,0 +1,66 @@ +/** + * Created by WebStorm. + * User: martin + * Date: 16/04/2020 + * Time: 10:00 + + */ + +const db = require('./connect'); + +function prepareData(_obj) { + const newObj = Object.assign({}, _obj); + + newObj.isEasyApply = (_obj.isEasyApply) ? 1 : 0; + + return newObj; +} + +exports.insertOne = (data) => { + const sql = 'INSERT INTO jobs VALUES (?,?,?,?,?,?,?,?,?,?,?,?)'; + + const workObj = prepareData(data); + + return new Promise((resolve, reject) => { + db.run(sql, [null, workObj.title, workObj.site, workObj.url, workObj.id, workObj.summary, workObj.company, workObj.location, workObj.postDate, workObj.salary, workObj.isEasyApply, workObj.timestamp], function(err) { + if (err) + reject(err); + + resolve({ 'msg':'Row inserted', '_id': this.lastID }); + }); + }); +}; + +exports.getList = () => { + const outgoing = []; + const sql = 'select _id, title, site, company, timestamp from jobs order by _id desc'; + + return new Promise((resolve, reject) => { + db.all(sql, [], (err, rows) => { + if (err) + reject(err); + + rows.forEach((row) => { + outgoing.push(row); + }); + + resolve(outgoing) ; + }); + }); +}; + +exports.getOne = (id) => { + const sql = 'SELECT * FROM jobs WHERE _id = ?'; + + return new Promise((resolve, reject) => { + db.get(sql, [id], (err, row) => { + if (err) + reject(err); + + if (!err) resolve(row); + }); + }); +}; + + +// select _id, title, site, company, timestamp from jobs order by _id desc; diff --git a/lib/filter_3_days.js b/lib/filter_3_days.js new file mode 100644 index 0000000..10a8f65 --- /dev/null +++ b/lib/filter_3_days.js @@ -0,0 +1,18 @@ +module.exports = function (item, itemOptions, source) { + function inDays(d1, d2) { + var t2 = d2.getTime(); + var t1 = d1.getTime(); + + return parseInt((t2-t1)/(24*3600*1000)); + } + + var now = new Date(); + var then = new Date(itemOptions.date); + + var d = inDays(then,now); + + if (d < 3) + return itemOptions; + else + return -1; +}; diff --git a/lib/filter_for_local_jobs.js b/lib/filter_for_local_jobs.js new file mode 100644 index 0000000..29709ce --- /dev/null +++ b/lib/filter_for_local_jobs.js @@ -0,0 +1,14 @@ +module.exports = function (item, itemOptions, source) { + if (!item || !itemOptions) { + return; + } + + /* + return only: + item.description, item.title contains: ajax, asp, javascript, php, vmware, sql, classic + + */ + + // This plugin removes all items by returning -1 instead of the processed itemOptions + return itemOptions; +}; \ No newline at end of file diff --git a/lib/filter_glasgow.js b/lib/filter_glasgow.js new file mode 100644 index 0000000..c5217e0 --- /dev/null +++ b/lib/filter_glasgow.js @@ -0,0 +1,7 @@ +module.exports = function (item, itemOptions, source) { + if(itemOptions.description.indexOf('Glasgow') > 0 || itemOptions.description.indexOf('London') > 0) + + return itemOptions; + else + return -1; +}; diff --git a/lib/filter_last_week.js b/lib/filter_last_week.js new file mode 100644 index 0000000..b8bc871 --- /dev/null +++ b/lib/filter_last_week.js @@ -0,0 +1,18 @@ +module.exports = function (item, itemOptions, source) { + function inDays(d1, d2) { + var t2 = d2.getTime(); + var t1 = d1.getTime(); + + return parseInt((t2-t1)/(24*3600*1000)); + } + + var now = new Date(); + var then = new Date(itemOptions.date); + + var d = inDays(then,now); + + if (d <= 7) + return itemOptions; + else + return -1; +}; diff --git a/lib/filter_location.js b/lib/filter_location.js new file mode 100644 index 0000000..4fb25aa --- /dev/null +++ b/lib/filter_location.js @@ -0,0 +1,8 @@ +module.exports = function (item, itemOptions, source) { + const patt = /(glasgow|london|edinburgh|milton keynes)/ig; + const result = patt.test(itemOptions.description); + const resultB = patt.test(itemOptions.title); + console.log('Location:', (result || resultB === true) ? 'Pass' : 'Reject'); + + return (result || resultB === true) ? itemOptions : -1; +}; diff --git a/lib/filter_md_jobs.js b/lib/filter_md_jobs.js new file mode 100644 index 0000000..41195af --- /dev/null +++ b/lib/filter_md_jobs.js @@ -0,0 +1,16 @@ +module.exports = function (item) { + const patt = /(full\s?stack|front\s?end|html|html5|es6|react|knockout|ember|vue|riotjs|css|javascript|sql|node|backbone|git|gulp|jquery|express|£\dk|Data Warehouse Developer|iot|internet of things)\W/ig; + const result = patt.test(item.title); + const resultB = patt.test(item.summary); + + console.log('My Filter:', (result || resultB === true) ? 'Pass' : 'Reject'); + + if (!(result || resultB === true)) { + console.log('Result', result); + console.log('ResultB', resultB); + console.log(item); + } + + return (result || resultB === true) ; + +}; diff --git a/lib/filter_out_all_articles.js b/lib/filter_out_all_articles.js new file mode 100644 index 0000000..82b7da4 --- /dev/null +++ b/lib/filter_out_all_articles.js @@ -0,0 +1,8 @@ +module.exports = function (item, itemOptions, source) { + if (!item || !itemOptions) { + return; + } + + // This plugin removes all items by returning -1 instead of the processed itemOptions + return -1; +}; \ No newline at end of file diff --git a/lib/filter_reject.js b/lib/filter_reject.js new file mode 100644 index 0000000..9432348 --- /dev/null +++ b/lib/filter_reject.js @@ -0,0 +1,18 @@ +module.exports = function (item) { + const patt = /(Teachers?|Technical Writer|Data Analyst|WebLogic|WebSphere|Data Scientist|Change Manager|T24|Test Analyst|Insight Analyst|application tester|senior tester|Salesforce|QlikView|Navision|Murex|seo|django|drupal|SHAREPOINT|per annum|ServiceNow|Test Lead|User Researcher|Service Management|\(PERM\)|£\d.K|Remedy|ITSM|Symfony|Zend|Full Time|Technical Business Analyst|BUSINESS ANALYST|AUTOMATION TESTER|FIELD TECHNICIAN|websphere administrator|Research Data Scientist)/ig; + + const engineers = /(Support|Devops|Planning|security|Postgresql|network|sccm|test|data|imac|firewall|vmware)+(?:\s)(?=Engineer)/ig; + const developers = /(Java|PHP|Graduate|Access|Oracle ADF|SHAREPOINT|Ruby on Rails|Java Software|IOS|Qlikview|c#|c\+\+|\.net|bi|go lang)+(?:\s)(?=Developer)/ig; + const architects = /(Java|PHP|Microsoft)+(?:\s)(?=Architect)/ig; + + const antiAd = /sja\d+/gi; + + + const result = patt.test(item.summary) || engineers.test(item.summary) || developers.test(item.summary) || architects.test(item.summary); + const resultB = patt.test(item.title) || engineers.test(item.title) || developers.test(item.title) || architects.test(item.title); + const resultC = antiAd.test(item.id); + + console.log('Reject:', (result || resultB || resultC === true) ? 'Reject' : 'Pass'); + + return (!(result || resultB || resultC === true)); +}; diff --git a/lib/filter_show.js b/lib/filter_show.js new file mode 100644 index 0000000..6fdf38c --- /dev/null +++ b/lib/filter_show.js @@ -0,0 +1,6 @@ +module.exports = function (item, itemOptions, source) { + console.log('---'); + console.log(itemOptions.title); + console.log(itemOptions.permalink || itemOptions.url); + return itemOptions; +}; diff --git a/lib/filter_today_only.js b/lib/filter_today_only.js new file mode 100644 index 0000000..8cf890f --- /dev/null +++ b/lib/filter_today_only.js @@ -0,0 +1,20 @@ +module.exports = function (item, itemOptions, source) { + function inDays(d1, d2) { + var t2 = d2.getTime(); + var t1 = d1.getTime(); + + return parseInt((t2 - t1) / (24 * 3600 * 1000)); + } + + var now = new Date(); + var then = new Date(itemOptions.date); + + var d = inDays(then, now); + + console.log('Today:', (d === 0) ? 'Pass' : 'Reject'); + + if (d === 0) + return itemOptions; + else + return -1; +}; diff --git a/lib/scraper.js b/lib/scraper.js new file mode 100644 index 0000000..2d8d5f6 --- /dev/null +++ b/lib/scraper.js @@ -0,0 +1,165 @@ +/** + * Created by WebStorm. + * User: martin + * Date: 15/04/2020 + * Time: 11:55 + + */ + +const cheerio = require('cheerio'); + +const request = require('request'); +const axios = require('axios'); +const fecha = require('fecha'); + +const fs = require('fs'); + +const dbmanager = require('../lib/dbmanager'); + +const filterReject = require('../lib/filter_reject'); +const filterAccept = require('../lib/filter_md_jobs'); + +class MasterScraper { + + constructor() { + this.url = ''; + this.items = []; + this.currentPage = null; + this.hosturl = ''; + this.siteid = ''; + this.useStone = false; + this.requestOptions = { + 'url' : '', + 'proxy' : 'http://uk.proxymesh.com:31280', + 'tunnel' : true + }; + + } + + setStartUrl(newUrl) { + this.url = newUrl; + } + + loadPage(page) { + this.currentPage = page; + } + + getContent(url, useStone = false) { + // return new pending promise + return new Promise((resolve, reject) => { + // select http or https module, depending on reqested url + // const lib = url.startsWith('https') ? require('https') : require('http'); + const options = Object.assign({}, this.requestOptions); + if (useStone) + options.url = `http://45.33.114.116:8080/${encodeURIComponent(url)}`; + else + options.url = url; + + console.log(options); + + request(options, (err, _res, body) => { + if (!err) + resolve(body); + else + + reject(err); + }); + }); + }; + + async getPage() { + console.log('>> getPage: fetching', this.url); + const now = fecha.format(new Date(), 'YYYY-MM-DD--hhmmss'); + const filename = `${this.siteid}-${now}.html`; + + await this.getContent(this.url, this.useStone) + .then((html) => { + const $ = cheerio.load(html); + this.loadPage($); + }) + .catch((err) => console.error(err)); + + // console.log(response.status); + + /* if (response.status === 200) { + // console.log(response.status); + + try{ + console.log(`Saving ${__dirname}/../test/data/${this.siteid}/${filename}`); + await fs.writeFileSync(`${__dirname}/../test/data/${this.siteid}/${filename}`, response.data); + } + catch(err) { + console.error(err); + } + const $ = cheerio.load(response.data); + this.loadPage($); + }*/ + } + + async addToDB() { + for(const item of this.items) { + console.log(item); + + dbmanager.insertOne(item) + .then((data) => { + console.log(data); + }) + .catch((err) => { + console.error(err.message || 'Some error occurred while querying the database.'); + }); + } + } + + async filterAdverts() { + console.log('>> FilterAdverts'); + console.log(`Currently ${this.items.length} items...`); + + this.items = this.items.filter(filterReject); + + console.log(`After reject ${this.items.length} items...`); + + this.items = this.items.filter(filterAccept); + + console.log(`After accept ${this.items.length} items...`); + } + + makeUrl(appended) { + return `https://${ this.siteurl }${appended}`; + } + + makeProxyUrl(appended) { + return `https://${ this.siteurl }${appended}`; + } + // Site specific parts below here + + async breakPage() { + + } + + async extractDetails(part) { + + } + + async checkNext() { + + } + + async processSite() { + + } + + async getIndividualPage() { + + } + + async getJobPages() { + + } + + async go() { + + } + +} + +module.exports = MasterScraper; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a16279f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2763 @@ +{ + "name": "jobscraper", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "@types/node": { + "version": "13.11.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.1.tgz", + "integrity": "sha512-eWQGP3qtxwL8FGneRrC5DwrJLGN4/dH1clNTuLfN81HCrxVtxRjygDTUoZJ5ASlDEeo0ppYFQjQIlXhtXpOn6g==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==" + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "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" + } + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "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==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "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==", + "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" + } + }, + "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==" + }, + "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==", + "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==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "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=" + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "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=" + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + }, + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "requires": { + "follow-redirects": "1.5.10" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "bowser": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.9.0.tgz", + "integrity": "sha512-2ld76tuLBNFekRgmJfT2+3j5MIrP6bFict8WAIT3beq+srz1gcKNAdNKMqHqauQt63NmAa88HfP1/Ypa9Er3HA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "cheerio": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", + "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.1", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" + }, + "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=" + }, + "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==", + "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=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "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=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "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==" + } + } + }, + "content-security-policy-builder": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz", + "integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ==", + "dev": true + }, + "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==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "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=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cron": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/cron/-/cron-1.8.2.tgz", + "integrity": "sha512-Gk2c4y6xKEO8FSAUTklqtfSr7oTq0CiPQeLBG5Fl0qoXpZyMcj1SG59YL+hqq04bu6/IuEA7lMkYDAplQNKkyg==", + "requires": { + "moment-timezone": "^0.5.x" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dasherize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", + "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "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==" + }, + "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=" + }, + "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==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "dns-prefetch-control": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.2.0.tgz", + "integrity": "sha512-hvSnros73+qyZXhHFjx2CMLwoj3Fe7eR9EJsFsqmcI1bB2OBWL/+0YzaEaKssCHnj/6crawNnUyw74Gm2EKe+Q==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dont-sniff-mimetype": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz", + "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==", + "dev": true + }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, + "dotignore": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", + "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "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=" + }, + "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==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "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==", + "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=" + }, + "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=" + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "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", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.0.tgz", + "integrity": "sha512-/5qB+Mb0m2bh86tjGbA8pB0qBfdmCIK6ZNPjcw4/TtEH0+tTf0wLA5HK4KMTweSMwLGHwBDWCBV+6+2+EuHmgg==", + "requires": { + "estraverse": "^5.0.0" + }, + "dependencies": { + "estraverse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz", + "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==" + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "expect-ct": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.2.0.tgz", + "integrity": "sha512-6SK3MG/Bbhm8MsgyJAylg+ucIOU71/FzyFalcfu5nY19dH8y/z0tBJU0wrNBXD4B27EoQtqPF/9wqH0iYAd04g==", + "dev": true + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "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==" + } + } + }, + "express-session": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.1.tgz", + "integrity": "sha512-UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q==", + "dev": true, + "requires": { + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.0", + "uid-safe": "~2.1.5" + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "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==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "feature-policy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", + "integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ==", + "dev": true + }, + "fecha": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", + "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==" + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "requires": { + "flat-cache": "^2.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "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==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "frameguard": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.1.0.tgz", + "integrity": "sha512-TxgSKM+7LTA6sidjOiSZK9wxY0ffMPY3Wta//MqwmX0nZuEHc8QrkV8Fh3ZhMJeiH+Uyh/tcaarImRy8u77O7g==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "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=" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "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=" + }, + "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=", + "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=", + "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=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "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==", + "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==", + "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==", + "requires": { + "type-fest": "^0.8.1" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "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==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "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==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "helmet": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.22.0.tgz", + "integrity": "sha512-Xrqicn2nm1ZIUxP3YGuTBmbDL04neKsIT583Sjh0FkiwKDXYCMUqGqC88w3NUvVXtA75JyR2Jn6jw6ZEMOD+ZA==", + "dev": true, + "requires": { + "depd": "2.0.0", + "dns-prefetch-control": "0.2.0", + "dont-sniff-mimetype": "1.1.0", + "expect-ct": "0.2.0", + "feature-policy": "0.3.0", + "frameguard": "3.1.0", + "helmet-crossdomain": "0.4.0", + "helmet-csp": "2.10.0", + "hide-powered-by": "1.1.0", + "hpkp": "2.0.0", + "hsts": "2.2.0", + "ienoopen": "1.1.0", + "nocache": "2.1.0", + "referrer-policy": "1.2.0", + "x-xss-protection": "1.3.0" + }, + "dependencies": { + "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 + } + } + }, + "helmet-crossdomain": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz", + "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA==", + "dev": true + }, + "helmet-csp": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.10.0.tgz", + "integrity": "sha512-Rz953ZNEFk8sT2XvewXkYN0Ho4GEZdjAZy4stjiEQV3eN7GDxg1QKmYggH7otDyIA7uGA6XnUMVSgeJwbR5X+w==", + "dev": true, + "requires": { + "bowser": "2.9.0", + "camelize": "1.0.0", + "content-security-policy-builder": "2.1.0", + "dasherize": "2.0.0" + } + }, + "hide-powered-by": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz", + "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg==", + "dev": true + }, + "hpkp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", + "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=", + "dev": true + }, + "hsts": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz", + "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==", + "dev": true, + "requires": { + "depd": "2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ienoopen": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.1.0.tgz", + "integrity": "sha512-MFs36e/ca6ohEKtinTJ5VvAJ6oDRAYFdYXweUnGY9L9vcoqFOU4n2ZhmJ0C4z/cwGZ3YIQRSB3XZ1+ghZkY5NQ==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "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=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "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==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + }, + "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==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "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==" + }, + "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==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "requires": { + "has": "^1.0.3" + } + }, + "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==", + "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=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "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=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "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==" + }, + "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=" + }, + "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=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "requires": { + "mime-db": "1.43.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "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==" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.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==", + "requires": { + "minimist": "^1.2.5" + } + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "moment-timezone": { + "version": "0.5.28", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.28.tgz", + "integrity": "sha512-TDJkZvAyKIVWg5EtVqRzU97w0Rb0YVbfpqyjgu6GwXCAohVRqwZjf4fOzDE6p1Ch98Sro/8hQQi65WDXW5STPw==", + "requires": { + "moment": ">= 2.9.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "needle": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.1.tgz", + "integrity": "sha512-x/gi6ijr4B7fwl6WYL9FwlCvRQKGlUNvnceho8wxkwXqN8jvVmmmATTmZPRRG7b/yC1eode26C2HO9jl78Du9g==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "nocache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", + "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==", + "dev": true + }, + "node-pre-gyp": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", + "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.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=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" + }, + "object-is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "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=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "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=" + }, + "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=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "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==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "requires": { + "@types/node": "*" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "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=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "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==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "present": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/present/-/present-1.0.0.tgz", + "integrity": "sha1-bS+GW+epaIURj0Zg6D4hYftxzys=" + }, + "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==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", + "dev": true + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + } + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "referrer-policy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz", + "integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "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" + } + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "requires": { + "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==" + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "resumer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", + "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", + "requires": { + "through": "~2.3.4" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + }, + "rss-parser": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.7.6.tgz", + "integrity": "sha512-wWWh3/pPLAPgWyfkCC9jB83jSBenU6VPMymfXiysi8wJxaN7KNkW4vU3Jm8jQxExAribFvXREy+RtaL3XQubeA==", + "requires": { + "entities": "^1.1.1", + "xml2js": "^0.4.19" + } + }, + "run-async": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", + "requires": { + "is-promise": "^2.1.0" + } + }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "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=" + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sqlite3": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.1.1.tgz", + "integrity": "sha512-CvT5XY+MWnn0HkbwVKJAyWEMfzpAPwnTiB3TobA5Mri44SrTovmmh499NPQP+gatkeOipqPlBLel7rn4E/PCQg==", + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.11.0", + "request": "^2.87.0" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "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=" + }, + "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==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string.prototype.trim": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz", + "integrity": "sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.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==", + "requires": { + "ansi-regex": "^4.1.0" + }, + "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==" + } + } + }, + "strip-json-comments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "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=" + }, + "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==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "tape": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.2.tgz", + "integrity": "sha512-waWwC/OqYVE9TS6r1IynlP2sEdk4Lfo6jazlgkuNkPTHIbuG2BTABIaKdlQWwPeB6Oo4ksZ1j33Yt0NTOAlYMQ==", + "requires": { + "deep-equal": "~1.1.1", + "defined": "~1.0.0", + "dotignore": "~0.1.2", + "for-each": "~0.3.3", + "function-bind": "~1.1.1", + "glob": "~7.1.6", + "has": "~1.0.3", + "inherits": "~2.0.4", + "is-regex": "~1.0.5", + "minimist": "~1.2.0", + "object-inspect": "~1.7.0", + "resolve": "~1.15.1", + "resumer": "~0.0.0", + "string.prototype.trim": "~1.2.1", + "through": "~2.3.8" + } + }, + "tape-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tape-promise/-/tape-promise-4.0.0.tgz", + "integrity": "sha512-mNi5yhWAKDuNgZCfFKeZbsXvraVOf+I8UZG+lf+aoRrzX4+jd4mpNBjYh16/VcpEMUtS0iFndBgnfxxZbtyLFw==", + "requires": { + "is-promise": "^2.1.0", + "onetime": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + } + } + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "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==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "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=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "dev": true, + "requires": { + "random-bytes": "~1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "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=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "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=" + }, + "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=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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=", + "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==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "requires": { + "mkdirp": "^0.5.1" + } + }, + "x-xss-protection": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz", + "integrity": "sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg==", + "dev": true + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9644689 --- /dev/null +++ b/package.json @@ -0,0 +1,31 @@ +{ + "name": "jobscraper", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "grabber": "node grabber.js" + }, + "author": "", + "license": "ISC", + "dependencies": { + "axios": "^0.19.2", + "body-parser": "^1.19.0", + "cheerio": "^1.0.0-rc.3", + "cron": "^1.8.2", + "dotenv": "^8.2.0", + "eslint": "^6.8.0", + "express": "^4.17.1", + "fecha": "^4.2.0", + "present": "^1.0.0", + "rss-parser": "^3.7.6", + "sqlite3": "^4.1.1", + "tape": "^4.13.2", + "tape-promise": "^4.0.0" + }, + "devDependencies": { + "cors": "^2.8.5", + "express-session": "^1.17.1", + "helmet": "^3.22.0" + } +} diff --git a/scrapers/indeed.js b/scrapers/indeed.js new file mode 100644 index 0000000..abd4a17 --- /dev/null +++ b/scrapers/indeed.js @@ -0,0 +1,150 @@ +/** + * Created by WebStorm. + * User: martin + * Date: 15/04/2020 + * Time: 11:55 + + */ + +const cheerio = require('cheerio'); + +const MasterScraper = require('../lib/scraper'); + +class IndeedScraper extends MasterScraper { + + constructor() { + super(); + this.siteurl = 'www.indeed.co.uk'; + this.siteid = 'indeed'; + this.useStone = true; + this.requestOptions = { + 'url' : '' + }; + + this.antiAd = /sja\d+/gi; + } + + // Site specific parts below here + + async breakPage() { + const $ = this.currentPage; + const ads = []; + + const sections = $('div.row.result'); + + await sections.each(async (index, item) => { + // console.log($(item).html()); + const ad = await this.extractDetails(item); + + if (ad !== null) + ads.push(ad); + + console.log(ads); +// console.log('<<<<<<<<<>>>>>>>>>'); + }); + + this.items = [...this.items, ...ads]; + } + + async extractDetails(part) { + const newObj = {}; + const $part = cheerio.load(part); + // console.log($part.html()); + const now = ~~(new Date().getTime() / 1000.0); + + + newObj.title = $part('.jobtitle').text().trim(); + newObj.site = this.siteid; + // newObj.url = `https://${ this.siteurl }${$part('.jobtitle').attr('href')}`; + newObj.url = this.makeUrl($part('.jobtitle').attr('href')); + newObj.id = $part('h2.title a').attr('id').trim(); + newObj.summary = $part('.summary').text().trim(); + + newObj.company = $part('.company').text().trim() || null; + + newObj.location = $part('.location').text().trim(); + + newObj.postDate = $part('.date').text().trim(); + + newObj.salary = $part('.salary.no-wrap').text().trim(); + + newObj.isEasyApply = $part('.iaLabel').text().trim() === 'Easily apply'; + newObj.timestamp = now; + + return newObj; + } + + async getIndividualPage(item) { + const newItem = {...item}; + console.log('Getting', item.url); + await this.getContent(item.url) + .then((html) => { + const $ = cheerio.load(html); + newItem.summary = $('#jobDescriptionText').text().trim(); + + }) + .catch((err) => console.error(err)); + return newItem; + } + + async getJobPages() { + const newItems = []; + for (let item of this.items) { + item = await this.getIndividualPage(item); + newItems.push(item); + } + + this.items = [...newItems]; + } + + async checkNext() { + const $ = this.currentPage; + const next = $('.pagination > *:last-child').attr('href') || ''; + if (next !== '') + // next = `https://${ this.siteurl }${next}`; + this.makeUrl(next); + + console.log(next); + } + + async processSite() { + console.log('Processing...'); + + let nextPage; + const previousPage = ''; + // do { + // previousPage = this.url; + this.items = []; + await this.getPage(); + + await this.breakPage(); + + await this.checkNext(); + + await this.getJobPages(); + + // nextPage = await this.checkNext(); + + // if (nextPage === previousPage) nextPage = ''; + + // this.setStartUrl(nextPage); + // }while (nextPage !== ''); + + await this.filterAdverts(); + + await this.addToDB(); + } + + async go(location = 'london') { + this.setStartUrl(`https://www.indeed.co.uk/jobs?as_and=&as_phr=&as_any=Html+Web+Sql+Delphi+Vb+Vbscript+Php+Ajax+Mysql+Sqlserver+Javascript+Nodejs+vuejs+sveltejs&as_not=React&as_ttl=&as_cmp=&jt=contract&st=&as_src=&salary=&radius=0&l=${encodeURIComponent(location)}&fromage=1&limit=50&sort=&psf=advsrch&from=advancedsearch`); + // this.setStartUrl('https://www.indeed.co.uk/jobs?as_and=&as_phr=&as_any=javascript+nodejs&as_not=&as_ttl=&as_cmp=&jt=contract&st=&as_src=&salary=&radius=25&l=london&fromage=7&limit=10&sort=date&psf=advsrch&from=advancedsearch'); + + // Glasgow + // https://www.indeed.co.uk/jobs?as_and=&as_phr=&as_any=Html+Web+Sql+Delphi+Vb+Vbscript+Php+Ajax+Mysql+Sqlserver+Javascript+Nodejs+vuejs+sveltejs&as_not=React&as_ttl=&as_cmp=&jt=contract&st=&as_src=&salary=&radius=0&l=glasgow&fromage=1&limit=50&sort=&psf=advsrch&from=advancedsearch + + await this.processSite(); + } + +} + +module.exports = IndeedScraper; diff --git a/scrapers/indeed.orig.js b/scrapers/indeed.orig.js new file mode 100644 index 0000000..2ce5630 --- /dev/null +++ b/scrapers/indeed.orig.js @@ -0,0 +1,184 @@ +/** + * Created by WebStorm. + * User: martin + * Date: 15/04/2020 + * Time: 11:55 + + */ + +const cheerio = require('cheerio'); + +const axios = require('axios'); +const fecha = require('fecha'); + +const fs = require('fs'); + +const dbmanager = require('../lib/dbmanager'); + +const filterReject = require('../lib/filter_reject'); +const filterAccept = require('../lib/filter_md_jobs'); + +class IndeedScraper { + + constructor() { + this.url = ''; + this.items = []; + this.currentPage = null; + this.host = 'www.indeed.co.uk'; + + // this.setStartUrl('https://www.indeed.co.uk/jobs?as_and=&as_phr=&as_any=javascript+node&as_not=&as_ttl=&as_cmp=&jt=contract&st=&as_src=&salary=&radius=25&l=london&fromage=1&limit=50&sort=date&psf=advsrch&from=advancedsearch'); + } + + setStartUrl(newUrl) { + this.url = newUrl; + } + + loadPage(page) { + this.currentPage = page; + } + + async getPage() { + console.log('>> getPage: fetching', this.url); + const now = fecha.format(new Date(), 'YYYY-MM-DD--hhmmss'); + const filename = `indeed-${now}.html`; + const response = await axios.get(this.url).catch((err) => { + console.error(err); + }); + + console.log(response.status); + + if (response.status === 200) { + console.log(response); + + /* try{ + fs.writeFileSync(`../test/data/indeed/${filename}`, response.data); + } + catch(err) { + console.error(err); + }*/ + const $ = cheerio.load(response.data); + this.loadPage($); + } + } + + async addToDB() { + for(const item of this.items) { + console.log(item); + + dbmanager.insertOne(item) + .then((data) => { + console.log(data); + }) + .catch((err) => { + console.error(err.message || 'Some error occurred while querying the database.'); + }); + } + } + + async filterAdverts() { + console.log('>> FilterAdverts'); + console.log(`Currently ${this.items.length} items...`); + + this.items = this.items.filter(filterReject); + + console.log(`After reject ${this.items.length} items...`); + + this.items = this.items.filter(filterAccept); + + console.log(`After accept ${this.items.length} items...`); + } + + // Site specific parts below here + + async breakPage() { + const $ = this.currentPage; + const ads = []; + + const sections = $('div.row.result'); + + await sections.each(async (index, item) => { + // console.log($(item).html()); + const ad = await this.extractDetails(item); + ads.push(ad); + // console.log('<<<<<<<<<>>>>>>>>>'); + }); + + this.items = [...this.items, ...ads]; + } + + async extractDetails(part) { + const newObj = {}; + const $part = cheerio.load(part); + const now = ~~(new Date().getTime() / 1000.0); + + newObj.title = $part('.jobtitle') + .text() + .trim(); + newObj.site = 'indeed'; + newObj.url = `https://${ this.host }${$part('.jobtitle').attr('href')}`; + newObj.id = $part('h2.title a').attr('id').trim(); + newObj.summary = $part('.summary').text().trim(); + + newObj.company = $part('.company').text().trim() || null; + + newObj.location = $part('.location').text().trim(); + + newObj.postDate = $part('.date').text().trim(); + + newObj.salary = $part('.salary.no-wrap').text().trim(); + + newObj.isEasyApply = $part('.iaLabel').text().trim() === 'Easily apply'; + newObj.timestamp = now; + + // console.log(newObj); + return newObj; + } + + async checkNext() { + const $ = this.currentPage; + let next = $('.pagination > *:last-child').attr('href') || ''; + if (next !== '') + next = `https://${ this.host }${next}`; + + console.log(next); + } + + async processSite() { + console.log('Processing...'); + + let nextPage; + let previousPage = ''; + // do { + previousPage = this.url; + await this.getPage(); + + await this.breakPage(); + + await this.checkNext(); + + nextPage = await this.checkNext(); + + // if (nextPage === previousPage) nextPage = ''; + + // this.setStartUrl(nextPage); + // }while (nextPage !== ''); + + await this.filterAdverts(); + + await this.addToDB(); + } + + async go() { + this.setStartUrl('https://www.indeed.co.uk/jobs?as_and=&as_phr=&as_any=javascript+node&as_not=&as_ttl=&as_cmp=&jt=contract&st=&as_src=&salary=&radius=25&l=london&fromage=1&limit=50&sort=date&psf=advsrch&from=advancedsearch'); + // this.setStartUrl('https://www.indeed.co.uk/jobs?as_and=&as_phr=&as_any=javascript+node&as_not=&as_ttl=&as_cmp=&jt=contract&st=&as_src=&salary=&radius=25&l=london&fromage=7&limit=10&sort=date&psf=advsrch&from=advancedsearch'); + + await this.processSite(); + } + +} + +const ind = new IndeedScraper(); + +ind.go(); + +module.exports = IndeedScraper; diff --git a/scrapers/jobserve.js b/scrapers/jobserve.js new file mode 100644 index 0000000..f84d1d6 --- /dev/null +++ b/scrapers/jobserve.js @@ -0,0 +1,87 @@ +/** + * Created by WebStorm. + * User: martin + * Date: 16/04/2020 + * Time: 16:46 + + */ + +const Parser = require('rss-parser'); + +class MasterReader { + constructor() { + this.url = ''; + this.items = []; + this.feeditems = []; + this.currentPage = null; + this.hosturl = ''; + this.siteid = ''; + this.requestOptions = { + 'url' : '', + 'proxy' : 'http://uk.proxymesh.com:31280', + 'tunnel' : true + }; + } + + getContent(url) { + // return new pending promise + return new Promise((resolve, reject) => { + // select http or https module, depending on reqested url + // const lib = url.startsWith('https') ? require('https') : require('http'); + const options = Object.assign({}, this.requestOptions); + console.log(options); + options.url = url; + + console.log(options); + + request(options, (err, _res, body) => { + if (!err) + resolve(body); + else + + reject(err); + }); + }); + }; + + setFeed(newUrl) { + this.url = newUrl; + } + + async getFeed() { + console.log('>> getFeed: fetching', this.url); + + const parser = new Parser(); + const feed = await parser.parseURL(this.url); + + + console.log(feed); + + this.feeditems = [...feed.items]; + + } + +} + +class JobserveReader extends MasterReader { + constructor(props) { + super(props); + this.hosturl = 'https://jobserve.com'; + this.siteid = 'jobserve'; + } + + async processFeed() { + await this.getFeed(); + if (this.feeditems.length > 0) { + + } else { + console.log('Nothing to process'); + } + } +} + +const jobServeReader = new JobserveReader(); + +jobServeReader.setFeed('https://www.jobserve.com/MySearch/846CDA8658FF93A3.rss'); + +jobServeReader.processFeed(); diff --git a/scrapers/totaljobs.js b/scrapers/totaljobs.js new file mode 100644 index 0000000..eda621b --- /dev/null +++ b/scrapers/totaljobs.js @@ -0,0 +1,138 @@ +/** + * Created by WebStorm. + * User: martin + * Date: 15/04/2020 + * Time: 11:55 + + */ + +const cheerio = require('cheerio'); + +const MasterScraper = require('../lib/scraper'); + +class TotaljobsScraper extends MasterScraper { + + constructor() { + super(); + this.siteurl = 'www.totaljobs.com'; + this.siteid = 'totaljobs'; + this.requestOptions = { + 'url' : '' + }; + } + + // Site specific parts below here + + async breakPage() { + const $ = this.currentPage; + const ads = []; + + const sections = $('div.job'); + + await sections.each(async (index, item) => { + // console.log($(item).html()); + const ad = await this.extractDetails(item); + ads.push(ad); + // console.log('<<<<<<<<<>>>>>>>>>'); + }); + + this.items = [...this.items, ...ads]; + } + + async extractDetails(part) { + const newObj = {}; + const $part = cheerio.load(part); + const now = ~~(new Date().getTime() / 1000.0); + + // console.log($part.html()); + newObj.title = $part('.job-title').text().trim(); + newObj.url = $part('.job-title a').attr('href'); + newObj.id = $part('div.job').attr('id').trim(); + newObj.summary = $part('p.job-intro').text().trim(); + newObj.company = $part('.company').text().trim() || null; + newObj.location = $part('.location > span').text().trim(); + newObj.postDate = $part('.date-posted').text().trim(); + newObj.salary = $part('.salary').text().trim(); + newObj.isEasyApply = false; + + newObj.site = this.siteid; + newObj.timestamp = now; + + return newObj; + } + + async getIndividualPage(item) { + const newItem = {...item}; + console.log('Getting', item.url); + await this.getContent(item.url) + .then((html) => { + console.log(html); + const $ = cheerio.load(html); + newItem.summary = $('div.job-description').text().trim(); + + }) + .catch((err) => console.error(err)); + return newItem; + } + + async getJobPages() { + const newItems = []; + for (let item of this.items) { + console.log(item.title); + item = await this.getIndividualPage(item); + newItems.push(item); + } + + this.items = [...newItems]; + } + + async checkNext() { + const $ = this.currentPage; + const next = $('.pagination > *:last-child').attr('href') || ''; + if (next !== '') + // next = `https://${ this.siteurl }${next}`; + this.makeUrl(next); + + console.log(next); + } + + async processSite() { + console.log('Processing...'); + + let nextPage; + const previousPage = ''; + // do { + // previousPage = this.url; + this.items = []; + await this.getPage(); + + await this.breakPage(); + + await this.checkNext(); + + // await this.getJobPages(); + // nextPage = await this.checkNext(); + + // if (nextPage === previousPage) nextPage = ''; + + // this.setStartUrl(nextPage); + // }while (nextPage !== ''); + + await this.filterAdverts(); + + await this.addToDB(); + } + + async go(location = 'london') { + this.setStartUrl(`https://www.totaljobs.com/jobs/contract/html-or-vue-or-vuejs-or-web-or-sql-or-delphi-or-vb-or-vbscript-or-php-or-ajax-or-mysql-or-sqlserver-or-javascript-or-node-or-nodejs-or-svelte-or-sveltejs-not-react/in-${encodeURIComponent(location)}?q=Html+Or+Vue+Or+Vuejs+Or+Web+Or+Sql+Or+Delphi+Or+Vb+Or+Vbscript+Or+Php+Or+Ajax+Or+Mysql+Or+Sqlserver+Or+Javascript+Or+Node+Or+Nodejs+Or+Svelte+Or+Sveltejs+NOT+React&postedwithin=3&radius=20`); + // this.setStartUrl('https://www.indeed.co.uk/jobs?as_and=&as_phr=&as_any=javascript+nodejs&as_not=&as_ttl=&as_cmp=&jt=contract&st=&as_src=&salary=&radius=25&l=london&fromage=7&limit=10&sort=date&psf=advsrch&from=advancedsearch'); + + // Glasgow + // https://www.indeed.co.uk/jobs?as_and=&as_phr=&as_any=Html+Web+Sql+Delphi+Vb+Vbscript+Php+Ajax+Mysql+Sqlserver+Javascript+Nodejs+vuejs+sveltejs&as_not=React&as_ttl=&as_cmp=&jt=contract&st=&as_src=&salary=&radius=0&l=glasgow&fromage=1&limit=50&sort=&psf=advsrch&from=advancedsearch + + await this.processSite(); + } + +} + +module.exports = TotaljobsScraper; diff --git a/server/controllers/jobs.controller.js b/server/controllers/jobs.controller.js new file mode 100644 index 0000000..6048078 --- /dev/null +++ b/server/controllers/jobs.controller.js @@ -0,0 +1,62 @@ +/** + * Created by WebStorm. + * User: martin + * Date: 18/05/2020 + * Time: 13:39 + + */ +const dbmanager = require('../../lib/dbmanager'); + +const killNLDoubleSpace = /(\\n)\s{2,}|(\\n)|\s{2,}/g; + +exports.getList = (req, res) => { + console.log('>getList req', req.params); + + /* if(!req.params.id) + return res.status(400).send({ + 'message': 'Job id missing' + });*/ + + dbmanager.getList() + .then((data) => { + const processed = data.map((item) => { + const date = new Date( item.timestamp * 1000); + item.date = date.toLocaleString(); + item.title = item.title.replace(killNLDoubleSpace, ' '); + + return item; + }); + res.send(processed); + }) + .catch((err) => { + res.status(500).send({ + 'message': err.message || 'Some error occurred while querying the database.' + }); + }); +}; + +exports.getJob = (req, res) => { + console.log('>getJob req', req.params); + + if(!req.params.id) + return res.status(500).send({ + 'message': 'Job id missing' + }); + + const id = req.params.id; + + dbmanager.getOne(id) + .then((data) => { + const item = Object.assign({}, data); + const date = new Date( item.timestamp * 1000); + item.date = date.toLocaleString(); + item.title = item.title.replace(killNLDoubleSpace, ' '); + + res.send(item); + }) + .catch((err) => { + res.status(500).send({ + 'message': err.message || 'Some error occurred while querying the database.' + }); + }); +}; diff --git a/server/routes/jobs.route.js b/server/routes/jobs.route.js new file mode 100644 index 0000000..112d63a --- /dev/null +++ b/server/routes/jobs.route.js @@ -0,0 +1,17 @@ +/** + * Created by WebStorm. + * User: martin + * Date: 18/05/2020 + * Time: 13:39 + + */ + +const jobs = require('../controllers/jobs.controller'); + +module.exports = (app) => { + app.route('/jobs') + .get(jobs.getList); + + app.route('/jobs/:id') + .get(jobs.getJob); +}; diff --git a/server/server.js b/server/server.js new file mode 100644 index 0000000..3cddef6 --- /dev/null +++ b/server/server.js @@ -0,0 +1,49 @@ +/** + * Created by WebStorm. + * User: martin + * Date: 14/05/2020 + * Time: 09:13 + + */ +require('dotenv').config(); +const express = require('express'); +const bodyParser = require('body-parser'); +const session = require('express-session'); +const path = require('path'); +const helmet = require('helmet'); +const cors = require('cors'); + +const app = express(); +require('dotenv').config(); + +const serverPort = process.env.PORT || 3000; + +const sitePath = '../live'; + +//app.use(cors()); +//app.use(helmet()); + +app.use(session({ + 'secret': 'Z4hc5.64X1e', + 'resave': true, + 'saveUninitialized': true +})); + +app.use(express.static(path.join(__dirname, sitePath))); + +// parse requests of content-type - application/x-www-form-urlencoded +app.use(bodyParser.urlencoded({ 'extended': true })); + +// parse requests of content-type - application/json +app.use(bodyParser.json()); + +require('./routes/jobs.route')(app); + +app.listen(serverPort, () => { + console.log(`Server is listening on port ${serverPort}`); +}); + +((() => { + console.log('Job Server started'); + // doJob(); +})()); diff --git a/test/data/indeed/indeed-2020-04-16--013308.html b/test/data/indeed/indeed-2020-04-16--013308.html new file mode 100644 index 0000000..cdbec90 --- /dev/null +++ b/test/data/indeed/indeed-2020-04-16--013308.html @@ -0,0 +1,1931 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +HTML Web SQL Delphi VB Vbscript PHP AJAX MySQL Sqlserver Javascript Nodejs Vuejs Sveltejs Jobs in London - April 2020 | Indeed.co.uk + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+
+
+ + +
+ + +
+ Upload your CV and easily apply to jobs from any device!

+ Html Web Sql Delphi Vb Vbscript Php Ajax Mysql Sqlserver Javascript Nodejs vuejs sveltejs jobs in London

+
+Sort by: +relevance - +date +
+
+
+ Page 1 of 15 jobs
+ +
+
+
+ + +
+ +

+ +C# SQL Developer - Fixed Income + +

+ +
+
+ +Harrington Starr + +
+ + +London +
+ +
+ + +£400 - £700 a day + +
+
+
    +
  • Buy and sell side trading systems.
  • +
+ + + + +
+ +
+ +
+ +

+ +SAP CONSULTANT (BW / REPORTING DEVELOPER / CONSULTANT) + +

+ +
+ + + +London +
+ +
+
    +
  • The BW consultant will work on a quick win project to extract, transform to a common standard and load data into a SAP BW warehouse for reporting.
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ +Freelance Digital Designer + +

+ +
+
+ +Source + +
+ + +London +
+ +
+ + +£200 - £350 a day + +
+
Easily apply to this job
+
    +
  • We are currently working with a huge spectrum of clients from Advertising Agencies, big global networks, media clients, independent design studios and huge…
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ +Freelance Interactive Designer + +

+ +
+
+ +Source + +
+ + +London +
+ +
+ + +£300 - £450 a day + +
+
Easily apply to this job
+
    +
  • We are currently working with a huge spectrum of clients from Experience Agencies, to big global networks, independent design studios and huge client side…
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ +Interaction Designer (Outside IR35) + +

+ +
+ + + +London +
+ +
Easily apply to this job
+
    +
  • Deliver finished designs that meet web standards, ensuring that key elements for government such as accessibility are built into designs from the outset.
  • +
+ + + + +
+ +
+ +
+ +

+ +Social Media Insights & Research Analyst - 3 month contract + +

+ +
+
+ +The Social Element + +
+ + +London +
+ +
Easily apply to this job
+
    +
  • We have a fantastic opportunity for a Senior Social Media Insights and Research expert for a 3 month fixed term contract.
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ +Scala & Spark Software Developer - AWS experience + +

+ +
+ + + +London +
+ +
+ + +£500 - £550 a day + +
+
+
    +
  • A leading Travel Company based in London are seeking a Software Developer to join their team on a 6 month contract.
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ +C# SQL Risk and Pricing Developer - Contract + +

+ +
+
+ +Harrington Starr + +
+ + +London +
+ +
+ + +£450 - £650 a day + +
+
+
    +
  • Buy and sell side trading systems.
  • +
  • Harrington Starr is currently working with a major fund based in London who are looking to add a strong technical software…
  • +
+ + + + +
+ +
+ +
+ +

+ +Digital Producer (Contract) + +

+ +
+
+ +DAC Group + +
+ + +London +
+ +
Easily apply to this job
+
    +
  • Experience with the development of small to large scale websites and a strong understanding of associated web development technologies and platforms.
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ +Freelance Interactive Designer + +

+ +
+
+ +Source LF + +
+ + +London +
+ +
+ + +£300 - £450 a day + +
+
Easily apply to this job
+
    +
  • We are currently working with a huge spectrum of clients from Experience Agencies, to big global networks, independent design studios and huge client side…
  • +
+ + + + +
+ +
+ +
+ +

+ +Freelance Digital Designer + +

+ +
+
+ +Source LF + +
+ + +London +
+ +
+ + +£200 - £350 a day + +
+
Easily apply to this job
+
    +
  • We are currently working with a huge spectrum of clients from Advertising Agencies, big global networks, media clients, independent design studios and huge…
  • +
+ + + + +
+ +
+ +
+ +

+ +C# .NetCore AWS Developer + +

+ +
+
+ +Harrington Starr + +
+ + +London +
+ +
+ + +£500 - £800 a day + +
+
+
    +
  • Buy and sell side trading systems.
  • +
  • Net Core, Elastic Search, Microservices, RabbitMQ, AWS (EC2, S3, DynamoDB, SNS) SQL, WebAPI, REST, Git, Angular.
  • +
+ + + + +
+ +
+ +
+ +

+ +C# Developer - Asset Management - Contract + +

+ +
+
+ +Harrington Starr + +
+ + +London +
+ +
+ + +£400 - £800 a day + +
+
+
    +
  • The core systems include trade and risk databases, time series databases, core C# libraries, links to external data providers (via ftp/web services/APIs), front…
  • +
+ + + + +
+ +
+ +
+ +

+ +C#, .Net Core, AWS Elastic Search - Contract £600-£800 + +

+ +
+
+ +Harrington Starr + +
+ + +London +
+ +
+ + +£500 - £800 a day + +
+
+
    +
  • Net Core, Elastic Search, Microservices, RabbitMQ, AWS (EC2, S3, DynamoDB, SNS) SQL, WebAPI, REST, Git, Angular.
  • +
  • Solid database experience with SQL and T-SQL.
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ +Senior Python Engineer, Developer, Programmer, Python, AWS,... + +

+ +
+
+ +Cornwaliis Elt + +
+ + +London +
+ +
+ + +£650 - £800 a day + +
+
+
    +
  • This position will be communicating directly with the business and as such, knowledge of front office environments, particularly Fixed Income, is highly desired…
  • +
+ + + + +
+ +
+ +
+ » + Post your CV - It only takes a few seconds
+ +
+ + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + diff --git a/test/data/indeed/indeed-2020-04-16--092311.html b/test/data/indeed/indeed-2020-04-16--092311.html new file mode 100644 index 0000000..19a0121 --- /dev/null +++ b/test/data/indeed/indeed-2020-04-16--092311.html @@ -0,0 +1,1984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Javascript Node Jobs in London - April 2020 | Indeed.co.uk + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+
+
+ + +
+ + +
+ Upload your CV and easily apply to jobs from any device!

+ javascript node jobs in London

+
+Sort by: +relevance - date +
+
+
+ Page 1 of 29 jobs
+ +
+
+
+ + +
+ +

+ +Freelance Digital Designer + +

+ +
+
+ +Source + +
+ + +London +
+ +
+ + +£200 - £350 a day + +
+
Easily apply to this job
+
    +
  • We are currently working with a huge spectrum of clients from Advertising Agencies, big global networks, media clients, independent design studios and huge…
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ +Freelance Interactive Designer + +

+ +
+
+ +Source + +
+ + +London +
+ +
+ + +£300 - £450 a day + +
+
Easily apply to this job
+
    +
  • We are currently working with a huge spectrum of clients from Experience Agencies, to big global networks, independent design studios and huge client side…
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ +TECHNICAL WRITER + +

+ +
+
+ +Intec Select + +
+ + +London +
+ +
+ + +£280 a week + +
+
+
    +
  • Technical Writer – 11 month contract – £280 per day.
  • +
  • Support a creative tool for augmented reality experiences across our clients family of products.
  • +
+ + + + +
+ +
+ +
+ +

+ +Freelance Digital Designer + +

+ +
+
+ +Source LF + +
+ + +London +
+ +
+ + +£200 - £350 a day + +
+
Easily apply to this job
+
    +
  • We are currently working with a huge spectrum of clients from Advertising Agencies, big global networks, media clients, independent design studios and huge…
  • +
+ + + + +
+ +
+ +
+ +

+ +Freelance Interactive Designer + +

+ +
+
+ +Source LF + +
+ + +London +
+ +
+ + +£300 - £450 a day + +
+
Easily apply to this job
+
    +
  • We are currently working with a huge spectrum of clients from Experience Agencies, to big global networks, independent design studios and huge client side…
  • +
+ + + + +
+ +
+ +
+ +

+ +React Native Engineer + +

+ +
+ + + +London +
+ +
+ + +£475 - £525 a day + +
+
+
    +
  • React Native Engineer - Remote contract- ReactJS, NodeJS.
  • +
  • My City of London based client, a reputable FinTech business is on the lookout for a React Native…
  • +
+ + + + +
+ +
+ +
+ +

+ +eTrading - Java Developer + +

+ +
+
+ +Harrington Starr + +
+ + +London +
+ +
+ + +£650 - £700 a day + +
+
+
    +
  • JavaScript, React, Java, J2SE, OOP, HTML, UI, GUI, Angular, FX, eTrading, FIX Protocol, SQL, MySQL, Agile.
  • +
  • Strong J2SE Serverside Development experience.
  • +
+ + + + +
+ +
+ +
+ +

+ +Technical Writer + +

+ +
+
+ +Mackin Consultancy + +
+ + +London +
+ +
Easily apply to this job
+
    +
  • Our client in London is currently seeking an experienced and highly motivated Technical Writer..
  • +
  • The position will be an 11 month contract which may be…
  • +
+ + + + +
+ +
+ +
+ +

+ +Frontend Developer + +

+ +
+
+ +Lawrence Harvey + +
+ + +London +
+ +
+ + +£400 - £500 a day + +
+
+
    +
  • My Client are looking for an experienced Frontend Developer, to help the team support and develop a large number of different internal tools.
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ +Full Stack Developer + +

+ +
+
+ +Prolancer + +
+ + +London +
+ +
+ + +£65,000 - £75,000 a year + +
+
Easily apply to this job
+
    +
  • Fully distributed company with a high degree of autonomy.
  • +
  • Work closely with an awesome team of developers and designers to build industry-leading products and…
  • +
+ + + + +
+ +
+ +
+ +

+ +Front End Developer + +

+ +
+
+ +Prolancer + +
+ + +London +
+ +
+ + +£45,000 - £55,000 a year + +
+
Easily apply to this job
+
    +
  • Front-end engineer who can make complex systems understandable; who loves working according to the latest standards and takes pride in delivering nothing but…
  • +
+ + + + +
+ +
+ +
+ +

+ +Technical Support Engineer Global Tech + +

+ +
+
+ +Principle HR + +
+ + +Surrey +
+ +
+ + +£50,000 a year + +
+
+
    +
  • You will be responsible for the support and maintenance of the company platform and provide incident management and resolution for critical incidents.
  • +
+ + + + +
+ +
+ +
+ +

+ +PHP Developer- Borehamwood- 6 Month FTC £40,000-£45,000 + +

+ +
+ + + +Borehamwood +
+ +
+ + +£40,000 - £45,000 a year + +
+
+
    +
  • Our client a specialist financial services company based in Watford are looking for a PHP Developer to join their team on a contract basis for an initial 6…
  • +
+ + + + +
+ +
+ +
+ +

+ +UI Developer - React - £750-850 per day + +

+ +
+ + + +London +
+ +
+ + +£750 - £850 a day + +
+
+
    +
  • A leading investment bank is looking for a UI Developer with experience in React.js to join their business on a contract basis.
  • +
+ + + + +
+ +
+ +
+ +

+ +Front Office UI Developer - Outside IR35 + +

+ +
+ + + +London +
+ +
+ + +£650 - £850 a day + +
+
Easily apply to this job
+
    +
  • This is a Full Stack Software Developer position with a focus building rich user interfaces, whilst also covering all aspects of the software development…
  • +
+ + + + +
+ +
+ + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + diff --git a/test/data/indeed/indeed-2020-04-16--105727.html b/test/data/indeed/indeed-2020-04-16--105727.html new file mode 100644 index 0000000..5195433 --- /dev/null +++ b/test/data/indeed/indeed-2020-04-16--105727.html @@ -0,0 +1,1782 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Javascript Node Jobs in London - April 2020 | Indeed.co.uk + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+
+
+ + +
+ + +
+ Upload your CV and easily apply to jobs from any device!

+ javascript node jobs in London

+
+Sort by: +relevance - date +
+
+
+ Page 1 of 13 jobs
+ +
+
+
+ + +
+ +

+ +Freelance Digital Designer + +

+ +
+
+ +Source + +
+ + +London +
+ +
+ + +£200 - £350 a day + +
+
Easily apply to this job
+
    +
  • We are currently working with a huge spectrum of clients from Advertising Agencies, big global networks, media clients, independent design studios and huge…
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ +Freelance Interactive Designer + +

+ +
+
+ +Source + +
+ + +London +
+ +
+ + +£300 - £450 a day + +
+
Easily apply to this job
+
    +
  • We are currently working with a huge spectrum of clients from Experience Agencies, to big global networks, independent design studios and huge client side…
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ +TECHNICAL WRITER + +

+ +
+
+ +Intec Select + +
+ + +London +
+ +
+ + +£280 a week + +
+
+
    +
  • Technical Writer – 11 month contract – £280 per day.
  • +
  • Support a creative tool for augmented reality experiences across our clients family of products.
  • +
+ + + + +
+ +
+ +
+ +

+ +eTrading - Java Developer + +

+ +
+
+ +Harrington Starr + +
+ + +London +
+ +
+ + +£650 - £700 a day + +
+
+
    +
  • JavaScript, React, Java, J2SE, OOP, HTML, UI, GUI, Angular, FX, eTrading, FIX Protocol, SQL, MySQL, Agile.
  • +
  • Strong J2SE Serverside Development experience.
  • +
+ + + + +
+ +
+ +
+ +

+ +Freelance Digital Designer + +

+ +
+
+ +Source LF + +
+ + +London +
+ +
+ + +£200 - £350 a day + +
+
Easily apply to this job
+
    +
  • We are currently working with a huge spectrum of clients from Advertising Agencies, big global networks, media clients, independent design studios and huge…
  • +
+ + + + +
+ +
+ +
+ +

+ +Freelance Interactive Designer + +

+ +
+
+ +Source LF + +
+ + +London +
+ +
+ + +£300 - £450 a day + +
+
Easily apply to this job
+
    +
  • We are currently working with a huge spectrum of clients from Experience Agencies, to big global networks, independent design studios and huge client side…
  • +
+ + + + +
+ +
+ +
+ +

+ +Frontend Developer + +

+ +
+
+ +Lawrence Harvey + +
+ + +London +
+ +
+ + +£400 - £500 a day + +
+
+
    +
  • My Client are looking for an experienced Frontend Developer, to help the team support and develop a large number of different internal tools.
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ +React Native Engineer + +

+ +
+ + + +London +
+ +
+ + +£475 - £525 a day + +
+
+
    +
  • React Native Engineer - Remote contract- ReactJS, NodeJS.
  • +
  • My City of London based client, a reputable FinTech business is on the lookout for a React Native…
  • +
+ + + + +
+ +
+ +
+ +

+ +Technical Writer + +

+ +
+
+ +Mackin Consultancy + +
+ + +London +
+ +
Easily apply to this job
+
    +
  • Our client in London is currently seeking an experienced and highly motivated Technical Writer..
  • +
  • The position will be an 11 month contract which may be…
  • +
+ + + + +
+ +
+ +
+ +

+ +Technical Support Engineer Global Tech + +

+ +
+
+ +Principle HR + +
+ + +Surrey +
+ +
+ + +£50,000 a year + +
+
+
    +
  • You will be responsible for the support and maintenance of the company platform and provide incident management and resolution for critical incidents.
  • +
+ + + + +
+ +
+ +
+ +

+ +Full Stack Developer + +

+ +
+
+ +Prolancer + +
+ + +London +
+ +
+ + +£65,000 - £75,000 a year + +
+
Easily apply to this job
+
    +
  • Fully distributed company with a high degree of autonomy.
  • +
  • Work closely with an awesome team of developers and designers to build industry-leading products and…
  • +
+ + + + +
+ +
+ +
+ +

+ +Front End Developer + +

+ +
+
+ +Prolancer + +
+ + +London +
+ +
+ + +£45,000 - £55,000 a year + +
+
Easily apply to this job
+
    +
  • Front-end engineer who can make complex systems understandable; who loves working according to the latest standards and takes pride in delivering nothing but…
  • +
+ + + + +
+ +
+ +
+ +

+ +Front Office UI Developer - Outside IR35 + +

+ +
+ + + +London +
+ +
Easily apply to this job
+Front Office UI Developer This London based firm is looking for an exceptional UI specialist with experience using React to join their world class team to…
+ + + + +
+ +
+ +
+ » + Post your CV - It only takes a few seconds
+ +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + diff --git a/test/data/indeed/indeed-2020-04-16--105848.html b/test/data/indeed/indeed-2020-04-16--105848.html new file mode 100644 index 0000000..eea522b --- /dev/null +++ b/test/data/indeed/indeed-2020-04-16--105848.html @@ -0,0 +1,1778 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Javascript Node Jobs in London - April 2020 | Indeed.co.uk + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+
+
+ + +
+ + +
+ Upload your CV and easily apply to jobs from any device!

+ javascript node jobs in London

+
+Sort by: +relevance - date +
+
+
+ Page 1 of 13 jobs
+ +
+
+
+ + +
+ +

+ +TECHNICAL WRITER + +

+ +
+
+ +Intec Select + +
+ + +London +
+ +
+ + +£280 a week + +
+
+
    +
  • Technical Writer – 11 month contract – £280 per day.
  • +
  • Support a creative tool for augmented reality experiences across our clients family of products.
  • +
+ + + + +
+ +
+ +
+ +

+ +Freelance Digital Designer + +

+ +
+
+ +Source + +
+ + +London +
+ +
+ + +£200 - £350 a day + +
+
Easily apply to this job
+
    +
  • We are currently working with a huge spectrum of clients from Advertising Agencies, big global networks, media clients, independent design studios and huge…
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ +Freelance Interactive Designer + +

+ +
+
+ +Source + +
+ + +London +
+ +
+ + +£300 - £450 a day + +
+
Easily apply to this job
+
    +
  • We are currently working with a huge spectrum of clients from Experience Agencies, to big global networks, independent design studios and huge client side…
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ +eTrading - Java Developer + +

+ +
+
+ +Harrington Starr + +
+ + +London +
+ +
+ + +£650 - £700 a day + +
+
+
    +
  • JavaScript, React, Java, J2SE, OOP, HTML, UI, GUI, Angular, FX, eTrading, FIX Protocol, SQL, MySQL, Agile.
  • +
  • Strong J2SE Serverside Development experience.
  • +
+ + + + +
+ +
+ +
+ +

+ +Freelance Interactive Designer + +

+ +
+
+ +Source LF + +
+ + +London +
+ +
+ + +£300 - £450 a day + +
+
Easily apply to this job
+
    +
  • We are currently working with a huge spectrum of clients from Experience Agencies, to big global networks, independent design studios and huge client side…
  • +
+ + + + +
+ +
+ +
+ +

+ +Freelance Digital Designer + +

+ +
+
+ +Source LF + +
+ + +London +
+ +
+ + +£200 - £350 a day + +
+
Easily apply to this job
+
    +
  • We are currently working with a huge spectrum of clients from Advertising Agencies, big global networks, media clients, independent design studios and huge…
  • +
+ + + + +
+ +
+ +
+ +

+ +React Native Engineer + +

+ +
+ + + +London +
+ +
+ + +£475 - £525 a day + +
+
+
    +
  • React Native Engineer - Remote contract- ReactJS, NodeJS.
  • +
  • My City of London based client, a reputable FinTech business is on the lookout for a React Native…
  • +
+ + + + +
+ +
+ +
+ +

+ +Frontend Developer + +

+ +
+
+ +Lawrence Harvey + +
+ + +London +
+ +
+ + +£400 - £500 a day + +
+
+
    +
  • My Client are looking for an experienced Frontend Developer, to help the team support and develop a large number of different internal tools.
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ +Technical Writer + +

+ +
+
+ +Mackin Consultancy + +
+ + +London +
+ +
Easily apply to this job
+
    +
  • Our client in London is currently seeking an experienced and highly motivated Technical Writer..
  • +
  • The position will be an 11 month contract which may be…
  • +
+ + + + +
+ +
+ +
+ +

+ +Technical Support Engineer Global Tech + +

+ +
+
+ +Principle HR + +
+ + +Surrey +
+ +
+ + +£50,000 a year + +
+
+
    +
  • You will be responsible for the support and maintenance of the company platform and provide incident management and resolution for critical incidents.
  • +
+ + + + +
+ +
+ +
+ +

+ +Full Stack Developer + +

+ +
+
+ +Prolancer + +
+ + +London +
+ +
+ + +£65,000 - £75,000 a year + +
+
Easily apply to this job
+
    +
  • Fully distributed company with a high degree of autonomy.
  • +
  • Work closely with an awesome team of developers and designers to build industry-leading products and…
  • +
+ + + + +
+ +
+ +
+ +

+ +Front End Developer + +

+ +
+
+ +Prolancer + +
+ + +London +
+ +
+ + +£45,000 - £55,000 a year + +
+
Easily apply to this job
+
    +
  • Front-end engineer who can make complex systems understandable; who loves working according to the latest standards and takes pride in delivering nothing but…
  • +
+ + + + +
+ +
+ +
+ +

+ +Front Office UI Developer - Outside IR35 + +

+ +
+ + + +London +
+ +
Easily apply to this job
+Front Office UI Developer This London based firm is looking for an exceptional UI specialist with experience using React to join their world class team to…
+ + + + +
+ +
+ +
+ » + Post your CV - It only takes a few seconds
+ +
+ + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + diff --git a/test/data/indeed/page.html b/test/data/indeed/page.html new file mode 100644 index 0000000..e0abae4 --- /dev/null +++ b/test/data/indeed/page.html @@ -0,0 +1,1779 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Javascript Node Jobs in London - April 2020 | Indeed.co.uk + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+
+
+ + +
+ + +
+ Upload your CV and easily apply to jobs from any device!

+ javascript node jobs in London

+
+Sort by: +relevance - date +
+
+
+ Page 1 of 13 jobs
+ +
+
+
+ + +
+ +

+ +Technical Writer + +

+ +
+
+ +Mackin Consultancy + +
+ + +London +
+ +
Easily apply to this job
+
    +
  • Our client in London is currently seeking an experienced and highly motivated Technical Writer..
  • +
  • The position will be an 11 month contract which may be…
  • +
+ + + + +
+ +
+ +
+ +

+ +Technical Support Engineer Global Tech + +

+ +
+
+ +Principle HR + +
+ + +Surrey +
+ +
+ + +£50,000 a year + +
+
+
    +
  • You will be responsible for the support and maintenance of the company platform and provide incident management and resolution for critical incidents.
  • +
+ + + + +
+ +
+ +
+ +

+ +Full Stack Developer + +

+ +
+
+ +Prolancer + +
+ + +London +
+ +
+ + +£65,000 - £75,000 a year + +
+
Easily apply to this job
+
    +
  • Fully distributed company with a high degree of autonomy.
  • +
  • Work closely with an awesome team of developers and designers to build industry-leading products and…
  • +
+ + + + +
+ +
+ +
+ +

+ +Front End Developer + +

+ +
+
+ +Prolancer + +
+ + +London +
+ +
+ + +£45,000 - £55,000 a year + +
+
Easily apply to this job
+
    +
  • Front-end engineer who can make complex systems understandable; who loves working according to the latest standards and takes pride in delivering nothing but…
  • +
+ + + + +
+ +
+ +
+ +

+ +Front Office UI Developer - Outside IR35 + +

+ +
+ + + +London +
+ +
Easily apply to this job
+Front Office UI Developer This London based firm is looking for an exceptional UI specialist with experience using React to join their world class team to…
+ + + + +
+ +
+ +
+ +

+ +.NET Developer - 6 months FTC + +

+ +
+
+ +In 2 Consult + +
+ + +London +
+ +
+ + +£400 - £500 a day + +
+
+
    +
  • .NET DEVELOPER - UP TO £500 PER DAY - 6 MONTHS FTC - ASP.
  • +
  • NET, .NET, C#, SQL SERVER.
  • +
  • IN2 Consult are working with a global organisation going through a period…
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ +Front-End Developer - E-commerce- Contract + +

+ +
+
+ +Eligo Recruitment Ltd + +
+ + +London +
+ +
+ + +£250 - £350 a day + +
+
+
    +
  • £250 - £350 per day.
  • +
  • Brand new, urgent job for a Front End Developer on a 3 month contract.
  • +
  • £300-£400 per day.
  • +
  • This role will be fully home/remote based.
  • +
+ + + + +
+ +
+ +
+ +

+ +eTrading – Java Developer + +

+ +
+
+ +Harrington Starr + +
+ + +London +
+ +
+ + +£65,000 - £70,000 a year + +
+
+
    +
  • JavaScript, React, Java, J2SE, OOP, HTML, UI, GUI, Angular, FX, eTrading, FIX Protocol, SQL, MySQL, Agile.
  • +
  • Strong J2SE Serverside Development experience.
  • +
+ + + + +
+ +
+ +
+ +

+ +UI Developer - React - £750-850 per day + +

+ +
+ + + +London +
+ +
+ + +£750 - £850 a day + +
+
+
    +
  • A leading investment bank is looking for a UI Developer with experience in React.js to join their business on a contract basis.
  • +
+ + + + +
+ +
+ +
+ +

+ +PHP Developer- Borehamwood- 6 Month FTC £40,000-£45,000 + +

+ +
+ + + +Borehamwood +
+ +
+ + +£40,000 - £45,000 a year + +
+
+
    +
  • Our client a specialist financial services company based in Watford are looking for a PHP Developer to join their team on a contract basis for an initial 6…
  • +
+ + + + +
+ +
+ +
+ +

+ +Salesforce Developer + +

+ +
+ + + +London +
+ +
+ + +£450 a day + +
+
+
    +
  • I am currently on the lookout for a salesforce developer to join a client of mine based in London.
  • +
  • Have previous experience with application and software…
  • +
+ + + + +
+ +
+ +
+ +

+ +Salesforce Developer - REMOTE ONBOARDING - Outside IR35 (ib3... + +

+ +
+ + + +West End +
+ +
+ + +£400 - £500 a day + +
+
+
    +
  • Our client is on boarding remotely and looking for someone to start ASAP.
  • +
  • Previous experience working within government.
  • +
+ + + +
+
+ + +
+
+
+ +
+ +

+We have removed 1 job posting very similar to those already shown. To see the additional result, you may repeat your search with the omitted job posting included.

+
+ » + Post your CV - It only takes a few seconds
+ +
+ + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + diff --git a/test/data/indeed/page2.html b/test/data/indeed/page2.html new file mode 100644 index 0000000..a07d43a --- /dev/null +++ b/test/data/indeed/page2.html @@ -0,0 +1,2438 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HTML Web SQL Delphi VB Vbscript PHP AJAX MySQL Sqlserver Javascript Nodejs Vuejs Sveltejs Jobs in London - April 2020 | Indeed.co.uk + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+
+
+ + +
+ + +

+ Html Web Sql Delphi Vb Vbscript Php Ajax Mysql Sqlserver Javascript Nodejs vuejs sveltejs jobs in London

+
+ Sort by: + relevance - +date +
+
+
+ Page 1 of 20 jobs
+ +
+
+
+ + + +
+ + +
+ + +

+ + Customer Insight Manager - Digital - 8 Month Fixed Term Cont... + + new

+ +
+ + + +
London
+
+ +
+
    +
  • O Support the relevant stakeholders by bringing the customer angle into their business decisions and to help them unpick performance for their specific market,…
  • +
+ + + +
+ + +
+
+ +
+ +
+ +

+ + Developer + + new

+ +
+
+ +Trafalgar House + +
+ + + London +
+ +
+
    +
  • Work on projects developing efficient and effective IT solutions in accordance with the context provided by THPA.
  • +
  • Produce code assets in adherence to standards.
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ + Drupal Developer + + new

+ +
+ + + + London +
+ +
+
    +
  • I am currently working closely with a non-profit, who are looking for a Drupal developer with experience across Drupal 8, to come onboard for a 12 month…
  • +
+ + + + +
+ +
+ +
+ +

+ + SEO Contractor + + new

+ +
+
+ +Bark + +
+ + + London W2 +
+ +
Apply with your Indeed CV
+
    +
  • We are looking for an analytical and perceptive marketeer who is a skilled communicator and able to collaborate within our team.
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ + DBA / DevOps Engineer + + new

+ +
+
+ +Mortimer Spinks + +
+ + + London +
+ +
+ + +£450 a week + +
+
+
    +
  • I'm currently looking for a DBA/ DevOps Engineer for a 3 month contract role.
  • +
  • Set up an Amazon Redshift Cluster database from scratch which will draw reporting…
  • +
+ + + + +
+ +
+ +
+ +

+ + Data Architect + + new

+ +
+ + + + London +
+ +
+
    +
  • Whitehall Resources are currently looking for a Data Architect based in London for an initial 6-month contract/.
  • +
  • Data lake on Hadoop, Spark and Hive.
  • +
+ + + + +
+ +
+ +
+ +

+ + Data Scientist + + new

+ +
+ + + + London +
+ +
+ + +£350 - £450 a day + +
+
+
    +
  • £350-£450 PER DAY.
  • +
  • As a Data Scientist you will be working heavily in Python/SQL to build ETL pipelines as well as segmentation modelling.
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ + Senior Digital Designer + + new

+ +
+
+ +Freshtech IT + +
+ + + London +
+ +
+ + +£65,000 a year + +
+
+
    +
  • Competitive Salary of up to £65,000.
  • +
  • 6 years experience within a professional environment as a Designer.
  • +
  • Strong working knowledge within areas such as Sketch,…
  • +
+ + + + +
+ +
+ +
+ +

+ + DevOps Engineer + + new

+ +
+ + + + London +
+ +
+
    +
  • The DevOps/Kubernetes Engineer will be responsible for all aspects of running Kubernetes and interacting with various teams to help onboard more applications…
  • +
+ + + + +
+ +
+ +
+ +

+ + Senior Project Manager + + new

+ +
+ + + + London +
+ +
+
    +
  • Excellent knowledge of Intrusion Detection (TCP/IP knowledge, and Cyber security), various operating systems (Windows/Linux), and web technologies (focusing on…
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ + Identity Verification Analyst + + new

+ +
+
+ +Allen Recruitment Consulting + +
+ + + London +
+ +
+
    +
  • They require an Identity Verification Analyst with 2+ years of experience in a relevant role with a focus on data analytics and process improvement to join them…
  • +
+ + + + +
+ +
+ +
+ +

+ + AxiomSL Consultant + + new

+ +
+
+ +emagine Consulting + +
+ + + London EC3V +
+ +
Apply with your Indeed CV
+
    +
  • AxiomSL Consultant (Banking Experience) - 6 months contract in London, UK (Remote)*.
  • +
  • Day to day will require to Develop regulatory reports used for FinRep…
  • +
+ + + + +
+ +
+ +
+ +

+ + Analytics Executive + + new

+ +
+ + + + London +
+ +
+
    +
  • Understanding of web analytics tools such as Google/Adobe Analytics desirable.
  • +
  • The purpose of this role is to manage the collection and organisation of data to…
  • +
+ + + + +
+ +
+ +
+ +

+ + Identity Verification Data Analyst + + new

+ +
+ + + + London +
+ +
+ + +£26 - £29 an hour + +
+
+
    +
  • The ideal candidate will ideally have a background in data analytics and program/project management.
  • +
  • Develop and track end-to-end project plans and ensure on…
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ + Integration Specialist - Data Historian,Osisoft PI- Kaiserau... + + new

+ +
+
+ +Next Link + +
+ + + London +
+ +
Apply with your Indeed CV
+
    +
  • Extension: possible, depending on project availability.
  • +
  • Data Historian (Osisoft PI) administration and development comprising of:
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ + Information Architect WEX Network IT + + new

+ +
+
+ +Next Link + +
+ + + London +
+ +
Apply with your Indeed CV
+
    +
  • Hands-on experience in the following areas is a plus: web server, application server, database, cloud hosting, API integration.
  • +
+ + + +
+
+ + +
+
+
+ +
+ +
+ +

+ + Head of Marketing - 12month maternity contract #ASAP start #... + + new

+ +
+
+ +Creative Recruitment + +
+ + + London +
+ +
+ + +£50,000 - £60,000 a year + +
+
+
    +
  • Experience with leading and managing agencies, web, SEO/SEM, marketing database, email, social media and/or display advertising campaigns.
  • +
+ + + + +
+ +
+ +
+ +

+ + Catastrophe Modelling - London Market + + new

+ +
+ + + + London +
+ +
+ + +£400 - £700 a day + +
+
Apply with your Indeed CV
+
    +
  • Assignment: My client is looking for an experienced Catastrophe Modeller to provide efficient and accurate portfolio reporting and model across a variety of…
  • +
+ + + + +
+ +
+ +
+ +

+ + ASSISTANT JUNIOR ACCOUNTANT + + new

+ +
+
+ +Deekay Technical Recruitment Limited + +
+ + + London +
+ +
+ + +£150 - £170 a day + +
+
Apply with your Indeed CV
+
    +
  • Assist technical staff in achieving set goals and objectives.
  • +
  • Have an understanding of the Business Analyst function.
  • +
  • Raising invoices for the business unit.
  • +
+ + + + +
+ +
+ +
+ +

+ + Cash & Banking Executive - 6 month FTC + + new

+ +
+ + + + London +
+ +
+ + +£22,000 - £29,000 a year + +
+
Apply with your Indeed CV
+
    +
  • To identify and process all incoming debtors payments and web receipts correctly.
  • +
  • Euromonitor are looking for a Cash & Banking Executive to join the finance…
  • +
+ + + +
+
+ + +
+
+
+ +
+ + +
+ + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + diff --git a/test/data/totaljobs/totaljobs-2020-04-16--121504.html b/test/data/totaljobs/totaljobs-2020-04-16--121504.html new file mode 100644 index 0000000..632c8aa --- /dev/null +++ b/test/data/totaljobs/totaljobs-2020-04-16--121504.html @@ -0,0 +1,3565 @@ + + Contract Html Or Vue Or Vuejs Or Web Or Sql Or Delphi Or Vb Or Vbscript Or Php Or Ajax Or Mysql Or Sqlserver Or Javascript Or Node Or Nodejs Or Svelte Or Sveltejs Not React Jobs in London | Contract Html Or Vue Or Vuejs Or Web Or Sql Or Delphi Or Vb Or Vbscript Or Php Or Ajax Or Mysql Or Sqlserver Or Javascript Or Node Or Nodejs Or Svelte Or Sveltejs Not React Job Vacancies London - totaljobs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + +
+
+
+
+
+ +
+ +
+
+
+ + +
+ +
+ +

Recent Notifications

+
+ +
+ +
+
+
+
+


You have no new notifications

+
+
+ +
+
+
+ + + + + + +
+ + +
+
+
+ 203 +

Contract Html or Vue or Vuejs or Web or Sql or Delphi or Vb or Vbscript or Php or Ajax or Mysql or Sqlserver or Javascript or Node or Nodejs or Svelte or Sveltejs Not React jobs in London

+ + + 20 miles +
+
+
+ + + +
+
+
+ + +
+
+ + + + +
+
+ +
+
+
+
+
+ +
+ + + + + + +
+
+
+ +
+ + + + + + + Enter your home postcode to search by commute time + + + +
+ +
+
+ + +
+
+ Your filters + clear all +
+ +
+
+ + + +
+
Radius and time
+
+ + + +
+ +
+
+ + +
+
    +
  • + +
  • +
    +
  • + +
  • +
+ +
0 min
+
+
+ +
+ +
+
+ 0 + 5 + 10 + 20 + 30 +
+ +
+ +
+
+
+ + + +
+
Locations
+
+
+
+ +
+ +
+
+
+ +
+
Salaries
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ +
+
Date posted
+
+ +
+
+ + +
+
Recruiters
+
+ +
+
+ +
+
Job types
+
+ +
+
+ + + + +
+
Sort by
+
+ +
+
+ + + +
+
+
+
+
+
+
+
+ +
+
+
+ +
    +
  • + + N1, North London + + +
    + + + +
  • +
  • £300 - £380 per day
  • +
+
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
    +
  • + + EC1, City of London + + +
    + + + +
  • +
  • £475 - £525 per day
  • +
+
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
    +
  • + + London + + +
    + + + +
  • +
  • Unspecified
  • +
+
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+ +
    +
  • + + London + + +
    + + + +
  • +
  • Negotiable
  • +
+
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
    +
  • + + N1, North London + + +
    + + + +
  • +
  • £350 - £375 per day
  • +
+
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
    +
  • + + N1, North London + + +
    + + + +
  • +
  • £450 - £451 per day
  • +
+
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+ + +
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
    +
  • + + EC2A, City of London + + +
    + + + +
  • +
  • Up to £450 per day
  • +
+
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
    +
  • + + London + + +
    + + + +
  • +
  • Unspecified
  • +
+
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
    +
  • + + N1, North London + + +
    + + + +
  • +
  • From £650 to £750 per day
  • +
+
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
    +
  • + + London + + +
    + + + +
  • +
  • £450 - £500 per day + Flexible working
  • +
+
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ + +
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
    +
  • + + EC1, City of London + + +
    + + + +
  • +
  • Up to £500 per day DOE
  • +
+
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
    +
  • + + Central London, London + + +
    + + + +
  • +
  • £400 - £500 per day + OUTSIDE IR35
  • +
+
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
    +
  • + + London + + +
    + + + +
  • +
  • £600 - £750 per day
  • +
+
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
    +
  • + + London + + +
    + + + +
  • +
  • £550 - £750 per day
  • +
+
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
    +
  • + + London + + +
    + + + +
  • +
  • £250 - £350 per day
  • +
+
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
    +
  • + + London + + +
    + + + +
  • +
  • £600 - £800 per day
  • +
+
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
    +
  • + + London + + +
    + + + +
  • +
  • £600 - £800 per day
  • +
+
+ +
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
    +
  • + + London + + +
    + + + +
  • +
  • £300 - £400 per day
  • +
+
+ +
+ +
+ +
+
    +
  • + Contract +
  • +
  • +

    + IC Creative +

    +
  • +
  • + + Yesterday + +
  • +
+
+
+ +
+
+
+
+ +
+
+ +
+
+ + + + +
+ +
+ +
+
+
+ +
+ + + + +
+
+ +
+
+
+
+
+
+ +
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/indeed.js b/test/indeed.js new file mode 100644 index 0000000..2df1b2d --- /dev/null +++ b/test/indeed.js @@ -0,0 +1,41 @@ +/** + * Created by WebStorm. + * User: martin + * Date: 15/04/2020 + * Time: 11:56 + + */ + +const tape = require('tape'); +const _test = require('tape-promise').default; // <---- notice 'default' +const test = _test(tape); // decorate tape + +const fs = require('fs'); +const cheerio = require('cheerio'); + +const IndeedScraper = require('../scrapers/indeed'); + +const indeedScraper = new IndeedScraper(); + +// const page = fs.readFileSync('data/indeed/indeed-2020-04-16--092311.html'); +const page = fs.readFileSync('data/indeed/page2.html'); + +test.test('Test Indeed scraper', async t => { + const $ = cheerio.load(page); + + indeedScraper.loadPage($); + + await indeedScraper.breakPage(); + + // await indeedScraper.getJobPages(); + + // console.log(await indeedScraper.checkNext()); + + // console.log(indeedScraper.items); + + await indeedScraper.filterAdverts(); + + // await indeedScraper.addToDB(); + + t.end(); +}); diff --git a/test/totaljobs.js b/test/totaljobs.js new file mode 100644 index 0000000..a539e4a --- /dev/null +++ b/test/totaljobs.js @@ -0,0 +1,41 @@ +/** + * Created by WebStorm. + * User: martin + * Date: 15/04/2020 + * Time: 11:56 + + */ + +const tape = require('tape'); +const _test = require('tape-promise').default; // <---- notice 'default' +const test = _test(tape); // decorate tape + +const fs = require('fs'); +const cheerio = require('cheerio'); + +const TotaljobsScraper = require('../scrapers/totaljobs'); + +const totaljobsScraper = new TotaljobsScraper(); + +// const page = fs.readFileSync('data/indeed/indeed-2020-04-16--092311.html'); +console.log(`${__dirname}`); +const page = fs.readFileSync(`${__dirname}/data/totaljobs/totaljobs-2020-04-16--121504.html`); + +test.test('Test Totaljobs scraper', async t => { + const $ = cheerio.load(page); + + totaljobsScraper.loadPage($); + + await totaljobsScraper.breakPage(); + + await totaljobsScraper.getJobPages(); + // console.log(await indeedScraper.checkNext()); + + console.log(totaljobsScraper.items); + + await totaljobsScraper.filterAdverts(); + + // await totaljobsScraper.addToDB(); + + t.end(); +});