From 82207d5424e6f6fd1a0696e19284b5289cde8163 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 30 Oct 2017 15:47:30 +0900 Subject: [PATCH 01/81] Added IntelliJ ignores to .gitignore. Added lock file. --- .gitignore | 1 + package-lock.json | 3578 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 3579 insertions(+) create mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index c56a9e6..a1779a1 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,4 @@ Session.vim tags # End of https://www.gitignore.io/api/node +.idea/ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f97401c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3578 @@ +{ + "name": "ltc-attendance", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" + }, + "acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "2.1.1" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "assertion-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", + "dev": true + }, + "async": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", + "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", + "requires": { + "lodash": "4.17.4" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "basic-auth": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz", + "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=" + }, + "binary-extensions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", + "dev": true + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "body-parser": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", + "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=", + "requires": { + "bytes": "2.4.0", + "content-type": "1.0.4", + "debug": "2.6.7", + "depd": "1.1.1", + "http-errors": "1.6.2", + "iconv-lite": "0.4.15", + "on-finished": "2.3.0", + "qs": "6.4.0", + "raw-body": "2.2.0", + "type-is": "1.6.15" + }, + "dependencies": { + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "boxen": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.2.tgz", + "integrity": "sha1-Px1AMsMP/qnUsCwyLq8up0HcvOU=", + "dev": true, + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.3.0", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "bson": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", + "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "bytes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "1.0.2", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.3" + } + }, + "chai-http": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-3.0.0.tgz", + "integrity": "sha1-VGDYA24fGhKwtbXL1Snm3B0x60s=", + "dev": true, + "requires": { + "cookiejar": "2.0.6", + "is-ip": "1.0.0", + "methods": "1.1.2", + "qs": "6.4.0", + "superagent": "2.3.0" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", + "requires": { + "is-regex": "1.0.4" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.2", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", + "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", + "requires": { + "commander": "2.8.1", + "source-map": "0.4.4" + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "configstore": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", + "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.1.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, + "connect-flash": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/connect-flash/-/connect-flash-0.1.1.tgz", + "integrity": "sha1-2GMPJtlaf4UfmVax6MxnMvO2qjA=" + }, + "constantinople": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.0.tgz", + "integrity": "sha1-dWnKqKo/jVk11i4fqW+fcCzYHHk=", + "requires": { + "acorn": "3.3.0", + "is-expression": "2.1.0" + } + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.0.6.tgz", + "integrity": "sha1-Cr81atANHFohnYjURRgEbdAmrP4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "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" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "4.0.3" + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + }, + "es6-promise": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", + "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" + }, + "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=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "requires": { + "duplexer": "0.1.1", + "from": "0.1.7", + "map-stream": "0.1.0", + "pause-stream": "0.0.11", + "split": "0.3.3", + "stream-combiner": "0.0.4", + "through": "2.3.8" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "express": { + "version": "4.15.5", + "resolved": "https://registry.npmjs.org/express/-/express-4.15.5.tgz", + "integrity": "sha1-ZwI1ypWYiQpa6BcLg9tyK4Qu2Sc=", + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.1", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.0.6", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "1.1.5", + "qs": "6.5.0", + "range-parser": "1.2.0", + "send": "0.15.6", + "serve-static": "1.12.6", + "setprototypeof": "1.0.3", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.0", + "vary": "1.1.2" + }, + "dependencies": { + "qs": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", + "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==" + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "finalhandler": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", + "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "form-data": { + "version": "1.0.0-rc4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", + "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=", + "dev": true, + "requires": { + "async": "1.5.2", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "formidable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", + "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=", + "dev": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.7.0", + "node-pre-gyp": "0.6.36" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.36", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "global-dirs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.0.tgz", + "integrity": "sha1-ENNAOeDfBCcuJizyQiT3IJQ0308=", + "dev": true, + "requires": { + "ini": "1.3.4" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "requires": { + "function-bind": "1.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hooks-fixed": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.2.tgz", + "integrity": "sha512-YurCM4gQSetcrhwEtpQHhQ4M7Zo7poNGqY4kQGeBS6eZtOcT3tnNs01ThFa0jYBByAiYt1MjMjP/YApG0EnAvQ==" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + } + }, + "iconv-lite": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=" + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true + }, + "ip-regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", + "dev": true + }, + "ipaddr.js": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", + "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.10.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-expression": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-2.1.0.tgz", + "integrity": "sha1-kb6dR968/vB3l36XIr5tz7RGXvA=", + "requires": { + "acorn": "3.3.0", + "object-assign": "4.1.1" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "0.1.0", + "is-path-inside": "1.0.0" + } + }, + "is-ip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-1.0.0.tgz", + "integrity": "sha1-K7aVn3l8zW+f3IEnWLy8h8TFkHQ=", + "dev": true, + "requires": { + "ip-regex": "1.0.3" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "1.0.1" + } + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "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=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "jquery": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", + "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" + }, + "js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", + "requires": { + "is-promise": "2.1.0", + "promise": "7.3.1" + } + }, + "kareem": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-1.5.0.tgz", + "integrity": "sha1-4+QQHZ3P3imXadr0tNtk2JXRdEg=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "4.0.1" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, + "lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "dev": true, + "requires": { + "lodash._bindcallback": "3.0.1", + "lodash._isiterateecall": "3.0.9", + "lodash.restparam": "3.6.1" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._createassigner": "3.1.1", + "lodash.keys": "3.1.2" + } + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.defaults": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", + "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", + "dev": true, + "requires": { + "lodash.assign": "3.2.0", + "lodash.restparam": "3.6.1" + } + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", + "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, + "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=" + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "mongodb": { + "version": "2.2.33", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.33.tgz", + "integrity": "sha1-tTfEcdNKZlG0jzb9vyl1A0Dgi1A=", + "requires": { + "es6-promise": "3.2.1", + "mongodb-core": "2.1.17", + "readable-stream": "2.2.7" + } + }, + "mongodb-core": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.17.tgz", + "integrity": "sha1-pBizN6FKFJkPtRC5I97mqBMXPfg=", + "requires": { + "bson": "1.0.4", + "require_optional": "1.0.1" + } + }, + "mongoose": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.12.5.tgz", + "integrity": "sha512-dhCcCfYJjZv95nn4mAIAzj/+o2iR8rIBPOFlWps/STe+wJD53B2sKOpS+UH2bp7CqBHcLnwdRJL6aGJUcWS7kg==", + "requires": { + "async": "2.1.4", + "bson": "1.0.4", + "hooks-fixed": "2.0.2", + "kareem": "1.5.0", + "mongodb": "2.2.33", + "mpath": "0.3.0", + "mpromise": "0.5.5", + "mquery": "2.3.2", + "ms": "2.0.0", + "muri": "1.3.0", + "regexp-clone": "0.0.1", + "sliced": "1.0.1" + } + }, + "mongoose-unique-validator": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-1.0.6.tgz", + "integrity": "sha512-hJf1eiWPw9O5ed7HUtFHtHhqnWDpm42Q5iC3xs6p99kr1qrVMq8WR2x+yobx6rY5F26Ki2NqGvJTe8v/Fax0kw==", + "requires": { + "lodash.foreach": "4.5.0", + "lodash.get": "4.4.2" + } + }, + "morgan": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.8.2.tgz", + "integrity": "sha1-eErHc05KRTqcbm6GgKkyknXItoc=", + "requires": { + "basic-auth": "1.1.0", + "debug": "2.6.8", + "depd": "1.1.1", + "on-finished": "2.3.0", + "on-headers": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "mpath": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.3.0.tgz", + "integrity": "sha1-elj3iem1/TyUUgY0FXlg8mvV70Q=" + }, + "mpromise": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mpromise/-/mpromise-0.5.5.tgz", + "integrity": "sha1-9bJCWddjrMIlewoMjG2Gb9UXMuY=" + }, + "mquery": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-2.3.2.tgz", + "integrity": "sha512-KXWMypZSvhCuqRtza+HMQZdYw7PfFBjBTFvP31NNAq0OX0/NTIgpcDpkWQ2uTxk6vGQtwQ2elhwhs+ZvCA8OaA==", + "requires": { + "bluebird": "3.5.1", + "debug": "2.6.9", + "regexp-clone": "0.0.1", + "sliced": "0.0.5" + }, + "dependencies": { + "sliced": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz", + "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8=" + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "muri": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/muri/-/muri-1.3.0.tgz", + "integrity": "sha512-FiaFwKl864onHFFUV/a2szAl7X0fxVlSKNdhTf+BM8i8goEgYut8u5P9MqQqIYwvaMxjzVESsoEm/2kfkFH1rg==" + }, + "nan": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", + "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", + "dev": true, + "optional": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "nodemon": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.12.1.tgz", + "integrity": "sha1-mWpW3EnZ8Wu/G3ik3gjxNjSzh40=", + "dev": true, + "requires": { + "chokidar": "1.7.0", + "debug": "2.6.9", + "es6-promise": "3.3.1", + "ignore-by-default": "1.0.1", + "lodash.defaults": "3.1.2", + "minimatch": "3.0.4", + "ps-tree": "1.1.0", + "touch": "3.1.0", + "undefsafe": "0.0.3", + "update-notifier": "2.3.0" + }, + "dependencies": { + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", + "dev": true + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.1", + "registry-url": "3.1.0", + "semver": "5.4.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "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=" + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "2.0.6" + } + }, + "proxy-addr": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", + "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.4.0" + } + }, + "ps-tree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", + "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", + "dev": true, + "requires": { + "event-stream": "3.3.4" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "pug": { + "version": "2.0.0-rc.4", + "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.0-rc.4.tgz", + "integrity": "sha512-SL7xovj6E2Loq9N0UgV6ynjMLW4urTFY/L/Fprhvz13Xc5vjzkjZjI1QHKq31200+6PSD8PyU6MqrtCTJj6/XA==", + "requires": { + "pug-code-gen": "2.0.0", + "pug-filters": "2.1.5", + "pug-lexer": "3.1.0", + "pug-linker": "3.0.3", + "pug-load": "2.0.9", + "pug-parser": "4.0.0", + "pug-runtime": "2.0.3", + "pug-strip-comments": "1.0.2" + } + }, + "pug-attrs": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.2.tgz", + "integrity": "sha1-i+KyIlVo/6ddG4Zpgr/59BEa/8s=", + "requires": { + "constantinople": "3.1.0", + "js-stringify": "1.0.2", + "pug-runtime": "2.0.3" + } + }, + "pug-code-gen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.0.tgz", + "integrity": "sha512-E4oiJT+Jn5tyEIloj8dIJQognbiNNp0i0cAJmYtQTFS0soJ917nlIuFtqVss3IXMEyQKUew3F4gIkBpn18KbVg==", + "requires": { + "constantinople": "3.1.0", + "doctypes": "1.1.0", + "js-stringify": "1.0.2", + "pug-attrs": "2.0.2", + "pug-error": "1.3.2", + "pug-runtime": "2.0.3", + "void-elements": "2.0.1", + "with": "5.1.1" + } + }, + "pug-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.2.tgz", + "integrity": "sha1-U659nSm7A89WRJOgJhCfVMR/XyY=" + }, + "pug-filters": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-2.1.5.tgz", + "integrity": "sha512-xkw71KtrC4sxleKiq+cUlQzsiLn8pM5+vCgkChW2E6oNOzaqTSIBKIQ5cl4oheuDzvJYCTSYzRaVinMUrV4YLQ==", + "requires": { + "clean-css": "3.4.28", + "constantinople": "3.1.0", + "jstransformer": "1.0.0", + "pug-error": "1.3.2", + "pug-walk": "1.1.5", + "resolve": "1.5.0", + "uglify-js": "2.8.29" + } + }, + "pug-lexer": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-3.1.0.tgz", + "integrity": "sha1-/QhzdtSmdbT1n4/vQiiDQ06VgaI=", + "requires": { + "character-parser": "2.2.0", + "is-expression": "3.0.0", + "pug-error": "1.3.2" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + }, + "is-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", + "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=", + "requires": { + "acorn": "4.0.13", + "object-assign": "4.1.1" + } + } + } + }, + "pug-linker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.3.tgz", + "integrity": "sha512-DCKczglCXOzJ1lr4xUj/lVHYvS+lGmR2+KTCjZjtIpdwaN7lNOoX2SW6KFX5X4ElvW+6ThwB+acSUg08UJFN5A==", + "requires": { + "pug-error": "1.3.2", + "pug-walk": "1.1.5" + } + }, + "pug-load": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.9.tgz", + "integrity": "sha512-BDdZOCru4mg+1MiZwRQZh25+NTRo/R6/qArrdWIf308rHtWA5N9kpoUskRe4H6FslaQujC+DigH9LqlBA4gf6Q==", + "requires": { + "object-assign": "4.1.1", + "pug-walk": "1.1.5" + } + }, + "pug-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-4.0.0.tgz", + "integrity": "sha512-ocEUFPdLG9awwFj0sqi1uiZLNvfoodCMULZzkRqILryIWc/UUlDlxqrKhKjAIIGPX/1SNsvxy63+ayEGocGhQg==", + "requires": { + "pug-error": "1.3.2", + "token-stream": "0.0.1" + } + }, + "pug-runtime": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.3.tgz", + "integrity": "sha1-mBYmB7D86eJU1CfzOYelrucWi9o=" + }, + "pug-strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.2.tgz", + "integrity": "sha1-0xOvoBvMN0mA4TmeI+vy65vchRM=", + "requires": { + "pug-error": "1.3.2" + } + }, + "pug-walk": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.5.tgz", + "integrity": "sha512-rJlH1lXerCIAtImXBze3dtKq/ykZMA4rpO9FnPcIgsWcxZLOvd8zltaoeOVFyBSSqCkhhJWbEbTMga8UxWUUSA==" + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", + "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=", + "requires": { + "bytes": "2.4.0", + "iconv-lite": "0.4.15", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz", + "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=", + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", + "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.2.7", + "set-immediate-shim": "1.0.1" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regexp-clone": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", + "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" + }, + "registry-auth-token": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", + "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "dev": true, + "requires": { + "rc": "1.2.2", + "safe-buffer": "5.1.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "1.2.2" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "2.0.0", + "semver": "5.4.1" + } + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "0.1.4" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "5.4.1" + } + }, + "send": { + "version": "0.15.6", + "resolved": "https://registry.npmjs.org/send/-/send-0.15.6.tgz", + "integrity": "sha1-IPI6nJJbdiq4JwX+L52yUqzkfjQ=", + "requires": { + "debug": "2.6.9", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.3.4", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "serve-favicon": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.5.tgz", + "integrity": "sha512-s7F8h2NrslMkG50KxvlGdj+ApSwaLex0vexuJ9iFf3GLTIp1ph/l1qZvRe9T9TJEYZgmq72ZwJ2VYiAEtChknw==", + "requires": { + "etag": "1.8.1", + "fresh": "0.5.2", + "ms": "2.0.0", + "parseurl": "1.3.2", + "safe-buffer": "5.1.1" + } + }, + "serve-static": { + "version": "1.12.6", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.6.tgz", + "integrity": "sha1-uXN3P2NEmTTaVOW+ul4x2fQhFXc=", + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.15.6" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "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=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "1.0.1" + } + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "0.1.1" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "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=", + "dev": true + }, + "superagent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-2.3.0.tgz", + "integrity": "sha1-cDUpoHFOV+EjlZ3e+84ZOy5Q0RU=", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "cookiejar": "2.0.6", + "debug": "2.6.9", + "extend": "3.0.1", + "form-data": "1.0.0-rc4", + "formidable": "1.1.1", + "methods": "1.1.2", + "mime": "1.3.4", + "qs": "6.4.0", + "readable-stream": "2.2.7" + } + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "0.7.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "token-stream": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", + "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "1.0.10" + } + }, + "type-detect": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", + "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", + "dev": true + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "undefsafe": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz", + "integrity": "sha1-7Mo6A+VrmvFzhbqsgSrIO5lKli8=", + "dev": true + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "update-notifier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", + "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", + "dev": true, + "requires": { + "boxen": "1.2.2", + "chalk": "2.3.0", + "configstore": "3.1.1", + "import-lazy": "2.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "1.0.4" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + }, + "validator": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz", + "integrity": "sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "widest-line": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", + "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "dev": true, + "requires": { + "string-width": "1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "with": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", + "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=", + "requires": { + "acorn": "3.3.0", + "acorn-globals": "3.1.0" + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } +} From 084c3b58e46ad83cdbac5c13bdfb15b15e30f80c Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 30 Oct 2017 15:47:30 +0900 Subject: [PATCH 02/81] Added IntelliJ ignores to .gitignore. Added lock file. --- .gitignore | 1 + package-lock.json | 3578 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 3579 insertions(+) create mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index c56a9e6..a1779a1 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,4 @@ Session.vim tags # End of https://www.gitignore.io/api/node +.idea/ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f97401c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3578 @@ +{ + "name": "ltc-attendance", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" + }, + "acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "2.1.1" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "assertion-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", + "dev": true + }, + "async": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", + "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", + "requires": { + "lodash": "4.17.4" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "basic-auth": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz", + "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=" + }, + "binary-extensions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", + "dev": true + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "body-parser": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", + "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=", + "requires": { + "bytes": "2.4.0", + "content-type": "1.0.4", + "debug": "2.6.7", + "depd": "1.1.1", + "http-errors": "1.6.2", + "iconv-lite": "0.4.15", + "on-finished": "2.3.0", + "qs": "6.4.0", + "raw-body": "2.2.0", + "type-is": "1.6.15" + }, + "dependencies": { + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "boxen": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.2.tgz", + "integrity": "sha1-Px1AMsMP/qnUsCwyLq8up0HcvOU=", + "dev": true, + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.3.0", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "bson": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", + "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "bytes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "1.0.2", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.3" + } + }, + "chai-http": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-3.0.0.tgz", + "integrity": "sha1-VGDYA24fGhKwtbXL1Snm3B0x60s=", + "dev": true, + "requires": { + "cookiejar": "2.0.6", + "is-ip": "1.0.0", + "methods": "1.1.2", + "qs": "6.4.0", + "superagent": "2.3.0" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", + "requires": { + "is-regex": "1.0.4" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.2", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", + "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", + "requires": { + "commander": "2.8.1", + "source-map": "0.4.4" + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "configstore": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", + "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.1.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, + "connect-flash": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/connect-flash/-/connect-flash-0.1.1.tgz", + "integrity": "sha1-2GMPJtlaf4UfmVax6MxnMvO2qjA=" + }, + "constantinople": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.0.tgz", + "integrity": "sha1-dWnKqKo/jVk11i4fqW+fcCzYHHk=", + "requires": { + "acorn": "3.3.0", + "is-expression": "2.1.0" + } + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.0.6.tgz", + "integrity": "sha1-Cr81atANHFohnYjURRgEbdAmrP4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "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" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "4.0.3" + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + }, + "es6-promise": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", + "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" + }, + "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=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "requires": { + "duplexer": "0.1.1", + "from": "0.1.7", + "map-stream": "0.1.0", + "pause-stream": "0.0.11", + "split": "0.3.3", + "stream-combiner": "0.0.4", + "through": "2.3.8" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "express": { + "version": "4.15.5", + "resolved": "https://registry.npmjs.org/express/-/express-4.15.5.tgz", + "integrity": "sha1-ZwI1ypWYiQpa6BcLg9tyK4Qu2Sc=", + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.1", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.0.6", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "1.1.5", + "qs": "6.5.0", + "range-parser": "1.2.0", + "send": "0.15.6", + "serve-static": "1.12.6", + "setprototypeof": "1.0.3", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.0", + "vary": "1.1.2" + }, + "dependencies": { + "qs": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", + "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==" + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "finalhandler": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", + "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "form-data": { + "version": "1.0.0-rc4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", + "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=", + "dev": true, + "requires": { + "async": "1.5.2", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "formidable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", + "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=", + "dev": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.7.0", + "node-pre-gyp": "0.6.36" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.36", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "global-dirs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.0.tgz", + "integrity": "sha1-ENNAOeDfBCcuJizyQiT3IJQ0308=", + "dev": true, + "requires": { + "ini": "1.3.4" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "requires": { + "function-bind": "1.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hooks-fixed": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.2.tgz", + "integrity": "sha512-YurCM4gQSetcrhwEtpQHhQ4M7Zo7poNGqY4kQGeBS6eZtOcT3tnNs01ThFa0jYBByAiYt1MjMjP/YApG0EnAvQ==" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + } + }, + "iconv-lite": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=" + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true + }, + "ip-regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", + "dev": true + }, + "ipaddr.js": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", + "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.10.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-expression": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-2.1.0.tgz", + "integrity": "sha1-kb6dR968/vB3l36XIr5tz7RGXvA=", + "requires": { + "acorn": "3.3.0", + "object-assign": "4.1.1" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "0.1.0", + "is-path-inside": "1.0.0" + } + }, + "is-ip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-1.0.0.tgz", + "integrity": "sha1-K7aVn3l8zW+f3IEnWLy8h8TFkHQ=", + "dev": true, + "requires": { + "ip-regex": "1.0.3" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "1.0.1" + } + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "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=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "jquery": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", + "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" + }, + "js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", + "requires": { + "is-promise": "2.1.0", + "promise": "7.3.1" + } + }, + "kareem": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-1.5.0.tgz", + "integrity": "sha1-4+QQHZ3P3imXadr0tNtk2JXRdEg=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "4.0.1" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, + "lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "dev": true, + "requires": { + "lodash._bindcallback": "3.0.1", + "lodash._isiterateecall": "3.0.9", + "lodash.restparam": "3.6.1" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._createassigner": "3.1.1", + "lodash.keys": "3.1.2" + } + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.defaults": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", + "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", + "dev": true, + "requires": { + "lodash.assign": "3.2.0", + "lodash.restparam": "3.6.1" + } + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", + "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, + "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=" + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "mongodb": { + "version": "2.2.33", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.33.tgz", + "integrity": "sha1-tTfEcdNKZlG0jzb9vyl1A0Dgi1A=", + "requires": { + "es6-promise": "3.2.1", + "mongodb-core": "2.1.17", + "readable-stream": "2.2.7" + } + }, + "mongodb-core": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.17.tgz", + "integrity": "sha1-pBizN6FKFJkPtRC5I97mqBMXPfg=", + "requires": { + "bson": "1.0.4", + "require_optional": "1.0.1" + } + }, + "mongoose": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.12.5.tgz", + "integrity": "sha512-dhCcCfYJjZv95nn4mAIAzj/+o2iR8rIBPOFlWps/STe+wJD53B2sKOpS+UH2bp7CqBHcLnwdRJL6aGJUcWS7kg==", + "requires": { + "async": "2.1.4", + "bson": "1.0.4", + "hooks-fixed": "2.0.2", + "kareem": "1.5.0", + "mongodb": "2.2.33", + "mpath": "0.3.0", + "mpromise": "0.5.5", + "mquery": "2.3.2", + "ms": "2.0.0", + "muri": "1.3.0", + "regexp-clone": "0.0.1", + "sliced": "1.0.1" + } + }, + "mongoose-unique-validator": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-1.0.6.tgz", + "integrity": "sha512-hJf1eiWPw9O5ed7HUtFHtHhqnWDpm42Q5iC3xs6p99kr1qrVMq8WR2x+yobx6rY5F26Ki2NqGvJTe8v/Fax0kw==", + "requires": { + "lodash.foreach": "4.5.0", + "lodash.get": "4.4.2" + } + }, + "morgan": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.8.2.tgz", + "integrity": "sha1-eErHc05KRTqcbm6GgKkyknXItoc=", + "requires": { + "basic-auth": "1.1.0", + "debug": "2.6.8", + "depd": "1.1.1", + "on-finished": "2.3.0", + "on-headers": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "mpath": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.3.0.tgz", + "integrity": "sha1-elj3iem1/TyUUgY0FXlg8mvV70Q=" + }, + "mpromise": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mpromise/-/mpromise-0.5.5.tgz", + "integrity": "sha1-9bJCWddjrMIlewoMjG2Gb9UXMuY=" + }, + "mquery": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-2.3.2.tgz", + "integrity": "sha512-KXWMypZSvhCuqRtza+HMQZdYw7PfFBjBTFvP31NNAq0OX0/NTIgpcDpkWQ2uTxk6vGQtwQ2elhwhs+ZvCA8OaA==", + "requires": { + "bluebird": "3.5.1", + "debug": "2.6.9", + "regexp-clone": "0.0.1", + "sliced": "0.0.5" + }, + "dependencies": { + "sliced": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz", + "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8=" + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "muri": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/muri/-/muri-1.3.0.tgz", + "integrity": "sha512-FiaFwKl864onHFFUV/a2szAl7X0fxVlSKNdhTf+BM8i8goEgYut8u5P9MqQqIYwvaMxjzVESsoEm/2kfkFH1rg==" + }, + "nan": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", + "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", + "dev": true, + "optional": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "nodemon": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.12.1.tgz", + "integrity": "sha1-mWpW3EnZ8Wu/G3ik3gjxNjSzh40=", + "dev": true, + "requires": { + "chokidar": "1.7.0", + "debug": "2.6.9", + "es6-promise": "3.3.1", + "ignore-by-default": "1.0.1", + "lodash.defaults": "3.1.2", + "minimatch": "3.0.4", + "ps-tree": "1.1.0", + "touch": "3.1.0", + "undefsafe": "0.0.3", + "update-notifier": "2.3.0" + }, + "dependencies": { + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", + "dev": true + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.1", + "registry-url": "3.1.0", + "semver": "5.4.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "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=" + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "2.0.6" + } + }, + "proxy-addr": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", + "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.4.0" + } + }, + "ps-tree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", + "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", + "dev": true, + "requires": { + "event-stream": "3.3.4" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "pug": { + "version": "2.0.0-rc.4", + "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.0-rc.4.tgz", + "integrity": "sha512-SL7xovj6E2Loq9N0UgV6ynjMLW4urTFY/L/Fprhvz13Xc5vjzkjZjI1QHKq31200+6PSD8PyU6MqrtCTJj6/XA==", + "requires": { + "pug-code-gen": "2.0.0", + "pug-filters": "2.1.5", + "pug-lexer": "3.1.0", + "pug-linker": "3.0.3", + "pug-load": "2.0.9", + "pug-parser": "4.0.0", + "pug-runtime": "2.0.3", + "pug-strip-comments": "1.0.2" + } + }, + "pug-attrs": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.2.tgz", + "integrity": "sha1-i+KyIlVo/6ddG4Zpgr/59BEa/8s=", + "requires": { + "constantinople": "3.1.0", + "js-stringify": "1.0.2", + "pug-runtime": "2.0.3" + } + }, + "pug-code-gen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.0.tgz", + "integrity": "sha512-E4oiJT+Jn5tyEIloj8dIJQognbiNNp0i0cAJmYtQTFS0soJ917nlIuFtqVss3IXMEyQKUew3F4gIkBpn18KbVg==", + "requires": { + "constantinople": "3.1.0", + "doctypes": "1.1.0", + "js-stringify": "1.0.2", + "pug-attrs": "2.0.2", + "pug-error": "1.3.2", + "pug-runtime": "2.0.3", + "void-elements": "2.0.1", + "with": "5.1.1" + } + }, + "pug-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.2.tgz", + "integrity": "sha1-U659nSm7A89WRJOgJhCfVMR/XyY=" + }, + "pug-filters": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-2.1.5.tgz", + "integrity": "sha512-xkw71KtrC4sxleKiq+cUlQzsiLn8pM5+vCgkChW2E6oNOzaqTSIBKIQ5cl4oheuDzvJYCTSYzRaVinMUrV4YLQ==", + "requires": { + "clean-css": "3.4.28", + "constantinople": "3.1.0", + "jstransformer": "1.0.0", + "pug-error": "1.3.2", + "pug-walk": "1.1.5", + "resolve": "1.5.0", + "uglify-js": "2.8.29" + } + }, + "pug-lexer": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-3.1.0.tgz", + "integrity": "sha1-/QhzdtSmdbT1n4/vQiiDQ06VgaI=", + "requires": { + "character-parser": "2.2.0", + "is-expression": "3.0.0", + "pug-error": "1.3.2" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + }, + "is-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", + "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=", + "requires": { + "acorn": "4.0.13", + "object-assign": "4.1.1" + } + } + } + }, + "pug-linker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.3.tgz", + "integrity": "sha512-DCKczglCXOzJ1lr4xUj/lVHYvS+lGmR2+KTCjZjtIpdwaN7lNOoX2SW6KFX5X4ElvW+6ThwB+acSUg08UJFN5A==", + "requires": { + "pug-error": "1.3.2", + "pug-walk": "1.1.5" + } + }, + "pug-load": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.9.tgz", + "integrity": "sha512-BDdZOCru4mg+1MiZwRQZh25+NTRo/R6/qArrdWIf308rHtWA5N9kpoUskRe4H6FslaQujC+DigH9LqlBA4gf6Q==", + "requires": { + "object-assign": "4.1.1", + "pug-walk": "1.1.5" + } + }, + "pug-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-4.0.0.tgz", + "integrity": "sha512-ocEUFPdLG9awwFj0sqi1uiZLNvfoodCMULZzkRqILryIWc/UUlDlxqrKhKjAIIGPX/1SNsvxy63+ayEGocGhQg==", + "requires": { + "pug-error": "1.3.2", + "token-stream": "0.0.1" + } + }, + "pug-runtime": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.3.tgz", + "integrity": "sha1-mBYmB7D86eJU1CfzOYelrucWi9o=" + }, + "pug-strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.2.tgz", + "integrity": "sha1-0xOvoBvMN0mA4TmeI+vy65vchRM=", + "requires": { + "pug-error": "1.3.2" + } + }, + "pug-walk": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.5.tgz", + "integrity": "sha512-rJlH1lXerCIAtImXBze3dtKq/ykZMA4rpO9FnPcIgsWcxZLOvd8zltaoeOVFyBSSqCkhhJWbEbTMga8UxWUUSA==" + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", + "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=", + "requires": { + "bytes": "2.4.0", + "iconv-lite": "0.4.15", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz", + "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=", + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", + "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.2.7", + "set-immediate-shim": "1.0.1" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regexp-clone": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", + "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" + }, + "registry-auth-token": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", + "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "dev": true, + "requires": { + "rc": "1.2.2", + "safe-buffer": "5.1.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "1.2.2" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "2.0.0", + "semver": "5.4.1" + } + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "0.1.4" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "5.4.1" + } + }, + "send": { + "version": "0.15.6", + "resolved": "https://registry.npmjs.org/send/-/send-0.15.6.tgz", + "integrity": "sha1-IPI6nJJbdiq4JwX+L52yUqzkfjQ=", + "requires": { + "debug": "2.6.9", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.3.4", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "serve-favicon": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.5.tgz", + "integrity": "sha512-s7F8h2NrslMkG50KxvlGdj+ApSwaLex0vexuJ9iFf3GLTIp1ph/l1qZvRe9T9TJEYZgmq72ZwJ2VYiAEtChknw==", + "requires": { + "etag": "1.8.1", + "fresh": "0.5.2", + "ms": "2.0.0", + "parseurl": "1.3.2", + "safe-buffer": "5.1.1" + } + }, + "serve-static": { + "version": "1.12.6", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.6.tgz", + "integrity": "sha1-uXN3P2NEmTTaVOW+ul4x2fQhFXc=", + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.15.6" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "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=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "1.0.1" + } + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "0.1.1" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "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=", + "dev": true + }, + "superagent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-2.3.0.tgz", + "integrity": "sha1-cDUpoHFOV+EjlZ3e+84ZOy5Q0RU=", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "cookiejar": "2.0.6", + "debug": "2.6.9", + "extend": "3.0.1", + "form-data": "1.0.0-rc4", + "formidable": "1.1.1", + "methods": "1.1.2", + "mime": "1.3.4", + "qs": "6.4.0", + "readable-stream": "2.2.7" + } + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "0.7.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "token-stream": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", + "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "1.0.10" + } + }, + "type-detect": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", + "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", + "dev": true + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "undefsafe": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz", + "integrity": "sha1-7Mo6A+VrmvFzhbqsgSrIO5lKli8=", + "dev": true + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "update-notifier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", + "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", + "dev": true, + "requires": { + "boxen": "1.2.2", + "chalk": "2.3.0", + "configstore": "3.1.1", + "import-lazy": "2.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "1.0.4" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + }, + "validator": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz", + "integrity": "sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "widest-line": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", + "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "dev": true, + "requires": { + "string-width": "1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "with": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", + "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=", + "requires": { + "acorn": "3.3.0", + "acorn-globals": "3.1.0" + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } +} From ee984e5d2ca988308d547334435fced6d0b7fadb Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 30 Oct 2017 16:14:22 +0900 Subject: [PATCH 03/81] Updated readme. Updated package files --- README.md | 79 ++++++++++++++++++++++++++---------------- package-lock.json | 88 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 8 ++--- 3 files changed, 141 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index c36c6f5..66dd4cd 100644 --- a/README.md +++ b/README.md @@ -2,43 +2,62 @@ # Learn Teach Code Attendance Tracker -## Track Attendance +This is a tool to help Learn Teach Code track and manage attendance to meetup events. -## Award Badges +See Issues for the features we're working on. -## Display Leaderboard +## Setup instructions -## Basic live messaging +We'll assume you have no experience with NodeJS or the ecosystem. +### Mac +1. [Install brew](https://brew.sh/) + * `/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"` +2. [Install NodeJS](https://nodejs.org/en/download/package-manager/#macos) + * `brew install node` +3. [Install MongoDB](https://treehouse.github.io/installation-guides/mac/mongo-mac.html) + 1. `brew install mongodb` + 2. `sudo mkdir -p /data/db` + 3. `sudo chown -R $(id -un) /data/db` +4. Install dependencies + * In the project directory, `npm install` +5. Run MongoDB + * `mongod` +6. Run in dev mode + * `npm run dev` -Collections -> +The server runs on port 3000, so you can visit it at [`http://localhost:3000`](http://localhost:3000) -[Users] --_id --email --level --name (optional) +## Testing -[UsersClasses] --_id --user_id --course_id --date +The testing database is set to `mongodb://localhost/test-database`, so MongoDB should be for your tests -[Lecture] --_id --course_id --time --location --url +npm test => runs all tests once +npm run test-watch => runs all tests each time a change is saved -[Course] --_id --title --description -## Testing instructions -testing database is set to mongodb://localhost/test-database -so mongo needs to be running in order to run tests -npm test => runs all tests once -npm run test-watch => runs all tests each time a change is saved +## Application Design +### Collections +#### Users +* _id +* email +* level +* name (optional) + +#### UsersClasses +* _id +* user_id +* course_id +* date + +#### Lecture +* _id +* course_id +* time +* location +* url + +#### Course +* _id +* title +* description diff --git a/package-lock.json b/package-lock.json index f97401c..db25832 100644 --- a/package-lock.json +++ b/package-lock.json @@ -150,6 +150,11 @@ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz", "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=" }, + "bcrypt-nodejs": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/bcrypt-nodejs/-/bcrypt-nodejs-0.0.3.tgz", + "integrity": "sha1-xgkX8m3CNWYVZsaBBhwwPCsohCs=" + }, "binary-extensions": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", @@ -243,6 +248,11 @@ "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" }, + "buffer-crc32": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz", + "integrity": "sha1-vj5TgvwCttYySVasGvmKqYsIU0w=" + }, "buffer-shims": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", @@ -730,6 +740,36 @@ } } }, + "express-session": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.0.4.tgz", + "integrity": "sha1-oQBFrz8kaTycGbGRShHQyrj3sps=", + "requires": { + "buffer-crc32": "0.2.1", + "cookie": "0.1.2", + "cookie-signature": "1.0.3", + "debug": "0.8.1", + "uid2": "0.0.3", + "utils-merge": "1.0.0" + }, + "dependencies": { + "cookie": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", + "integrity": "sha1-cv7D0k5Io0Mgc9kMEmQgBQYQBLE=" + }, + "cookie-signature": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.3.tgz", + "integrity": "sha1-kc2ZfMUftkFZVzjGnNoCAyj1D/k=" + }, + "debug": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz", + "integrity": "sha1-IP9NJvXkIstoobrLu2EDmtjBwTA=" + } + } + }, "extend": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", @@ -2334,6 +2374,21 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "method-override": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-1.0.2.tgz", + "integrity": "sha1-1vgCddsjojOAAoySFbl0cL4B1ok=", + "requires": { + "methods": "1.0.0" + }, + "dependencies": { + "methods": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.0.0.tgz", + "integrity": "sha1-mnPYY3XfzvJu9hyj5Lii4lOKgOM=" + } + } + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -2692,6 +2747,24 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, + "passport": { + "version": "0.1.18", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.1.18.tgz", + "integrity": "sha1-yCZEedy2QUytu2Z1LRKzfgtlJaE=", + "requires": { + "pause": "0.0.1", + "pkginfo": "0.2.3" + } + }, + "passport-local": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-0.1.6.tgz", + "integrity": "sha1-+wz4KASNuTG2fRmYXHqgbdN3qds=", + "requires": { + "passport": "0.1.18", + "pkginfo": "0.2.3" + } + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -2726,6 +2799,11 @@ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, "pause-stream": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", @@ -2741,6 +2819,11 @@ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, + "pkginfo": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.2.3.tgz", + "integrity": "sha1-cjnEKl72wwuPMoQ52bn/cQQkkPg=" + }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", @@ -3383,6 +3466,11 @@ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "optional": true }, + "uid2": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", + "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" + }, "undefsafe": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz", diff --git a/package.json b/package.json index 90d129a..0c01df0 100644 --- a/package.json +++ b/package.json @@ -21,11 +21,11 @@ "pug": "~2.0.0-beta11", "serve-favicon": "~2.4.2", "validator": "^8.0.0", - "passport" : "~0.1.17", - "passport-local" : "~0.1.6", - "bcrypt-nodejs" : "latest", + "passport": "~0.1.17", + "passport-local": "~0.1.6", + "bcrypt-nodejs": "latest", "method-override": "~1.0.0", - "express-session": "~1.0.0" + "express-session": "~1.0.0" }, "devDependencies": { "chai": "^4.0.2", From afd051a2f162e8eb086e6485d37beca7ee82aa5f Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 30 Oct 2017 16:14:22 +0900 Subject: [PATCH 04/81] Updated readme. Updated package files --- README.md | 79 ++++++++++++++++++++++++++---------------- package-lock.json | 88 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 8 ++--- 3 files changed, 141 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index c36c6f5..66dd4cd 100644 --- a/README.md +++ b/README.md @@ -2,43 +2,62 @@ # Learn Teach Code Attendance Tracker -## Track Attendance +This is a tool to help Learn Teach Code track and manage attendance to meetup events. -## Award Badges +See Issues for the features we're working on. -## Display Leaderboard +## Setup instructions -## Basic live messaging +We'll assume you have no experience with NodeJS or the ecosystem. +### Mac +1. [Install brew](https://brew.sh/) + * `/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"` +2. [Install NodeJS](https://nodejs.org/en/download/package-manager/#macos) + * `brew install node` +3. [Install MongoDB](https://treehouse.github.io/installation-guides/mac/mongo-mac.html) + 1. `brew install mongodb` + 2. `sudo mkdir -p /data/db` + 3. `sudo chown -R $(id -un) /data/db` +4. Install dependencies + * In the project directory, `npm install` +5. Run MongoDB + * `mongod` +6. Run in dev mode + * `npm run dev` -Collections -> +The server runs on port 3000, so you can visit it at [`http://localhost:3000`](http://localhost:3000) -[Users] --_id --email --level --name (optional) +## Testing -[UsersClasses] --_id --user_id --course_id --date +The testing database is set to `mongodb://localhost/test-database`, so MongoDB should be for your tests -[Lecture] --_id --course_id --time --location --url +npm test => runs all tests once +npm run test-watch => runs all tests each time a change is saved -[Course] --_id --title --description -## Testing instructions -testing database is set to mongodb://localhost/test-database -so mongo needs to be running in order to run tests -npm test => runs all tests once -npm run test-watch => runs all tests each time a change is saved +## Application Design +### Collections +#### Users +* _id +* email +* level +* name (optional) + +#### UsersClasses +* _id +* user_id +* course_id +* date + +#### Lecture +* _id +* course_id +* time +* location +* url + +#### Course +* _id +* title +* description diff --git a/package-lock.json b/package-lock.json index f97401c..db25832 100644 --- a/package-lock.json +++ b/package-lock.json @@ -150,6 +150,11 @@ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz", "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=" }, + "bcrypt-nodejs": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/bcrypt-nodejs/-/bcrypt-nodejs-0.0.3.tgz", + "integrity": "sha1-xgkX8m3CNWYVZsaBBhwwPCsohCs=" + }, "binary-extensions": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", @@ -243,6 +248,11 @@ "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" }, + "buffer-crc32": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz", + "integrity": "sha1-vj5TgvwCttYySVasGvmKqYsIU0w=" + }, "buffer-shims": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", @@ -730,6 +740,36 @@ } } }, + "express-session": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.0.4.tgz", + "integrity": "sha1-oQBFrz8kaTycGbGRShHQyrj3sps=", + "requires": { + "buffer-crc32": "0.2.1", + "cookie": "0.1.2", + "cookie-signature": "1.0.3", + "debug": "0.8.1", + "uid2": "0.0.3", + "utils-merge": "1.0.0" + }, + "dependencies": { + "cookie": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", + "integrity": "sha1-cv7D0k5Io0Mgc9kMEmQgBQYQBLE=" + }, + "cookie-signature": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.3.tgz", + "integrity": "sha1-kc2ZfMUftkFZVzjGnNoCAyj1D/k=" + }, + "debug": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz", + "integrity": "sha1-IP9NJvXkIstoobrLu2EDmtjBwTA=" + } + } + }, "extend": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", @@ -2334,6 +2374,21 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "method-override": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-1.0.2.tgz", + "integrity": "sha1-1vgCddsjojOAAoySFbl0cL4B1ok=", + "requires": { + "methods": "1.0.0" + }, + "dependencies": { + "methods": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.0.0.tgz", + "integrity": "sha1-mnPYY3XfzvJu9hyj5Lii4lOKgOM=" + } + } + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -2692,6 +2747,24 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, + "passport": { + "version": "0.1.18", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.1.18.tgz", + "integrity": "sha1-yCZEedy2QUytu2Z1LRKzfgtlJaE=", + "requires": { + "pause": "0.0.1", + "pkginfo": "0.2.3" + } + }, + "passport-local": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-0.1.6.tgz", + "integrity": "sha1-+wz4KASNuTG2fRmYXHqgbdN3qds=", + "requires": { + "passport": "0.1.18", + "pkginfo": "0.2.3" + } + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -2726,6 +2799,11 @@ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, "pause-stream": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", @@ -2741,6 +2819,11 @@ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, + "pkginfo": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.2.3.tgz", + "integrity": "sha1-cjnEKl72wwuPMoQ52bn/cQQkkPg=" + }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", @@ -3383,6 +3466,11 @@ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "optional": true }, + "uid2": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", + "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" + }, "undefsafe": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz", diff --git a/package.json b/package.json index 90d129a..0c01df0 100644 --- a/package.json +++ b/package.json @@ -21,11 +21,11 @@ "pug": "~2.0.0-beta11", "serve-favicon": "~2.4.2", "validator": "^8.0.0", - "passport" : "~0.1.17", - "passport-local" : "~0.1.6", - "bcrypt-nodejs" : "latest", + "passport": "~0.1.17", + "passport-local": "~0.1.6", + "bcrypt-nodejs": "latest", "method-override": "~1.0.0", - "express-session": "~1.0.0" + "express-session": "~1.0.0" }, "devDependencies": { "chai": "^4.0.2", From d5891995113852c34dd62cb86cb6b43a930171d4 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 30 Oct 2017 16:19:06 +0900 Subject: [PATCH 05/81] Fixed formatting --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 66dd4cd..b542494 100644 --- a/README.md +++ b/README.md @@ -11,19 +11,19 @@ See Issues for the features we're working on. We'll assume you have no experience with NodeJS or the ecosystem. ### Mac 1. [Install brew](https://brew.sh/) - * `/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"` + * `/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"` 2. [Install NodeJS](https://nodejs.org/en/download/package-manager/#macos) - * `brew install node` + * `brew install node` 3. [Install MongoDB](https://treehouse.github.io/installation-guides/mac/mongo-mac.html) - 1. `brew install mongodb` - 2. `sudo mkdir -p /data/db` - 3. `sudo chown -R $(id -un) /data/db` + 1. `brew install mongodb` + 2. `sudo mkdir -p /data/db` + 3. `sudo chown -R $(id -un) /data/db` 4. Install dependencies - * In the project directory, `npm install` + * In the project directory, `npm install` 5. Run MongoDB - * `mongod` + * `mongod` 6. Run in dev mode - * `npm run dev` + * `npm run dev` The server runs on port 3000, so you can visit it at [`http://localhost:3000`](http://localhost:3000) From 7e347e031b40c4140ccc706613c1dce0e235cfe3 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 30 Oct 2017 16:19:06 +0900 Subject: [PATCH 06/81] Fixed formatting --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 66dd4cd..b542494 100644 --- a/README.md +++ b/README.md @@ -11,19 +11,19 @@ See Issues for the features we're working on. We'll assume you have no experience with NodeJS or the ecosystem. ### Mac 1. [Install brew](https://brew.sh/) - * `/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"` + * `/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"` 2. [Install NodeJS](https://nodejs.org/en/download/package-manager/#macos) - * `brew install node` + * `brew install node` 3. [Install MongoDB](https://treehouse.github.io/installation-guides/mac/mongo-mac.html) - 1. `brew install mongodb` - 2. `sudo mkdir -p /data/db` - 3. `sudo chown -R $(id -un) /data/db` + 1. `brew install mongodb` + 2. `sudo mkdir -p /data/db` + 3. `sudo chown -R $(id -un) /data/db` 4. Install dependencies - * In the project directory, `npm install` + * In the project directory, `npm install` 5. Run MongoDB - * `mongod` + * `mongod` 6. Run in dev mode - * `npm run dev` + * `npm run dev` The server runs on port 3000, so you can visit it at [`http://localhost:3000`](http://localhost:3000) From b93e98d8e38630b9e5b308733b7bdf48d0d741e4 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 30 Oct 2017 16:23:44 +0900 Subject: [PATCH 07/81] Added description of current state --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index b542494..2147fa6 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ This is a tool to help Learn Teach Code track and manage attendance to meetup ev See Issues for the features we're working on. +Currently, the application has no authentication, and anyone can create events or register. The application is not yet ready for production, but the core features of event creation and attendance marking are there. + ## Setup instructions We'll assume you have no experience with NodeJS or the ecosystem. From fbabeb764866fbd2df74288200206a02f8007181 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 30 Oct 2017 16:23:44 +0900 Subject: [PATCH 08/81] Added description of current state --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index b542494..2147fa6 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ This is a tool to help Learn Teach Code track and manage attendance to meetup ev See Issues for the features we're working on. +Currently, the application has no authentication, and anyone can create events or register. The application is not yet ready for production, but the core features of event creation and attendance marking are there. + ## Setup instructions We'll assume you have no experience with NodeJS or the ecosystem. From 14baee1fae1aa72c24c9ba92a28ea58dacf04c80 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 30 Oct 2017 16:29:35 +0900 Subject: [PATCH 09/81] Reformatted models files --- models/Course.js | 48 ++++++++++++------------ models/User.js | 96 +++++++++++++++++++++++------------------------ models/checkIn.js | 18 ++++----- models/session.js | 22 +++++------ 4 files changed, 92 insertions(+), 92 deletions(-) diff --git a/models/Course.js b/models/Course.js index 505377d..b2c5812 100644 --- a/models/Course.js +++ b/models/Course.js @@ -1,30 +1,30 @@ const mongoose = require('mongoose'); const courseSchema = new mongoose.Schema({ - title: { - type: String, - required: [true, 'Title is required'], - validate: { - validator: (title) => title.length > 1 && title.length < 100, - message: 'Title must be valid length' - } - }, - description: { - type: String, - validate: { - validator: (description) => - description.length > 2 && description.length < 10000, - message: 'Description must be valid length' - } - }, - tags: [String], - createdAt: { type: Date, default: Date.now }, - instructors: [ - { - type: mongoose.Schema.Types.ObjectId, - ref: 'user' - } - ] + title: { + type: String, + required: [true, 'Title is required'], + validate: { + validator: (title) => title.length > 1 && title.length < 100, + message: 'Title must be valid length' + } + }, + description: { + type: String, + validate: { + validator: (description) => + description.length > 2 && description.length < 10000, + message: 'Description must be valid length' + } + }, + tags: [String], + createdAt: {type: Date, default: Date.now}, + instructors: [ + { + type: mongoose.Schema.Types.ObjectId, + ref: 'user' + } + ] }); const Course = mongoose.model('course', courseSchema) diff --git a/models/User.js b/models/User.js index 8227383..ce4409e 100644 --- a/models/User.js +++ b/models/User.js @@ -3,54 +3,54 @@ const validator = require('validator'); const uniqueValidator = require('mongoose-unique-validator') const userSchema = new mongoose.Schema({ - name: { - type: String, - validate: { - validator: (name) => name.length > 2 && name.length < 100, - message: 'Name must be valid length' - } - }, - email: { - type: String, - unique: [true, 'Email must be unique'], - validate: { - validator: (email) => validator.isEmail(email), - message: 'Email must be valid' - } - }, - level: { - type: String, - default: 'student', - enum: ['student', 'instructor', 'admin'] - }, - website: { - type: String, - validate: { - validator: (website) => validator.isURL(website), - message: 'Website must be valid url' - } - }, - hometown: { - type: String, - default: 'hometown', - validate: { - validator: (hometown) => hometown.length < 100, - message: 'Hometown must be less than 100 characters' - } - }, - description: { - type: String, - validate: { - validator: (description) => description.length < 1000, - message: 'Description must be less than 1000 characters' - } - }, - checkIns: [ - { - type: mongoose.Schema.Types.ObjectId, - ref: 'checkIn' - } - ] + name: { + type: String, + validate: { + validator: (name) => name.length > 2 && name.length < 100, + message: 'Name must be valid length' + } + }, + email: { + type: String, + unique: [true, 'Email must be unique'], + validate: { + validator: (email) => validator.isEmail(email), + message: 'Email must be valid' + } + }, + level: { + type: String, + default: 'student', + enum: ['student', 'instructor', 'admin'] + }, + website: { + type: String, + validate: { + validator: (website) => validator.isURL(website), + message: 'Website must be valid url' + } + }, + hometown: { + type: String, + default: 'hometown', + validate: { + validator: (hometown) => hometown.length < 100, + message: 'Hometown must be less than 100 characters' + } + }, + description: { + type: String, + validate: { + validator: (description) => description.length < 1000, + message: 'Description must be less than 1000 characters' + } + }, + checkIns: [ + { + type: mongoose.Schema.Types.ObjectId, + ref: 'checkIn' + } + ] }); userSchema.plugin(uniqueValidator); diff --git a/models/checkIn.js b/models/checkIn.js index a3edd92..955f2c7 100644 --- a/models/checkIn.js +++ b/models/checkIn.js @@ -1,15 +1,15 @@ const mongoose = require('mongoose') const checkInSchema = new mongoose.Schema({ - user: { - type: mongoose.Schema.Types.ObjectId, - ref: 'user' - }, - course: { - type: mongoose.Schema.Types.ObjectId, - ref: 'course' - }, - date: { type: Date, default: Date.now } + user: { + type: mongoose.Schema.Types.ObjectId, + ref: 'user' + }, + course: { + type: mongoose.Schema.Types.ObjectId, + ref: 'course' + }, + date: {type: Date, default: Date.now} }); const CheckIn = mongoose.model('checkIn', checkInSchema); diff --git a/models/session.js b/models/session.js index e39a7f9..8dd11a1 100644 --- a/models/session.js +++ b/models/session.js @@ -1,17 +1,17 @@ const mongoose = require('mongoose') const sessionSchema = new mongoose.Schema({ - sessionOpen: { type: Boolean, default: true}, - date: { type: Date, default: Date.now }, - checkIns: [ - { - type: mongoose.Schema.Types.ObjectId, - ref: 'checkIn' - } - ], - course: { - type: mongoose.Schema.Types.ObjectId, - ref: 'course' + sessionOpen: {type: Boolean, default: true}, + date: {type: Date, default: Date.now}, + checkIns: [ + { + type: mongoose.Schema.Types.ObjectId, + ref: 'checkIn' + } + ], + course: { + type: mongoose.Schema.Types.ObjectId, + ref: 'course' } }); From 88f3214876e68dccba58b7bc0f6f1b4c3b4aeb62 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 30 Oct 2017 17:19:06 +0900 Subject: [PATCH 10/81] Added hashing on save and password method to user model --- models/User.js | 34 ++++++++++++++++++++++++++++++++++ package.json | 13 +++++++------ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/models/User.js b/models/User.js index ce4409e..fbc10e7 100644 --- a/models/User.js +++ b/models/User.js @@ -1,6 +1,10 @@ const mongoose = require('mongoose') const validator = require('validator'); +const bcrypt = require('bcrypt') const uniqueValidator = require('mongoose-unique-validator') +const SALT_WORK_FACTOR = 10; + +// http://devsmash.com/blog/password-authentication-with-mongoose-and-bcrypt const userSchema = new mongoose.Schema({ name: { @@ -18,6 +22,10 @@ const userSchema = new mongoose.Schema({ message: 'Email must be valid' } }, + password: { + type: String, + required: true + }, level: { type: String, default: 'student', @@ -53,6 +61,32 @@ const userSchema = new mongoose.Schema({ ] }); +// Mongoose middleware is not invoked on update() operations, so you must use a save() if you want to update user passwords. +userSchema.pre('save', function(next) { + const user = this; + + if (!user.isModified('password')) return next(); + + bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) { + if (err) return next(err); + + bcrypt.hash(user.password, salt, function(err, hash) { + if (err) return next(err); + + user.password = hash; + next(); + }); + }); +}); + +// add a comparePassword method with callback to our user model +userSchema.methods.comparePassword = function(candidatePassword, cb) { + bcrypt.compare(candidatePassword, this.password, function(err, isMatch) { + if (err) return cb(err); + cb(null, isMatch); + }); +}; + userSchema.plugin(uniqueValidator); const User = mongoose.model('user', userSchema) diff --git a/package.json b/package.json index 90d129a..cd31966 100644 --- a/package.json +++ b/package.json @@ -9,23 +9,24 @@ "test-watch": "nodemon --exec 'npm test'" }, "dependencies": { + "bcrypt": "^1.0.3", + "bcrypt-nodejs": "latest", "body-parser": "~1.17.1", "connect-flash": "^0.1.1", "cookie-parser": "~1.4.3", "debug": "~2.6.3", "express": "~4.15.2", + "express-session": "~1.0.0", "jquery": "^3.2.1", + "method-override": "~1.0.0", "mongoose": "^4.7.2", "mongoose-unique-validator": "^1.0.5", "morgan": "~1.8.1", + "passport": "~0.1.17", + "passport-local": "~0.1.6", "pug": "~2.0.0-beta11", "serve-favicon": "~2.4.2", - "validator": "^8.0.0", - "passport" : "~0.1.17", - "passport-local" : "~0.1.6", - "bcrypt-nodejs" : "latest", - "method-override": "~1.0.0", - "express-session": "~1.0.0" + "validator": "^8.0.0" }, "devDependencies": { "chai": "^4.0.2", From c75c5e017d0bec67a7e1cc4f6bdbef3ae86d5b83 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 30 Oct 2017 17:20:00 +0900 Subject: [PATCH 11/81] Reformatted user model tests --- test/user/modelCreate.test.js | 154 +++++++++++++------------- test/user/modelDestroy.test.js | 44 ++++---- test/user/modelRead.test.js | 16 +-- test/user/modelUpdate.test.js | 158 +++++++++++++-------------- test/user/modelValidations.test.js | 170 ++++++++++++++--------------- test/user/repo.test.js | 134 +++++++++++------------ 6 files changed, 338 insertions(+), 338 deletions(-) diff --git a/test/user/modelCreate.test.js b/test/user/modelCreate.test.js index 7c25c7e..1de9239 100644 --- a/test/user/modelCreate.test.js +++ b/test/user/modelCreate.test.js @@ -5,93 +5,93 @@ const assert = require('assert'); const mongoose = require('mongoose'); describe('User modelCreate', () => { - let joe; + let joe; - beforeEach((done) => { - joe = new User({}); - joe.save() - .then(() => done()); - }); + beforeEach((done) => { + joe = new User({}); + joe.save() + .then(() => done()); + }); - afterEach((done) => { - User.collection.drop(); - CheckIn.collection.drop(); - done(); - }); + afterEach((done) => { + User.collection.drop(); + CheckIn.collection.drop(); + done(); + }); - it('Should create a new User record', (done) => { - assert(!joe.isNew); - done() - }); - - it('Should be able to set Name', (done) => { - joe.name = 'joe'; - joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { - assert(result.name === 'joe'); + it('Should create a new User record', (done) => { + assert(!joe.isNew); done() - }) - }); + }); - it('Should be able to set Description', (done) => { - joe.description = 'I like to surf'; - joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { - assert(result.description === 'I like to surf'); - done() - }) - }); + it('Should be able to set Name', (done) => { + joe.name = 'joe'; + joe.save() + .then(() => User.findOne({_id: joe._id})) + .then((result) => { + assert(result.name === 'joe'); + done() + }) + }); - it('Should be able to set Email', (done) => { - joe.email = 'mail@mail.com'; - joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { - assert(result.email === 'mail@mail.com'); - done() - }) - }); + it('Should be able to set Description', (done) => { + joe.description = 'I like to surf'; + joe.save() + .then(() => User.findOne({_id: joe._id})) + .then((result) => { + assert(result.description === 'I like to surf'); + done() + }) + }); - it('Should be able to set Hometown', (done) => { - joe.hometown = 'Detroit'; - joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { - assert(result.hometown === 'Detroit'); - done() - }) - }); + it('Should be able to set Email', (done) => { + joe.email = 'mail@mail.com'; + joe.save() + .then(() => User.findOne({_id: joe._id})) + .then((result) => { + assert(result.email === 'mail@mail.com'); + done() + }) + }); - it('Should be able to set Website', (done) => { - joe.website = 'mail.com'; - joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { - assert(result.website === 'mail.com'); - done() - }) - }); + it('Should be able to set Hometown', (done) => { + joe.hometown = 'Detroit'; + joe.save() + .then(() => User.findOne({_id: joe._id})) + .then((result) => { + assert(result.hometown === 'Detroit'); + done() + }) + }); - it('Should set Level to student by default', (done) => { - assert(joe.level === 'student'); - done() - }); + it('Should be able to set Website', (done) => { + joe.website = 'mail.com'; + joe.save() + .then(() => User.findOne({_id: joe._id})) + .then((result) => { + assert(result.website === 'mail.com'); + done() + }) + }); - it('Should set Hometown to hometown by default', (done) => { - assert(joe.hometown === 'hometown'); - done() - }); + it('Should set Level to student by default', (done) => { + assert(joe.level === 'student'); + done() + }); - it('Should be able to set CheckIns', (done) => { - const firstCheckIn = new CheckIn({}); - joe.checkIns.push(firstCheckIn); - joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { - assert(String(result.checkIns) === String(firstCheckIn._id)); + it('Should set Hometown to hometown by default', (done) => { + assert(joe.hometown === 'hometown'); done() - }) - }); + }); + + it('Should be able to set CheckIns', (done) => { + const firstCheckIn = new CheckIn({}); + joe.checkIns.push(firstCheckIn); + joe.save() + .then(() => User.findOne({_id: joe._id})) + .then((result) => { + assert(String(result.checkIns) === String(firstCheckIn._id)); + done() + }) + }); }); diff --git a/test/user/modelDestroy.test.js b/test/user/modelDestroy.test.js index 9a94018..b8c7b5f 100644 --- a/test/user/modelDestroy.test.js +++ b/test/user/modelDestroy.test.js @@ -5,28 +5,28 @@ const assert = require('assert'); const mongoose = require('mongoose'); describe('User modelDestroy', () => { - let joe; + let joe; - beforeEach((done) => { - joe = new User({}); - joe.save() - .then(() => done()); - }); - afterEach((done) => { - User.collection.drop(); - Course.collection.drop(); - done(); - }); + beforeEach((done) => { + joe = new User({}); + joe.save() + .then(() => done()); + }); + afterEach((done) => { + User.collection.drop(); + Course.collection.drop(); + done(); + }); - it('Should destroy User recorde', (done) => { - const jane = new User({}) - jane.save() - .then(() => User.remove({_id: joe._id})) - .then(() => User.find({})) - .then((results) => { - assert(results.length === 1); - assert(String(results[0]._id) === String(jane._id)); - done() - }); - }); + it('Should destroy User recorde', (done) => { + const jane = new User({}) + jane.save() + .then(() => User.remove({_id: joe._id})) + .then(() => User.find({})) + .then((results) => { + assert(results.length === 1); + assert(String(results[0]._id) === String(jane._id)); + done() + }); + }); }); diff --git a/test/user/modelRead.test.js b/test/user/modelRead.test.js index 947a9b7..3a2f97b 100644 --- a/test/user/modelRead.test.js +++ b/test/user/modelRead.test.js @@ -5,13 +5,13 @@ const mongoose = require('mongoose'); describe('User modelRead', () => { - it('Should find a User record by _id', (done) => { - const joe = new User({}) - joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { - assert(String(result._id) === String(joe._id)); - done(); + it('Should find a User record by _id', (done) => { + const joe = new User({}) + joe.save() + .then(() => User.findOne({_id: joe._id})) + .then((result) => { + assert(String(result._id) === String(joe._id)); + done(); + }); }); - }); }); diff --git a/test/user/modelUpdate.test.js b/test/user/modelUpdate.test.js index 5eeeed7..521f479 100644 --- a/test/user/modelUpdate.test.js +++ b/test/user/modelUpdate.test.js @@ -5,93 +5,93 @@ const assert = require('assert'); const mongoose = require('mongoose'); describe('User modelUpdate', () => { - let joe; + let joe; - beforeEach((done) => { - const firstCheckIn = new CheckIn({}); - joe = new User({ - name: 'joe', - email: 'mail@mail.com', - checkIns: [{_id: firstCheckIn._id}] + beforeEach((done) => { + const firstCheckIn = new CheckIn({}); + joe = new User({ + name: 'joe', + email: 'mail@mail.com', + checkIns: [{_id: firstCheckIn._id}] + }); + joe.save() + .then(() => done()); }); - joe.save() - .then(() => done()); - }); - afterEach((done) => { - User.collection.drop(); - CheckIn.collection.drop(); - done(); - }); - - it('Should update Name', (done) => { - joe.name = 'jane'; - joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { - assert(result.name === 'jane'); + afterEach((done) => { + User.collection.drop(); + CheckIn.collection.drop(); done(); - }); - }); + }); - it('Should update Email', (done) => { - joe.email = 'm@m.com'; - joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { - assert(result.email === 'm@m.com'); - done(); - }); - }); + it('Should update Name', (done) => { + joe.name = 'jane'; + joe.save() + .then(() => User.findOne({_id: joe._id})) + .then((result) => { + assert(result.name === 'jane'); + done(); + }); + }); - it('Should update Level', (done) => { - joe.level = 'instructor'; - joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { - assert(result.level === 'instructor'); - done(); - }); - }); + it('Should update Email', (done) => { + joe.email = 'm@m.com'; + joe.save() + .then(() => User.findOne({_id: joe._id})) + .then((result) => { + assert(result.email === 'm@m.com'); + done(); + }); + }); - it('Should update Website', (done) => { - joe.website = 'www.github.com'; - joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { - assert(result.website === 'www.github.com'); - done(); - }); - }); + it('Should update Level', (done) => { + joe.level = 'instructor'; + joe.save() + .then(() => User.findOne({_id: joe._id})) + .then((result) => { + assert(result.level === 'instructor'); + done(); + }); + }); - it('Should update Hometown', (done) => { - joe.hometown = 'Capetown, South Africa'; - joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { - assert(result.hometown === 'Capetown, South Africa'); - done(); - }); - }); + it('Should update Website', (done) => { + joe.website = 'www.github.com'; + joe.save() + .then(() => User.findOne({_id: joe._id})) + .then((result) => { + assert(result.website === 'www.github.com'); + done(); + }); + }); - it('Should update Description', (done) => { - joe.description = 'I like to play guitar'; - joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { - assert(result.description === 'I like to play guitar'); - done(); - }); - }); + it('Should update Hometown', (done) => { + joe.hometown = 'Capetown, South Africa'; + joe.save() + .then(() => User.findOne({_id: joe._id})) + .then((result) => { + assert(result.hometown === 'Capetown, South Africa'); + done(); + }); + }); - it('Should update CheckIns', (done) => { - const checkIn2 = new CheckIn({}); - joe.checkIns = [{_id: checkIn2._id}]; - joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { - assert(String(result.checkIns) === String(checkIn2._id)); - done(); - }); - }); + it('Should update Description', (done) => { + joe.description = 'I like to play guitar'; + joe.save() + .then(() => User.findOne({_id: joe._id})) + .then((result) => { + assert(result.description === 'I like to play guitar'); + done(); + }); + }); + + it('Should update CheckIns', (done) => { + const checkIn2 = new CheckIn({}); + joe.checkIns = [{_id: checkIn2._id}]; + joe.save() + .then(() => User.findOne({_id: joe._id})) + .then((result) => { + assert(String(result.checkIns) === String(checkIn2._id)); + done(); + }); + }); }); diff --git a/test/user/modelValidations.test.js b/test/user/modelValidations.test.js index a5988c6..959d105 100644 --- a/test/user/modelValidations.test.js +++ b/test/user/modelValidations.test.js @@ -4,107 +4,107 @@ const assert = require('assert'); const mongoose = require('mongoose'); describe('User modelValidations', () => { - beforeEach((done) => { - const joe = new User({ - name: 'joe', - email: 'mail@mail.com' + beforeEach((done) => { + const joe = new User({ + name: 'joe', + email: 'mail@mail.com' + }); + joe.save((err) => { + done(); + }); }); - joe.save( (err) => { - done(); + + afterEach((done) => { + User.collection.drop(); + done(); }); - }); - afterEach((done) => { - User.collection.drop(); - done(); - }); + it('Should require unique email', (done) => { + const jane = new User({name: 'jane', email: 'mail@mail.com'}) + .save() + .catch((err) => { + const message = err.errors.email.message + assert(message.includes('to be unique')) + done(); + }); + }); - it('Should require unique email', (done) => { - const jane = new User({name: 'jane', email: 'mail@mail.com'}) - .save() - .catch((err) => { - const message = err.errors.email.message - assert(message.includes('to be unique')) - done(); - }); - }); - - it('Should require valid email', (done) => { - const jane = new User({ - name: 'jane', - email: 'mm.' + it('Should require valid email', (done) => { + const jane = new User({ + name: 'jane', + email: 'mm.' + }); + const validationResult = jane.validateSync(); + const message = validationResult.errors.email.message; + assert(message === 'Email must be valid'); + done() }); - const validationResult = jane.validateSync(); - const message = validationResult.errors.email.message; - assert(message === 'Email must be valid'); - done() - }); - it('Should require name to be more than 2 chars', (done) => { - const jo = new User({ - name: 'jo', - email: 'jo@mail.com' + it('Should require name to be more than 2 chars', (done) => { + const jo = new User({ + name: 'jo', + email: 'jo@mail.com' + }); + const validationResult = jo.validateSync(); + const message = validationResult.errors.name.message; + assert(message === 'Name must be valid length'); + done() }); - const validationResult = jo.validateSync(); - const message = validationResult.errors.name.message; - assert(message === 'Name must be valid length'); - done() - }); - it('Should require name to be less then 100 chars', (done) => { - const jo = new User({ - name: 'j'.repeat(100), - email: 'jo@mail.com' + it('Should require name to be less then 100 chars', (done) => { + const jo = new User({ + name: 'j'.repeat(100), + email: 'jo@mail.com' + }); + const validationResult = jo.validateSync(); + const message = validationResult.errors.name.message; + assert(message === 'Name must be valid length'); + done() }); - const validationResult = jo.validateSync(); - const message = validationResult.errors.name.message; - assert(message === 'Name must be valid length'); - done() - }); - it('Should require Description to be less then 1000 chars', (done) => { - const joe = new User({ - name: 'joe', - email: 'jo@mail.com', - description: 'j'.repeat(1000) + it('Should require Description to be less then 1000 chars', (done) => { + const joe = new User({ + name: 'joe', + email: 'jo@mail.com', + description: 'j'.repeat(1000) + }); + const validationResult = joe.validateSync(); + const message = validationResult.errors.description.message; + assert(message === 'Description must be less than 1000 characters'); + done() }); - const validationResult = joe.validateSync(); - const message = validationResult.errors.description.message; - assert(message === 'Description must be less than 1000 characters'); - done() - }); - it('Should require Hometown to be less then 100 chars', (done) => { - const joe = new User({ - name: 'joe', - email: 'jo@mail.com', - hometown: 'j'.repeat(100) + it('Should require Hometown to be less then 100 chars', (done) => { + const joe = new User({ + name: 'joe', + email: 'jo@mail.com', + hometown: 'j'.repeat(100) + }); + const validationResult = joe.validateSync(); + const message = validationResult.errors.hometown.message; + assert(message === 'Hometown must be less than 100 characters'); + done() }); - const validationResult = joe.validateSync(); - const message = validationResult.errors.hometown.message; - assert(message === 'Hometown must be less than 100 characters'); - done() - }); - it('Should require valid level', (done) => { - const joe = new User({ - level: 'dragon' + it('Should require valid level', (done) => { + const joe = new User({ + level: 'dragon' + }); + const validationResult = joe.validateSync(); + const {message} = validationResult.errors.level; + assert(message.includes('not a valid enum')); + done() }); - const validationResult = joe.validateSync(); - const { message } = validationResult.errors.level; - assert(message.includes('not a valid enum')); - done() - }); - it('Should require valid Website url', (done) => { - const jane = new User({ - name: 'jane', - website: 'mm.' + it('Should require valid Website url', (done) => { + const jane = new User({ + name: 'jane', + website: 'mm.' + }); + const validationResult = jane.validateSync(); + const message = validationResult.errors.website.message; + assert(message === 'Website must be valid url'); + done() }); - const validationResult = jane.validateSync(); - const message = validationResult.errors.website.message; - assert(message === 'Website must be valid url'); - done() - }); }); diff --git a/test/user/repo.test.js b/test/user/repo.test.js index f80afae..9e8a4f8 100644 --- a/test/user/repo.test.js +++ b/test/user/repo.test.js @@ -10,90 +10,90 @@ chai.use(chaiHttp); mongoose.connect(config.MONGODB_URI) describe('User Repo routes', () => { - let joe; + let joe; - beforeEach( (done) => { - joe = new User({ - name: 'joe', - email: 'joe@mail.com' - }); + beforeEach((done) => { + joe = new User({ + name: 'joe', + email: 'joe@mail.com' + }); + + tad = new User({ + name: 'tad', + email: 'tad@mail.com' + }); - tad = new User({ - name: 'tad', - email: 'tad@mail.com' + joe.save(() => { + tad.save(() => { + done(); + }); + }); }); - joe.save( () => { - tad.save( () => { + afterEach((done) => { + User.collection.drop(); done(); - }); }); - }); - - afterEach( (done) => { - User.collection.drop(); - done(); - }); - it('should list all users with getUsers()', (done) => { - Repo.getUsers(users => { - const sortedUsers = users.sort(function(a, b) { - if (a.name.toUpperCase() < b.name.toUpperCase()) return -1; - if (a.name.toUpperCase() > b.name.toUpperCase()) return 1; - return 0; - }); - sortedUsers.should.be.a('array'); - sortedUsers[0].should.have.property('_id'); - sortedUsers[0].should.have.property('name').eql('joe'); - sortedUsers[0].should.have.property('email').eql('joe@mail.com'); - sortedUsers[0].should.have.property('level').eql('student'); - sortedUsers.length.should.be.eql(2); - done(); + it('should list all users with getUsers()', (done) => { + Repo.getUsers(users => { + const sortedUsers = users.sort(function (a, b) { + if (a.name.toUpperCase() < b.name.toUpperCase()) return -1; + if (a.name.toUpperCase() > b.name.toUpperCase()) return 1; + return 0; + }); + sortedUsers.should.be.a('array'); + sortedUsers[0].should.have.property('_id'); + sortedUsers[0].should.have.property('name').eql('joe'); + sortedUsers[0].should.have.property('email').eql('joe@mail.com'); + sortedUsers[0].should.have.property('level').eql('student'); + sortedUsers.length.should.be.eql(2); + done(); + }); }); - }); - it('should add new user with createUser()', (done) => { - const jane = new User({name: 'jane', email: 'jane@mail.com'}); - Repo.createUser(jane, newUser => { - newUser.res.should.have.property('name').eql('jane'); - newUser.res.should.have.property('email').eql('jane@mail.com'); - Repo.getUsers(users => { - users.should.be.a('array'); - users.length.should.be.eql(3); - done(); - }); + it('should add new user with createUser()', (done) => { + const jane = new User({name: 'jane', email: 'jane@mail.com'}); + Repo.createUser(jane, newUser => { + newUser.res.should.have.property('name').eql('jane'); + newUser.res.should.have.property('email').eql('jane@mail.com'); + Repo.getUsers(users => { + users.should.be.a('array'); + users.length.should.be.eql(3); + done(); + }); + }); }); - }); - it('should list single user with getUser()', (done) => { - Repo.getUser(joe._id, result => { - result.should.have.property('name').eql('joe'); - done() + it('should list single user with getUser()', (done) => { + Repo.getUser(joe._id, result => { + result.should.have.property('name').eql('joe'); + done() + }); }); - }); - it('should update existing user with updateUser()', (done) => { - const jane = new User({name: 'jane', email: 'jane@mail.com'}); - let toBeUpdated = {email: 'thadious@m.com'} - Repo.createUser(jane, newUser => { - Repo.updateUser(tad._id, toBeUpdated, result => { - Repo.getUser(tad._id, user => { - user.email.should.be.equal('thadious@m.com'); - done(); + it('should update existing user with updateUser()', (done) => { + const jane = new User({name: 'jane', email: 'jane@mail.com'}); + let toBeUpdated = {email: 'thadious@m.com'} + Repo.createUser(jane, newUser => { + Repo.updateUser(tad._id, toBeUpdated, result => { + Repo.getUser(tad._id, user => { + user.email.should.be.equal('thadious@m.com'); + done(); + }); + }) }); - }) }); - }); - it('should delete existing user with deleteUser()', (done) => { - Repo.getUsers(users => { - users.length.should.be.eql(2); - Repo.deleteUser(joe._id, result => { + it('should delete existing user with deleteUser()', (done) => { Repo.getUsers(users => { - users.length.should.be.eql(1); - done(); + users.length.should.be.eql(2); + Repo.deleteUser(joe._id, result => { + Repo.getUsers(users => { + users.length.should.be.eql(1); + done(); + }); + }); }); - }); }); - }); }); From 6823dc244bb11b5a5b55f87c2a2d5180ff753e57 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 30 Oct 2017 18:11:49 +0900 Subject: [PATCH 12/81] Fixed model destruction test --- test/user/modelDestroy.test.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/test/user/modelDestroy.test.js b/test/user/modelDestroy.test.js index b8c7b5f..6c57fcc 100644 --- a/test/user/modelDestroy.test.js +++ b/test/user/modelDestroy.test.js @@ -8,7 +8,10 @@ describe('User modelDestroy', () => { let joe; beforeEach((done) => { - joe = new User({}); + joe = new User({ + name: 'joe', + password: 'mypass' + }); joe.save() .then(() => done()); }); @@ -18,8 +21,11 @@ describe('User modelDestroy', () => { done(); }); - it('Should destroy User recorde', (done) => { - const jane = new User({}) + it('Should destroy User record', (done) => { + const jane = new User({ + name: 'jane', + password: 'otherpass' + }) jane.save() .then(() => User.remove({_id: joe._id})) .then(() => User.find({})) @@ -27,6 +33,7 @@ describe('User modelDestroy', () => { assert(results.length === 1); assert(String(results[0]._id) === String(jane._id)); done() - }); + }) + .catch(done); }); }); From 12e645749b9ced1450b6cf08687be222277e9635 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 30 Oct 2017 18:14:24 +0900 Subject: [PATCH 13/81] Fixed model creation tests --- test/user/modelCreate.test.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/test/user/modelCreate.test.js b/test/user/modelCreate.test.js index 1de9239..9fe7d5b 100644 --- a/test/user/modelCreate.test.js +++ b/test/user/modelCreate.test.js @@ -8,7 +8,10 @@ describe('User modelCreate', () => { let joe; beforeEach((done) => { - joe = new User({}); + joe = new User({ + name: 'joe', + password: 'mypass' + }); joe.save() .then(() => done()); }); @@ -32,6 +35,7 @@ describe('User modelCreate', () => { assert(result.name === 'joe'); done() }) + .catch(done); }); it('Should be able to set Description', (done) => { @@ -42,6 +46,7 @@ describe('User modelCreate', () => { assert(result.description === 'I like to surf'); done() }) + .catch(done); }); it('Should be able to set Email', (done) => { @@ -52,6 +57,7 @@ describe('User modelCreate', () => { assert(result.email === 'mail@mail.com'); done() }) + .catch(done); }); it('Should be able to set Hometown', (done) => { @@ -62,6 +68,7 @@ describe('User modelCreate', () => { assert(result.hometown === 'Detroit'); done() }) + .catch(done); }); it('Should be able to set Website', (done) => { @@ -72,6 +79,7 @@ describe('User modelCreate', () => { assert(result.website === 'mail.com'); done() }) + .catch(done); }); it('Should set Level to student by default', (done) => { @@ -93,5 +101,6 @@ describe('User modelCreate', () => { assert(String(result.checkIns) === String(firstCheckIn._id)); done() }) + .catch(done); }); }); From 09313e83d4b7028cfc9be9b73e2d81027025ae0b Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 30 Oct 2017 18:15:36 +0900 Subject: [PATCH 14/81] Removed unnecessary requires in create and destroy tests --- test/user/modelCreate.test.js | 2 -- test/user/modelDestroy.test.js | 2 -- 2 files changed, 4 deletions(-) diff --git a/test/user/modelCreate.test.js b/test/user/modelCreate.test.js index 9fe7d5b..bdaa5f3 100644 --- a/test/user/modelCreate.test.js +++ b/test/user/modelCreate.test.js @@ -1,8 +1,6 @@ const User = require('../../models/User'); const CheckIn = require('../../models/checkIn'); -const config = require('../config.test.js'); const assert = require('assert'); -const mongoose = require('mongoose'); describe('User modelCreate', () => { let joe; diff --git a/test/user/modelDestroy.test.js b/test/user/modelDestroy.test.js index 6c57fcc..0affb78 100644 --- a/test/user/modelDestroy.test.js +++ b/test/user/modelDestroy.test.js @@ -1,8 +1,6 @@ const User = require('../../models/User'); const Course = require('../../models/Course'); -const config = require('../config.test.js'); const assert = require('assert'); -const mongoose = require('mongoose'); describe('User modelDestroy', () => { let joe; From 9cc9a409b7e252e617ccae2d08bd0e491af2b5a9 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 30 Oct 2017 18:23:12 +0900 Subject: [PATCH 15/81] Fixed tests to show errors properly. Added name as required to User --- models/User.js | 3 ++- test/user/modelCreate.test.js | 3 ++- test/user/modelDestroy.test.js | 3 ++- test/user/modelRead.test.js | 10 ++++++---- test/user/modelUpdate.test.js | 6 +++--- test/user/modelValidations.test.js | 13 ++++++------- test/user/repo.test.js | 1 - 7 files changed, 21 insertions(+), 18 deletions(-) diff --git a/models/User.js b/models/User.js index fbc10e7..4f9cd75 100644 --- a/models/User.js +++ b/models/User.js @@ -12,7 +12,8 @@ const userSchema = new mongoose.Schema({ validate: { validator: (name) => name.length > 2 && name.length < 100, message: 'Name must be valid length' - } + }, + required: true }, email: { type: String, diff --git a/test/user/modelCreate.test.js b/test/user/modelCreate.test.js index bdaa5f3..d103115 100644 --- a/test/user/modelCreate.test.js +++ b/test/user/modelCreate.test.js @@ -11,7 +11,8 @@ describe('User modelCreate', () => { password: 'mypass' }); joe.save() - .then(() => done()); + .then(() => done()) + .catch(done); }); afterEach((done) => { diff --git a/test/user/modelDestroy.test.js b/test/user/modelDestroy.test.js index 0affb78..23aea9a 100644 --- a/test/user/modelDestroy.test.js +++ b/test/user/modelDestroy.test.js @@ -11,7 +11,8 @@ describe('User modelDestroy', () => { password: 'mypass' }); joe.save() - .then(() => done()); + .then(() => done()) + .catch(done); }); afterEach((done) => { User.collection.drop(); diff --git a/test/user/modelRead.test.js b/test/user/modelRead.test.js index 3a2f97b..339a371 100644 --- a/test/user/modelRead.test.js +++ b/test/user/modelRead.test.js @@ -1,17 +1,19 @@ const User = require('../../models/User'); -const config = require('../config.test.js'); const assert = require('assert'); -const mongoose = require('mongoose'); describe('User modelRead', () => { it('Should find a User record by _id', (done) => { - const joe = new User({}) + const joe = new User({ + name: 'joe', + password: 'mypass' + }); joe.save() .then(() => User.findOne({_id: joe._id})) .then((result) => { assert(String(result._id) === String(joe._id)); done(); - }); + }) + .catch(done); }); }); diff --git a/test/user/modelUpdate.test.js b/test/user/modelUpdate.test.js index 521f479..10124c4 100644 --- a/test/user/modelUpdate.test.js +++ b/test/user/modelUpdate.test.js @@ -1,8 +1,6 @@ const User = require('../../models/User'); const CheckIn = require('../../models/checkIn'); -const config = require('../config.test.js'); const assert = require('assert'); -const mongoose = require('mongoose'); describe('User modelUpdate', () => { let joe; @@ -12,10 +10,12 @@ describe('User modelUpdate', () => { joe = new User({ name: 'joe', email: 'mail@mail.com', + password: 'mypass', checkIns: [{_id: firstCheckIn._id}] }); joe.save() - .then(() => done()); + .then(() => done()) + .catch(done); }); afterEach((done) => { diff --git a/test/user/modelValidations.test.js b/test/user/modelValidations.test.js index 959d105..d631403 100644 --- a/test/user/modelValidations.test.js +++ b/test/user/modelValidations.test.js @@ -1,17 +1,16 @@ const User = require('../../models/User'); -const config = require('../config.test.js'); const assert = require('assert'); -const mongoose = require('mongoose'); describe('User modelValidations', () => { beforeEach((done) => { const joe = new User({ name: 'joe', - email: 'mail@mail.com' - }); - joe.save((err) => { - done(); + email: 'mail@mail.com', + password: 'mypass' }); + joe.save() + .then(() => done()) + .catch(done); }); afterEach((done) => { @@ -20,7 +19,7 @@ describe('User modelValidations', () => { }); it('Should require unique email', (done) => { - const jane = new User({name: 'jane', email: 'mail@mail.com'}) + const jane = new User({name: 'jane', email: 'mail@mail.com', password: 'otherpass'}) .save() .catch((err) => { const message = err.errors.email.message diff --git a/test/user/repo.test.js b/test/user/repo.test.js index 9e8a4f8..6191f46 100644 --- a/test/user/repo.test.js +++ b/test/user/repo.test.js @@ -4,7 +4,6 @@ const User = require('../../models/User'); const chai = require('chai'); const chaiHttp = require('chai-http'); const mongoose = require('mongoose'); -const should = chai.should(); chai.use(chaiHttp); mongoose.connect(config.MONGODB_URI) From 6fac74ac15e82aabbe375f93524a356e92d0397e Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Tue, 31 Oct 2017 10:57:36 +0900 Subject: [PATCH 16/81] Fixed a test. Still investigating remaining tests. Using 'expect' semantics instead of 'should' semantics. --- test/user/repo.test.js | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/test/user/repo.test.js b/test/user/repo.test.js index 6191f46..f49b39e 100644 --- a/test/user/repo.test.js +++ b/test/user/repo.test.js @@ -5,8 +5,9 @@ const chai = require('chai'); const chaiHttp = require('chai-http'); const mongoose = require('mongoose'); chai.use(chaiHttp); +const expect = chai.expect; -mongoose.connect(config.MONGODB_URI) +mongoose.connect(config.MONGODB_URI); describe('User Repo routes', () => { let joe; @@ -14,12 +15,14 @@ describe('User Repo routes', () => { beforeEach((done) => { joe = new User({ name: 'joe', - email: 'joe@mail.com' + email: 'joe@mail.com', + password: 'somepass' }); tad = new User({ name: 'tad', - email: 'tad@mail.com' + email: 'tad@mail.com', + password: 'otherpass' }); joe.save(() => { @@ -41,24 +44,28 @@ describe('User Repo routes', () => { if (a.name.toUpperCase() > b.name.toUpperCase()) return 1; return 0; }); - sortedUsers.should.be.a('array'); - sortedUsers[0].should.have.property('_id'); - sortedUsers[0].should.have.property('name').eql('joe'); - sortedUsers[0].should.have.property('email').eql('joe@mail.com'); - sortedUsers[0].should.have.property('level').eql('student'); - sortedUsers.length.should.be.eql(2); - done(); + expect(sortedUsers).to.be.a('array'); + expect(sortedUsers.length).to.be.eql(2); + expect(sortedUsers[0]).to.have.property('_id'); + expect(sortedUsers[0]).to.have.property('name').eql('joe'); + expect(sortedUsers[0]).to.have.property('email').eql('joe@mail.com'); + expect(sortedUsers[0]).to.have.property('level').eql('student'); + sortedUsers[0].comparePassword('somepass', (err, isMatch) => { + expect(err).to.eql(null); + expect(isMatch).to.eql(true); + done(); + }); }); }); it('should add new user with createUser()', (done) => { - const jane = new User({name: 'jane', email: 'jane@mail.com'}); + const jane = new User({name: 'jane', email: 'jane@mail.com', password: 'roflcopter'}); Repo.createUser(jane, newUser => { - newUser.res.should.have.property('name').eql('jane'); - newUser.res.should.have.property('email').eql('jane@mail.com'); + expect(newUser.res).to.have.property('name').eql('jane'); + expect(newUser.res).to.have.property('email').eql('jane@mail.com'); Repo.getUsers(users => { - users.should.be.a('array'); - users.length.should.be.eql(3); + expect(users).to.be.a('array'); + expect(users.length).to.be.eql(3); done(); }); }); From e21203a9d6faae08259467f78007d91bf69370b5 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Tue, 31 Oct 2017 11:00:10 +0900 Subject: [PATCH 17/81] Changed formatting in userRepository. Minor fix in test --- src/userRepository.js | 124 ++++++++++++++++++++--------------------- test/user/repo.test.js | 2 +- 2 files changed, 63 insertions(+), 63 deletions(-) diff --git a/src/userRepository.js b/src/userRepository.js index 2b8f70f..9040eb2 100644 --- a/src/userRepository.js +++ b/src/userRepository.js @@ -2,75 +2,75 @@ const User = require('../models/User'); const CheckIn = require('../models/checkIn'); module.exports = { - getUsers(cb) { - User.find({}).sort({checkIns: -1}).exec((err, users) => { - if (err) return console.log(err); - cb(users); - }); - }, - - createUser(reqBody, cb) { - const newCheckIn = new CheckIn({ - user: reqBody._id, - course: reqBody.courseId - }); - const user = { - name: reqBody.name, - email: reqBody.email, - checkIns: [newCheckIn] - } - User.create(user, (err, user) => { - const result = {err: err, res: user} - cb(result); - }); - }, + getUsers(cb) { + User.find({}).sort({checkIns: -1}).exec((err, users) => { + if (err) return console.log(err); + cb(users); + }); + }, - createCheckIn(data, cb) { - User.findOne({email: data.email}, (err, user) => { - const result = {err: err, res: user} - if (err) { - cb(result); - } else { + createUser(reqBody, cb) { const newCheckIn = new CheckIn({ - user: user._id, - course: data.courseId + user: reqBody._id, + course: reqBody.courseId }); - user.checkIns.push({_id: newCheckIn._id}) - user.name = data.name; - User.findByIdAndUpdate(user._id, user, (err, result) => { - result = {err: err, res: user} - cb(result); - }); + const user = { + name: reqBody.name, + email: reqBody.email, + checkIns: [newCheckIn] } - }); - }, + User.create(user, (err, user) => { + const result = {err: err, res: user} + cb(result); + }); + }, - getUser(id, cb) { - User.findById(id, (err, user) => { - if (err) return console.log(err); - cb(user); - }); - }, + createCheckIn(data, cb) { + User.findOne({email: data.email}, (err, user) => { + const result = {err: err, res: user} + if (err) { + cb(result); + } else { + const newCheckIn = new CheckIn({ + user: user._id, + course: data.courseId + }); + user.checkIns.push({_id: newCheckIn._id}) + user.name = data.name; + User.findByIdAndUpdate(user._id, user, (err, result) => { + result = {err: err, res: user} + cb(result); + }); + } + }); + }, - getUserByEmail(email, cb) { - User.findOne({email: email}, (err, user) => { - if (err) return console.log(err); - cb(user); - }); - }, + getUser(id, cb) { + User.findById(id, (err, user) => { + if (err) return console.log(err); + cb(user); + }); + }, - updateUser(id, user, cb) { - User.findByIdAndUpdate(id, user, (err, result) => { - if (err) return console.log(err); - cb(result); - }); - }, + getUserByEmail(email, cb) { + User.findOne({email: email}, (err, user) => { + if (err) return console.log(err); + cb(user); + }); + }, + + updateUser(id, user, cb) { + User.findByIdAndUpdate(id, user, (err, result) => { + if (err) return console.log(err); + cb(result); + }); + }, - deleteUser(id, cb) { - User.findByIdAndRemove(id, (err, result) => { - if (err) return console.log(err); - cb(result); - }); - } + deleteUser(id, cb) { + User.findByIdAndRemove(id, (err, result) => { + if (err) return console.log(err); + cb(result); + }); + } } diff --git a/test/user/repo.test.js b/test/user/repo.test.js index f49b39e..b7e3772 100644 --- a/test/user/repo.test.js +++ b/test/user/repo.test.js @@ -19,7 +19,7 @@ describe('User Repo routes', () => { password: 'somepass' }); - tad = new User({ + let tad = new User({ name: 'tad', email: 'tad@mail.com', password: 'otherpass' From f35460eb6f333f6ce41e911f46c40636cc45183d Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Tue, 31 Oct 2017 11:08:17 +0900 Subject: [PATCH 18/81] Passed another test. userRepository needed to set password. Tests are good, friends --- src/userRepository.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/userRepository.js b/src/userRepository.js index 9040eb2..5cf662a 100644 --- a/src/userRepository.js +++ b/src/userRepository.js @@ -17,17 +17,18 @@ module.exports = { const user = { name: reqBody.name, email: reqBody.email, + password: reqBody.password, checkIns: [newCheckIn] - } + }; User.create(user, (err, user) => { - const result = {err: err, res: user} + const result = {err: err, res: user}; cb(result); }); }, createCheckIn(data, cb) { User.findOne({email: data.email}, (err, user) => { - const result = {err: err, res: user} + const result = {err: err, res: user}; if (err) { cb(result); } else { @@ -35,10 +36,10 @@ module.exports = { user: user._id, course: data.courseId }); - user.checkIns.push({_id: newCheckIn._id}) + user.checkIns.push({_id: newCheckIn._id}); user.name = data.name; User.findByIdAndUpdate(user._id, user, (err, result) => { - result = {err: err, res: user} + result = {err: err, res: user}; cb(result); }); } @@ -73,4 +74,4 @@ module.exports = { }); } -} +}; From 21c3537fd7b11b6948d0f3e1d7bc16b2a4c801ad Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Tue, 31 Oct 2017 11:13:11 +0900 Subject: [PATCH 19/81] Tests pass with required password field added to user. --- test/user/repo.test.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/test/user/repo.test.js b/test/user/repo.test.js index b7e3772..22b07f8 100644 --- a/test/user/repo.test.js +++ b/test/user/repo.test.js @@ -1,4 +1,4 @@ -const config = require('../config.test.js') +const config = require('../config.test.js'); const Repo = require('../../src/userRepository'); const User = require('../../models/User'); const chai = require('chai'); @@ -10,7 +10,7 @@ const expect = chai.expect; mongoose.connect(config.MONGODB_URI); describe('User Repo routes', () => { - let joe; + let joe, tad; beforeEach((done) => { joe = new User({ @@ -19,7 +19,7 @@ describe('User Repo routes', () => { password: 'somepass' }); - let tad = new User({ + tad = new User({ name: 'tad', email: 'tad@mail.com', password: 'otherpass' @@ -73,18 +73,18 @@ describe('User Repo routes', () => { it('should list single user with getUser()', (done) => { Repo.getUser(joe._id, result => { - result.should.have.property('name').eql('joe'); + expect(result).to.have.property('name').eql('joe'); done() }); }); it('should update existing user with updateUser()', (done) => { - const jane = new User({name: 'jane', email: 'jane@mail.com'}); - let toBeUpdated = {email: 'thadious@m.com'} - Repo.createUser(jane, newUser => { - Repo.updateUser(tad._id, toBeUpdated, result => { + const jane = new User({name: 'jane', email: 'jane@mail.com', password: 'datpass'}); + let toBeUpdated = {email: 'thadious@m.com'}; + Repo.createUser(jane, () => { + Repo.updateUser(tad._id, toBeUpdated, () => { Repo.getUser(tad._id, user => { - user.email.should.be.equal('thadious@m.com'); + expect(user.email).to.eql('thadious@m.com'); done(); }); }) @@ -93,10 +93,10 @@ describe('User Repo routes', () => { it('should delete existing user with deleteUser()', (done) => { Repo.getUsers(users => { - users.length.should.be.eql(2); - Repo.deleteUser(joe._id, result => { + expect(users.length).to.eql(2); + Repo.deleteUser(joe._id, () => { Repo.getUsers(users => { - users.length.should.be.eql(1); + expect(users.length).to.eql(1); done(); }); }); From 205c1d8f494d1bd18cc1573dc4eee3bbeb884a55 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Tue, 31 Oct 2017 13:27:45 +0900 Subject: [PATCH 20/81] Intermediate commit. May not currently be working --- routes/users.js | 111 ++++++++++++++++++++++++++--------------- src/userRepository.js | 7 +++ views/users/login.pug | 27 ++++++++++ views/users/signup.pug | 52 +++++++++---------- 4 files changed, 131 insertions(+), 66 deletions(-) create mode 100644 views/users/login.pug diff --git a/routes/users.js b/routes/users.js index bd0f89c..528cf66 100644 --- a/routes/users.js +++ b/routes/users.js @@ -1,66 +1,97 @@ const express = require('express'); const router = express.Router(); -const mongoose = require('mongoose'); -const User = require('../models/User'); -const userRepo = require('../src/userRepository') +const userRepo = require('../src/userRepository'); +const passport = require('passport') + ,LocalStrategy = require('passport-local').Strategy; + +passport.use(new LocalStrategy(null, + (username, password, done) => { + userRepo.getUserByUsername(username, (user) => { + if (user.err) { return done(user.err); } + + if (!user) { + return done(null, false, { message: 'Incorrect username.' }); + } + + user.comparePassword(password, (err, isMatch) => { + if (err) { return done(err); } + + if (isMatch) { + return done(null, user); + } + return done(null, false, { message: 'Incorrect password.' }); + }); + }); + } +)); router.get('/', (req, res) => { - userRepo.getUsers(users => { - res.render('users/index', { users: users }); - }); + userRepo.getUsers(users => { + res.render('users/index', {users: users}); + }); }); router.get('/signup', (req, res) => { - res.render('users/signup'); + res.render('users/signup'); }); router.post('/signup', (req, res) => { - console.log('signup...req.body') - console.log(req.body) - userRepo.getUserByEmail(req.body.email, cb => { - if (cb === null) { - userRepo.createUser(req.body, cb => { - if (cb.err) { - const error = 'Unable to create user'; - res.render('users/signup', {error: cb.err, course: req.body}); - } else { - const success = 'to the class ' + req.body.name + '!'; - res.redirect('/users'); + console.log('signup...req.body'); + console.log(req.body); + userRepo.getUserByEmail(req.body.email, cb => { + if (cb === null) { + userRepo.createUser(req.body, cb => { + if (cb.err) { + //const error = 'Unable to create user'; + res.render('users/signup', {error: cb.err, course: req.body}); + } else { + //const success = 'to the class ' + req.body.name + '!'; + res.redirect('/users'); + } + }); + } else { + //const success = 'back to class ' + req.body.name + '!'; + res.redirect('/courses'); } - }); - } else { - userRepo.createCheckIn(req.body, cb => { - const success = 'back to class ' + req.body.name + '!'; - res.redirect('/users'); - }); - } - }); + }); +}); + +router.get('/login', (req, res) => { + res.render('users/login'); +}); + +router.post('/login', () => { + passport.authenticate('local', { + successRedirect: '/courses', + failureRedirect: '/users/login', + failureFlash: true + }) }); router.get('/:id', (req, res) => { - userRepo.getUser(req.params.id, user => { - res.render('users/show', { user, user }); - }); + userRepo.getUser(req.params.id, user => { + res.render('users/show', {user: user}); + }); }); router.get('/:id/edit', (req, res) => { - userRepo.getUser(req.params.id, user => { - res.render('users/edit', { user: user }); - }); + userRepo.getUser(req.params.id, user => { + res.render('users/edit', {user: user}); + }); }); router.post('/:id', (req, res) => { - userRepo.updateUser(req.params.id, req.body, user => { - console.log('user...........'); - console.log(user); - res.redirect('/users/' + req.params.id); - }); + userRepo.updateUser(req.params.id, req.body, user => { + console.log('user...........'); + console.log(user); + res.redirect('/users/' + req.params.id); + }); }); router.post('/:id/delete', (req, res) => { - userRepo.deleteUser(req.params.id, result => { - res.redirect('/users'); - }); + userRepo.deleteUser(req.params.id, () => { + res.redirect('/users'); + }); }); module.exports = router; diff --git a/src/userRepository.js b/src/userRepository.js index 5cf662a..ffe6002 100644 --- a/src/userRepository.js +++ b/src/userRepository.js @@ -60,6 +60,13 @@ module.exports = { }); }, + getUserByUsername(name, cb) { + User.findOne({name: name}, (err, user) => { + if (err) return console.log(err); + cb(user); + }); + }, + updateUser(id, user, cb) { User.findByIdAndUpdate(id, user, (err, result) => { if (err) return console.log(err); diff --git a/views/users/login.pug b/views/users/login.pug new file mode 100644 index 0000000..a6de03a --- /dev/null +++ b/views/users/login.pug @@ -0,0 +1,27 @@ +extends ../layout + +block content + div(class="container form") + div(class="row") + div(class="col-md-2") + div(class="col-md-8") + h2 I attended + strong + em #{course.title} + container.alert-wrap + - if(success) { + .alert.alert-success + strong Welcome #{success} + - } else if (error) { + .alert.alert-danger + strong Error! #{error} + - } + + form(method="Post" action="/users/login") + div(class="form-group") + label(for="name") Username + input(class="form-control" type="text" name="name" id="name") + label(for="password") Password + input(class="form-control" type="password" name="password" id="password") + input(class="btn btn-success" type="submit") + div(class="col-md-2") diff --git a/views/users/signup.pug b/views/users/signup.pug index 5b9b53f..69c5fb8 100644 --- a/views/users/signup.pug +++ b/views/users/signup.pug @@ -1,29 +1,29 @@ extends ../layout block content - div(class="container form") - div(class="row") - div(class="col-md-2") - div(class="col-md-8") - h2 I attended - strong - em #{course.title} - container.alert-wrap - - if(success) { - .alert.alert-success - strong Welcome #{success} - - } else if (error) { - .alert.alert-danger - strong Error! #{error} - - } - - form(method="Post" action="/users/signup") - div(class="form-group") - label(for="name") Username - input(class="form-control" type="text" name="name" id="name") - label(for="email") Email - input(class="form-control" type="email" name="email" id="email") - input(type="text" name="courseId" value=course._id hidden) - input(type="text" name="courseTitle" value=course.title hidden) - input(class="btn btn-success" type="submit") - div(class="col-md-2") + div(class="container form") + div(class="row") + div(class="col-md-2") + div(class="col-md-8") + h2 I attended + strong + em #{course.title} + container.alert-wrap + - if(success) { + .alert.alert-success + strong Welcome #{success} + - } else if (error) { + .alert.alert-danger + strong Error! #{error} + - } + + form(method="Post" action="/users/signup") + div(class="form-group") + label(for="name") Username + input(class="form-control" type="text" name="name" id="name") + label(for="email") Email + input(class="form-control" type="email" name="email" id="email") + label(for="password") Password + input(class="form-control" type="password" name="password" id="password") + input(class="btn btn-success" type="submit") + div(class="col-md-2") From d5df26e15115098877a2b4de8d59c7f530c77e6f Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Tue, 31 Oct 2017 13:35:41 +0900 Subject: [PATCH 21/81] Updated name field to username. Added name field --- README.md | 2 +- models/User.js | 27 ++++++++++------- package.json | 2 +- routes/users.js | 4 +-- src/userRepository.js | 6 ++-- test/course/modelValidations.test.js | 4 +-- test/user/modelCreate.test.js | 17 +++++++++-- test/user/modelDestroy.test.js | 6 ++-- test/user/modelRead.test.js | 2 +- test/user/modelUpdate.test.js | 16 ++++++++-- test/user/modelValidations.test.js | 44 ++++++++++++++++++++-------- test/user/repo.test.js | 18 ++++++------ views/users/edit.pug | 2 +- views/users/index.pug | 2 +- views/users/show.pug | 2 +- 15 files changed, 100 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index c36c6f5..0fe2cf5 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Collections -> -_id -email -level --name (optional) +-username (optional) [UsersClasses] -_id diff --git a/models/User.js b/models/User.js index 4f9cd75..8e30106 100644 --- a/models/User.js +++ b/models/User.js @@ -1,20 +1,31 @@ -const mongoose = require('mongoose') +const mongoose = require('mongoose'); const validator = require('validator'); -const bcrypt = require('bcrypt') -const uniqueValidator = require('mongoose-unique-validator') +const bcrypt = require('bcrypt'); +const uniqueValidator = require('mongoose-unique-validator'); const SALT_WORK_FACTOR = 10; // http://devsmash.com/blog/password-authentication-with-mongoose-and-bcrypt const userSchema = new mongoose.Schema({ - name: { + username: { type: String, validate: { validator: (name) => name.length > 2 && name.length < 100, - message: 'Name must be valid length' + message: 'Username must be valid length' }, required: true }, + password: { + type: String, + required: true + }, + name: { + type: String, + validate: { + validator: (name) => name.length > 2 && name.length < 100, + message: 'Name must be valid length' + } + }, email: { type: String, unique: [true, 'Email must be unique'], @@ -23,10 +34,6 @@ const userSchema = new mongoose.Schema({ message: 'Email must be valid' } }, - password: { - type: String, - required: true - }, level: { type: String, default: 'student', @@ -90,6 +97,6 @@ userSchema.methods.comparePassword = function(candidatePassword, cb) { userSchema.plugin(uniqueValidator); -const User = mongoose.model('user', userSchema) +const User = mongoose.model('user', userSchema); module.exports = User; diff --git a/package.json b/package.json index cd31966..1d1b2d6 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "ltc-attendance", + "username": "ltc-attendance", "version": "0.0.0", "private": true, "scripts": { diff --git a/routes/users.js b/routes/users.js index 528cf66..572dc44 100644 --- a/routes/users.js +++ b/routes/users.js @@ -45,12 +45,12 @@ router.post('/signup', (req, res) => { //const error = 'Unable to create user'; res.render('users/signup', {error: cb.err, course: req.body}); } else { - //const success = 'to the class ' + req.body.name + '!'; + //const success = 'to the class ' + req.body.username + '!'; res.redirect('/users'); } }); } else { - //const success = 'back to class ' + req.body.name + '!'; + //const success = 'back to class ' + req.body.username + '!'; res.redirect('/courses'); } }); diff --git a/src/userRepository.js b/src/userRepository.js index ffe6002..2543782 100644 --- a/src/userRepository.js +++ b/src/userRepository.js @@ -15,7 +15,7 @@ module.exports = { course: reqBody.courseId }); const user = { - name: reqBody.name, + username: reqBody.username, email: reqBody.email, password: reqBody.password, checkIns: [newCheckIn] @@ -37,7 +37,7 @@ module.exports = { course: data.courseId }); user.checkIns.push({_id: newCheckIn._id}); - user.name = data.name; + user.username = data.username; User.findByIdAndUpdate(user._id, user, (err, result) => { result = {err: err, res: user}; cb(result); @@ -61,7 +61,7 @@ module.exports = { }, getUserByUsername(name, cb) { - User.findOne({name: name}, (err, user) => { + User.findOne({username: name}, (err, user) => { if (err) return console.log(err); cb(user); }); diff --git a/test/course/modelValidations.test.js b/test/course/modelValidations.test.js index bcb8e2b..4c08a16 100644 --- a/test/course/modelValidations.test.js +++ b/test/course/modelValidations.test.js @@ -1,11 +1,9 @@ const Course = require('../../models/Course'); -const config = require('../config.test.js'); const assert = require('assert'); -const mongoose = require('mongoose'); describe('Course model validations', () => { it('Should require title', (done) => { - const ruby = new Course({ name: undefined }); + const ruby = new Course({ username: undefined }); const validationResult = ruby.validateSync(); const message = validationResult.errors.title.message; assert(message === 'Title is required'); diff --git a/test/user/modelCreate.test.js b/test/user/modelCreate.test.js index d103115..2d04869 100644 --- a/test/user/modelCreate.test.js +++ b/test/user/modelCreate.test.js @@ -7,7 +7,7 @@ describe('User modelCreate', () => { beforeEach((done) => { joe = new User({ - name: 'joe', + username: 'joe', password: 'mypass' }); joe.save() @@ -26,12 +26,23 @@ describe('User modelCreate', () => { done() }); + it('Should be able to set Username', (done) => { + joe.username = 'joe'; + joe.save() + .then(() => User.findOne({_id: joe._id})) + .then((result) => { + assert(result.username === 'joe'); + done() + }) + .catch(done); + }); + it('Should be able to set Name', (done) => { - joe.name = 'joe'; + joe.name = 'joe billy bob'; joe.save() .then(() => User.findOne({_id: joe._id})) .then((result) => { - assert(result.name === 'joe'); + assert(result.name === 'joe billy bob'); done() }) .catch(done); diff --git a/test/user/modelDestroy.test.js b/test/user/modelDestroy.test.js index 23aea9a..784ba9f 100644 --- a/test/user/modelDestroy.test.js +++ b/test/user/modelDestroy.test.js @@ -7,7 +7,7 @@ describe('User modelDestroy', () => { beforeEach((done) => { joe = new User({ - name: 'joe', + username: 'joe', password: 'mypass' }); joe.save() @@ -22,9 +22,9 @@ describe('User modelDestroy', () => { it('Should destroy User record', (done) => { const jane = new User({ - name: 'jane', + username: 'jane', password: 'otherpass' - }) + }); jane.save() .then(() => User.remove({_id: joe._id})) .then(() => User.find({})) diff --git a/test/user/modelRead.test.js b/test/user/modelRead.test.js index 339a371..342dd7c 100644 --- a/test/user/modelRead.test.js +++ b/test/user/modelRead.test.js @@ -5,7 +5,7 @@ describe('User modelRead', () => { it('Should find a User record by _id', (done) => { const joe = new User({ - name: 'joe', + username: 'joe', password: 'mypass' }); joe.save() diff --git a/test/user/modelUpdate.test.js b/test/user/modelUpdate.test.js index 10124c4..7cb4c59 100644 --- a/test/user/modelUpdate.test.js +++ b/test/user/modelUpdate.test.js @@ -8,7 +8,7 @@ describe('User modelUpdate', () => { beforeEach((done) => { const firstCheckIn = new CheckIn({}); joe = new User({ - name: 'joe', + username: 'joe', email: 'mail@mail.com', password: 'mypass', checkIns: [{_id: firstCheckIn._id}] @@ -24,12 +24,22 @@ describe('User modelUpdate', () => { done(); }); + it('Should update Username', (done) => { + joe.username = 'jane'; + joe.save() + .then(() => User.findOne({_id: joe._id})) + .then((result) => { + assert(result.username === 'jane'); + done(); + }); + }); + it('Should update Name', (done) => { - joe.name = 'jane'; + joe.name = 'jane smith'; joe.save() .then(() => User.findOne({_id: joe._id})) .then((result) => { - assert(result.name === 'jane'); + assert(result.name === 'jane smith'); done(); }); }); diff --git a/test/user/modelValidations.test.js b/test/user/modelValidations.test.js index d631403..5da443c 100644 --- a/test/user/modelValidations.test.js +++ b/test/user/modelValidations.test.js @@ -4,7 +4,7 @@ const assert = require('assert'); describe('User modelValidations', () => { beforeEach((done) => { const joe = new User({ - name: 'joe', + username: 'joe', email: 'mail@mail.com', password: 'mypass' }); @@ -19,18 +19,18 @@ describe('User modelValidations', () => { }); it('Should require unique email', (done) => { - const jane = new User({name: 'jane', email: 'mail@mail.com', password: 'otherpass'}) + new User({username: 'jane', email: 'mail@mail.com', password: 'otherpass'}) .save() .catch((err) => { - const message = err.errors.email.message - assert(message.includes('to be unique')) + const message = err.errors.email.message; + assert(message.includes('to be unique')); done(); }); }); it('Should require valid email', (done) => { const jane = new User({ - name: 'jane', + username: 'jane', email: 'mm.' }); const validationResult = jane.validateSync(); @@ -41,8 +41,7 @@ describe('User modelValidations', () => { it('Should require name to be more than 2 chars', (done) => { const jo = new User({ - name: 'jo', - email: 'jo@mail.com' + name: 'jo' }); const validationResult = jo.validateSync(); const message = validationResult.errors.name.message; @@ -52,8 +51,7 @@ describe('User modelValidations', () => { it('Should require name to be less then 100 chars', (done) => { const jo = new User({ - name: 'j'.repeat(100), - email: 'jo@mail.com' + name: 'j'.repeat(100) }); const validationResult = jo.validateSync(); const message = validationResult.errors.name.message; @@ -61,9 +59,31 @@ describe('User modelValidations', () => { done() }); + it('Should require username to be more than 2 chars', (done) => { + const jo = new User({ + username: 'jo', + email: 'jo@mail.com' + }); + const validationResult = jo.validateSync(); + const message = validationResult.errors.username.message; + assert(message === 'Username must be valid length'); + done() + }); + + it('Should require username to be less then 100 chars', (done) => { + const jo = new User({ + username: 'j'.repeat(100), + email: 'jo@mail.com' + }); + const validationResult = jo.validateSync(); + const message = validationResult.errors.username.message; + assert(message === 'Username must be valid length'); + done() + }); + it('Should require Description to be less then 1000 chars', (done) => { const joe = new User({ - name: 'joe', + username: 'joe', email: 'jo@mail.com', description: 'j'.repeat(1000) }); @@ -75,7 +95,7 @@ describe('User modelValidations', () => { it('Should require Hometown to be less then 100 chars', (done) => { const joe = new User({ - name: 'joe', + username: 'joe', email: 'jo@mail.com', hometown: 'j'.repeat(100) }); @@ -97,7 +117,7 @@ describe('User modelValidations', () => { it('Should require valid Website url', (done) => { const jane = new User({ - name: 'jane', + username: 'jane', website: 'mm.' }); const validationResult = jane.validateSync(); diff --git a/test/user/repo.test.js b/test/user/repo.test.js index 22b07f8..18cd7be 100644 --- a/test/user/repo.test.js +++ b/test/user/repo.test.js @@ -14,13 +14,13 @@ describe('User Repo routes', () => { beforeEach((done) => { joe = new User({ - name: 'joe', + username: 'joe', email: 'joe@mail.com', password: 'somepass' }); tad = new User({ - name: 'tad', + username: 'tad', email: 'tad@mail.com', password: 'otherpass' }); @@ -40,14 +40,14 @@ describe('User Repo routes', () => { it('should list all users with getUsers()', (done) => { Repo.getUsers(users => { const sortedUsers = users.sort(function (a, b) { - if (a.name.toUpperCase() < b.name.toUpperCase()) return -1; - if (a.name.toUpperCase() > b.name.toUpperCase()) return 1; + if (a.username.toUpperCase() < b.username.toUpperCase()) return -1; + if (a.username.toUpperCase() > b.username.toUpperCase()) return 1; return 0; }); expect(sortedUsers).to.be.a('array'); expect(sortedUsers.length).to.be.eql(2); expect(sortedUsers[0]).to.have.property('_id'); - expect(sortedUsers[0]).to.have.property('name').eql('joe'); + expect(sortedUsers[0]).to.have.property('username').eql('joe'); expect(sortedUsers[0]).to.have.property('email').eql('joe@mail.com'); expect(sortedUsers[0]).to.have.property('level').eql('student'); sortedUsers[0].comparePassword('somepass', (err, isMatch) => { @@ -59,9 +59,9 @@ describe('User Repo routes', () => { }); it('should add new user with createUser()', (done) => { - const jane = new User({name: 'jane', email: 'jane@mail.com', password: 'roflcopter'}); + const jane = new User({username: 'jane', email: 'jane@mail.com', password: 'roflcopter'}); Repo.createUser(jane, newUser => { - expect(newUser.res).to.have.property('name').eql('jane'); + expect(newUser.res).to.have.property('username').eql('jane'); expect(newUser.res).to.have.property('email').eql('jane@mail.com'); Repo.getUsers(users => { expect(users).to.be.a('array'); @@ -73,13 +73,13 @@ describe('User Repo routes', () => { it('should list single user with getUser()', (done) => { Repo.getUser(joe._id, result => { - expect(result).to.have.property('name').eql('joe'); + expect(result).to.have.property('username').eql('joe'); done() }); }); it('should update existing user with updateUser()', (done) => { - const jane = new User({name: 'jane', email: 'jane@mail.com', password: 'datpass'}); + const jane = new User({username: 'jane', email: 'jane@mail.com', password: 'datpass'}); let toBeUpdated = {email: 'thadious@m.com'}; Repo.createUser(jane, () => { Repo.updateUser(tad._id, toBeUpdated, () => { diff --git a/views/users/edit.pug b/views/users/edit.pug index 0f58c8a..a8019b7 100644 --- a/views/users/edit.pug +++ b/views/users/edit.pug @@ -15,7 +15,7 @@ block content type="text" name="name" id="name" - value=user.name) + value=user.username) label(for="email") Email input( diff --git a/views/users/index.pug b/views/users/index.pug index 913e6b4..bdc5ac4 100644 --- a/views/users/index.pug +++ b/views/users/index.pug @@ -8,7 +8,7 @@ block content a(href="/users/" + user._id) .container.leader img(src="http://via.placeholder.com/60" alt="profile image") - h2= user.name + h2= user.username if user.hometown h4= user.hometown.toUpperCase() h3.counter= user.checkIns.length diff --git a/views/users/show.pug b/views/users/show.pug index 39e7ff1..350c7c5 100644 --- a/views/users/show.pug +++ b/views/users/show.pug @@ -6,7 +6,7 @@ block content .col-md-4.col-sm-12 img(src='http://via.placeholder.com/180') .col-sm-4 - h1= user.name + h1= user.username h4= user.hometown .col-sm-2 a(href="/users/" + user._id + "/edit") edit From 24c6f4c02b7a854e1d34908fda43f2e8112e61f1 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Tue, 31 Oct 2017 17:08:05 +0900 Subject: [PATCH 22/81] Login and sessions work --- app.js | 74 ++++++++++++------------ routes/courses.js | 116 +++++++++++++++++++------------------- routes/index.js | 8 +-- routes/users.js | 76 ++++++++++++++++++------- views/includes/header.pug | 37 ++++++------ views/users/login.pug | 7 +-- views/users/logout.pug | 6 ++ views/users/signup.pug | 7 +-- 8 files changed, 185 insertions(+), 146 deletions(-) create mode 100644 views/users/logout.pug diff --git a/app.js b/app.js index 6a1d340..adbe1b3 100644 --- a/app.js +++ b/app.js @@ -4,7 +4,7 @@ const favicon = require('serve-favicon'); const morgan = require('morgan'); const cookieParser = require('cookie-parser'); const bodyParser = require('body-parser'); -const configDB = require('./config/database.js') +const configDB = require('./config/database.js'); const passport = require('passport'); const flash = require('connect-flash'); const session = require('express-session'); @@ -15,17 +15,17 @@ const courses = require('./routes/courses'); const app = express(); // database -const mongoose = require('mongoose') +const mongoose = require('mongoose'); -mongoose.Promise = global.Promise -mongoose.set('debug', true) +mongoose.Promise = global.Promise; +mongoose.set('debug', true); mongoose.connect(configDB.MONGO_DEV, err => { - if (err) { - console.log("# Failed to connect to MongoDB Dev:"); - } else { - console.log('# Connected to MongoDB Dev:') - } + if (err) { + console.log("# Failed to connect to MongoDB Dev:"); + } else { + console.log('# Connected to MongoDB Dev:') + } }); // mongoose.connect(configDB.MONGODB_URI, err => { @@ -45,51 +45,51 @@ app.set('view engine', 'pug'); // uncomment after placing your favicon in /public //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); app.use(morgan('dev')); -app.use(bodyParser.json()); -app.use(bodyParser.urlencoded({ extended: false })); -app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); - -app.use('/', index); -app.use('/users', users); -app.use('/courses', courses); +app.use(cookieParser()); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({extended: false})); // required for passport -app.use(session({ secret: 'thisneedstobehidden' })); +app.use(session({secret: 'thisneedstobehidden'})); app.use(passport.initialize()); app.use(passport.session()); app.use(flash()); +app.use('/', index); +app.use('/users', users); +app.use('/courses', courses); + // catch 404 and forward to error handler -app.use(function(req, res, next) { - const err = new Error('Not Found'); - err.status = 404; - next(err); +app.use(function (req, res, next) { + const err = new Error('Not Found'); + err.status = 404; + next(err); }); // error handler -app.use(function(err, req, res, next) { - // set locals, only providing error in development - res.locals.message = err.message; - res.locals.error = req.app.get('env') === 'development' ? err : {}; - - // render the error page - res.status(err.status || 500); - res.render('error'); +app.use(function (err, req, res) { + // set locals, only providing error in development + res.locals.message = err.message; + res.locals.error = req.app.get('env') === 'development' ? err : {}; + + // render the error page + res.status(err.status || 500); + res.render('error'); }); module.exports = app; // error handler -app.use(function(err, req, res, next) { - // set locals, only providing error in development - res.locals.message = err.message; - res.locals.error = req.app.get('env') === 'development' ? err : {}; - - // render the error page - res.status(err.status || 500); - res.render('error'); +app.use(function (err, req, res) { + // set locals, only providing error in development + res.locals.message = err.message; + res.locals.error = req.app.get('env') === 'development' ? err : {}; + + // render the error page + res.status(err.status || 500); + res.render('error'); }); module.exports = app; diff --git a/routes/courses.js b/routes/courses.js index c9cd8b2..cb225ff 100644 --- a/routes/courses.js +++ b/routes/courses.js @@ -1,82 +1,82 @@ const router = require('express').Router(); -const Course = require('../models/Course') +const Course = require('../models/Course'); -router.get('/', function(req, res, next) { - Course.find({}).sort({createdAt: -1}).exec((err, courses) => { - if (err) return console.log(err); - res.render('courses/index', { courses: courses }); - }); +router.get('/', function (req, res) { + Course.find({}).sort({createdAt: -1}).exec((err, courses) => { + if (err) return console.log(err); + res.render('courses/index', {courses: courses, authedUser: req.user}); + }); }); -router.get('/create', (req, res)=>{ - res.render('courses/create') -}) +router.get('/create', (req, res) => { + res.render('courses/create') +}); router.post('/create', (req, res) => { - Course.create(req.body, (err, newCourse) => { - console.log("this is the post request"); - if (err) { - console.log(err); - res.redirect('/courses/create'); - } else { - res.redirect('/courses'); - } - }); + Course.create(req.body, (err) => { + console.log("this is the post request"); + if (err) { + console.log(err); + res.redirect('/courses/create'); + } else { + res.redirect('/courses'); + } + }); }); router.get('/:id', (req, res) => { - Course.findById(req.params.id, (err, course) => { - if (err) { - console.log(err); - res.redirect('/'); - } else { - res.render('courses/show', {course: course}); - } - }); + Course.findById(req.params.id, (err, course) => { + if (err) { + console.log(err); + res.redirect('/'); + } else { + res.render('courses/show', {course: course, authedUser: req.user}); + } + }); }); router.get('/:id/edit', (req, res) => { - Course.findById(req.params.id, (err, course) => { - console.log("in id/edit of " + req.params.id); - if (err) { - console.log(err); - res.redirect('/'); - } else { - res.render('courses/edit', {course: course}); - } - }); + Course.findById(req.params.id, (err, course) => { + console.log("in id/edit of " + req.params.id); + if (err) { + console.log(err); + res.redirect('/'); + } else { + res.render('courses/edit', {course: course, authedUser: req.user}); + } + }); }); router.post('/:id', (req, res) => { - Course.findByIdAndUpdate(req.params.id, req.body, (err, result) => { - if (err) { - console.log(err); - res.redirect('/'); - } else { - res.redirect('/courses/' + req.params.id); - } - }); + Course.findByIdAndUpdate(req.params.id, req.body, (err) => { + if (err) { + console.log(err); + res.redirect('/'); + } else { + res.redirect('/courses/' + req.params.id); + } + }); }); router.get('/:id/checkin', (req, res) => { - Course.findById(req.params.id, (err, course) => { - if (err) { - console.log(err); - } else { - res.render('users/signup', {course: course}) - } - }); + Course.findById(req.params.id, (err, course) => { + if (err) { + console.log(err); + } else { + res.render('users/signup', {course: course, authedUser: req.user}) + } + }); }); router.post('/:id/delete', (req, res) => { - Course.findByIdAndRemove(req.params.id, (err, result) => { - if (err) { - console.log(err); - res.redirect('/'); - } else { - res.redirect('/courses'); - } - }); + Course.findByIdAndRemove(req.params.id, (err) => { + if (err) { + console.log(err); + res.redirect('/'); + } else { + res.redirect('/courses'); + } + }); }); module.exports = router; diff --git a/routes/index.js b/routes/index.js index 694a407..745af73 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,9 +1,9 @@ -var express = require('express'); -var router = express.Router(); +const express = require('express'); +const router = express.Router(); /* GET home page. */ -router.get('/', function(req, res, next) { - res.render('index', { title: 'Learn Teach Code Attendance Tracker' }); +router.get('/', function (req, res) { + res.render('index', {title: 'Learn Teach Code Attendance Tracker', authedUser: req.user}); }); module.exports = router; diff --git a/routes/users.js b/routes/users.js index 572dc44..24261e7 100644 --- a/routes/users.js +++ b/routes/users.js @@ -2,32 +2,49 @@ const express = require('express'); const router = express.Router(); const userRepo = require('../src/userRepository'); const passport = require('passport') - ,LocalStrategy = require('passport-local').Strategy; + , LocalStrategy = require('passport-local').Strategy; +const User = require('../models/User'); -passport.use(new LocalStrategy(null, +passport.use(new LocalStrategy( (username, password, done) => { + console.log('local strategy call invoked'); userRepo.getUserByUsername(username, (user) => { - if (user.err) { return done(user.err); } + console.log('passport auth getting user by username'); + if (user.err) { + return done(user.err); + } if (!user) { - return done(null, false, { message: 'Incorrect username.' }); + return done(null, false, {message: 'Incorrect username.'}); } user.comparePassword(password, (err, isMatch) => { - if (err) { return done(err); } + if (err) { + return done(err); + } if (isMatch) { return done(null, user); } - return done(null, false, { message: 'Incorrect password.' }); + return done(null, false, {message: 'Incorrect password.'}); }); }); } )); +passport.serializeUser((user, done) => { + done(null, user.id); +}); + +passport.deserializeUser((id, done) => { + User.findById(id, (err, user) => { + done(err, user); + }); +}); + router.get('/', (req, res) => { userRepo.getUsers(users => { - res.render('users/index', {users: users}); + res.render('users/index', {users: users, authedUser: req.user}); }); }); @@ -38,7 +55,7 @@ router.get('/signup', (req, res) => { router.post('/signup', (req, res) => { console.log('signup...req.body'); console.log(req.body); - userRepo.getUserByEmail(req.body.email, cb => { + userRepo.getUserByUsername(req.body.username, cb => { if (cb === null) { userRepo.createUser(req.body, cb => { if (cb.err) { @@ -46,7 +63,12 @@ router.post('/signup', (req, res) => { res.render('users/signup', {error: cb.err, course: req.body}); } else { //const success = 'to the class ' + req.body.username + '!'; - res.redirect('/users'); + req.login(cb, (err) => { + if (err) { + return next(err); + } + return res.redirect('/users'); + }); } }); } else { @@ -60,24 +82,32 @@ router.get('/login', (req, res) => { res.render('users/login'); }); -router.post('/login', () => { - passport.authenticate('local', { - successRedirect: '/courses', - failureRedirect: '/users/login', - failureFlash: true - }) +router.get('/logout', (req, res) => { + req.logout(); + res.render('users/logout') }); +router.post('/login', + passport.authenticate('local'), + (req, res) => { + res.redirect('/courses'); + } +); + router.get('/:id', (req, res) => { userRepo.getUser(req.params.id, user => { - res.render('users/show', {user: user}); + res.render('users/show', {user: user, authedUser: req.user}); }); }); router.get('/:id/edit', (req, res) => { - userRepo.getUser(req.params.id, user => { - res.render('users/edit', {user: user}); - }); + if (req.params.id !== req.user._id) { + res.redirect('/users'); + } else { + userRepo.getUser(req.params.id, user => { + res.render('users/edit', {user: user, authedUser: req.user}); + }); + } }); router.post('/:id', (req, res) => { @@ -89,9 +119,13 @@ router.post('/:id', (req, res) => { }); router.post('/:id/delete', (req, res) => { - userRepo.deleteUser(req.params.id, () => { + if (req.params.id !== req.user._id) { res.redirect('/users'); - }); + } else { + userRepo.deleteUser(req.params.id, () => { + res.redirect('/users'); + }); + } }); module.exports = router; diff --git a/views/includes/header.pug b/views/includes/header.pug index d8331a9..7c16771 100644 --- a/views/includes/header.pug +++ b/views/includes/header.pug @@ -1,17 +1,22 @@ nav.navbar.navbar-inverse.bg-inverse.rounded.navbar-toggleable-md - button.navbar-toggler.navbar-toggler-right(type='button', data-toggle='collapse', data-target='#containerNavbar', aria-controls='containerNavbar', aria-expanded='false', aria-label='Toggle navigation') - span.navbar-toggler-icon - a.navbar-brand(href='/') Attendance Tracker - #containerNavbar.collapse.navbar-collapse - ul.navbar-nav.mr-auto - li.nav-item - a.nav-link(href='/users') - i.fa.fa-users - | Users - li.nav-item - a.nav-link(href='/courses') - i.fa.fa-graduation-cap - | Courses - form.form-inline.my-2.my-md-0 - // input.form-control.mr-sm-2(type='text', placeholder='Search') - a.btn.btn-outline-success.my-2.my-sm-0(href='/courses') Register for class + button.navbar-toggler.navbar-toggler-right(type='button', data-toggle='collapse', data-target='#containerNavbar', aria-controls='containerNavbar', aria-expanded='false', aria-label='Toggle navigation') + span.navbar-toggler-icon + a.navbar-brand(href='/') Attendance Tracker + #containerNavbar.collapse.navbar-collapse + ul.navbar-nav.mr-auto + li.nav-item + a.nav-link(href='/users') + i.fa.fa-users + | Users + li.nav-item + a.nav-link(href='/courses') + i.fa.fa-graduation-cap + | Courses + form.form-inline.my-2.my-md-0 + // input.form-control.mr-sm-2(type='text', placeholder='Search') + if authedUser + a.btn.btn-outline-success.my-2.my-sm-0(href='/courses') Register for class + a.btn.btn-outline-success.my-2.my-sm-0(href='/users/logout') Logout + else + a.btn.btn-outline-success.my-2.my-sm-0(href='/users/login') Login + a.btn.btn-outline-success.my-2.my-sm-0(href='/users/signup') Signup diff --git a/views/users/login.pug b/views/users/login.pug index a6de03a..6983bb0 100644 --- a/views/users/login.pug +++ b/views/users/login.pug @@ -5,9 +5,6 @@ block content div(class="row") div(class="col-md-2") div(class="col-md-8") - h2 I attended - strong - em #{course.title} container.alert-wrap - if(success) { .alert.alert-success @@ -19,8 +16,8 @@ block content form(method="Post" action="/users/login") div(class="form-group") - label(for="name") Username - input(class="form-control" type="text" name="name" id="name") + label(for="username") Username + input(class="form-control" type="text" name="username" id="username") label(for="password") Password input(class="form-control" type="password" name="password" id="password") input(class="btn btn-success" type="submit") diff --git a/views/users/logout.pug b/views/users/logout.pug new file mode 100644 index 0000000..8209ac6 --- /dev/null +++ b/views/users/logout.pug @@ -0,0 +1,6 @@ +extends ../layout + +block content + div(class="container form") + h1 You have been logged out. + diff --git a/views/users/signup.pug b/views/users/signup.pug index 69c5fb8..b98c8b5 100644 --- a/views/users/signup.pug +++ b/views/users/signup.pug @@ -5,9 +5,6 @@ block content div(class="row") div(class="col-md-2") div(class="col-md-8") - h2 I attended - strong - em #{course.title} container.alert-wrap - if(success) { .alert.alert-success @@ -19,8 +16,8 @@ block content form(method="Post" action="/users/signup") div(class="form-group") - label(for="name") Username - input(class="form-control" type="text" name="name" id="name") + label(for="username") Username + input(class="form-control" type="text" name="username" id="username") label(for="email") Email input(class="form-control" type="email" name="email" id="email") label(for="password") Password From e821181e057a4eba5f781b0e0c71c50eef059ec3 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Tue, 31 Oct 2017 17:46:14 +0900 Subject: [PATCH 23/81] Put pages behind auth wall --- routes/courses.js | 139 +++++++++++++++++++++++++++++++--------------- 1 file changed, 93 insertions(+), 46 deletions(-) diff --git a/routes/courses.js b/routes/courses.js index cb225ff..ae1b130 100644 --- a/routes/courses.js +++ b/routes/courses.js @@ -1,5 +1,13 @@ const router = require('express').Router(); const Course = require('../models/Course'); +const passport = require('passport'); + +const canEditEvents = (user) => { + if (user === null) { + return false; + } + return user.level === 'instructor' || user.level === 'admin'; +}; router.get('/', function (req, res) { Course.find({}).sort({createdAt: -1}).exec((err, courses) => { @@ -8,21 +16,35 @@ router.get('/', function (req, res) { }); }); -router.get('/create', (req, res) => { - res.render('courses/create') -}); +router.get('/create', + passport.authenticate('local'), + (req, res) => { + if (canEditEvents(req.user)) { + res.render('courses/create') + } else { + res.status(res.unauthorized).send(); + } + } +); -router.post('/create', (req, res) => { - Course.create(req.body, (err) => { - console.log("this is the post request"); - if (err) { - console.log(err); - res.redirect('/courses/create'); +router.post('/create', + passport.authenticate('local'), + (req, res) => { + if (canEditEvents(req.user)) { + Course.create(req.body, (err) => { + console.log("this is the post request"); + if (err) { + console.log(err); + res.redirect('/courses/create'); + } else { + res.redirect('/courses'); + } + }); } else { - res.redirect('/courses'); + res.status(res.unauthorized).send(); } - }); -}); + } +); router.get('/:id', (req, res) => { Course.findById(req.params.id, (err, course) => { @@ -35,48 +57,73 @@ router.get('/:id', (req, res) => { }); }); -router.get('/:id/edit', (req, res) => { - Course.findById(req.params.id, (err, course) => { - console.log("in id/edit of " + req.params.id); - if (err) { - console.log(err); - res.redirect('/'); +router.get('/:id/edit', + passport.authenticate('local'), + (req, res) => { + if (canEditEvents(req.user)) { + Course.findById(req.params.id, (err, course) => { + console.log("in id/edit of " + req.params.id); + if (err) { + console.log(err); + res.redirect('/'); + } else { + res.render('courses/edit', {course: course, authedUser: req.user}); + } + }); } else { - res.render('courses/edit', {course: course, authedUser: req.user}); + res.status(res.unauthorized).send(); } - }); -}); + } +); -router.post('/:id', (req, res) => { - Course.findByIdAndUpdate(req.params.id, req.body, (err) => { - if (err) { - console.log(err); - res.redirect('/'); +router.post('/:id', + passport.authenticate('local'), + (req, res) => { + if (canEditEvents(req.user)) { + Course.findByIdAndUpdate(req.params.id, req.body, (err) => { + if (err) { + console.log(err); + res.redirect('/'); + } else { + res.redirect('/courses/' + req.params.id); + } + }); } else { - res.redirect('/courses/' + req.params.id); + res.status(res.unauthorized).send(); } - }); -}); + } +); -router.get('/:id/checkin', (req, res) => { - Course.findById(req.params.id, (err, course) => { - if (err) { - console.log(err); - } else { - res.render('users/signup', {course: course, authedUser: req.user}) - } - }); -}); +router.post('/:id/checkin', + passport.authenticate('local'), + (req, res) => { + Course.findById(req.params.id, (err, course) => { + if (err) { + console.log(err); + } else { + res.render('users/signup', {course: course, authedUser: req.user}); + res.redirect('/courses/' + req.params.id); + } + }); + } +); -router.post('/:id/delete', (req, res) => { - Course.findByIdAndRemove(req.params.id, (err) => { - if (err) { - console.log(err); - res.redirect('/'); +router.post('/:id/delete', + passport.authenticate('local'), + (req, res) => { + if (canEditEvents(req.user)) { + Course.findByIdAndRemove(req.params.id, (err) => { + if (err) { + console.log(err); + res.redirect('/'); + } else { + res.redirect('/courses'); + } + }); } else { - res.redirect('/courses'); + res.status(res.unauthorized).send(); } - }); -}); + } +); module.exports = router; From 6c8b557bd68e456d90d2b2868360a545f32e0cfd Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Wed, 1 Nov 2017 10:36:39 +0900 Subject: [PATCH 24/81] Hid edit and create buttons based on permissions. Need to check more --- views/courses/index.pug | 29 +++++++++++----------- views/courses/show.pug | 11 +++++---- views/users/show.pug | 53 +++++++++++++++++++---------------------- 3 files changed, 46 insertions(+), 47 deletions(-) diff --git a/views/courses/index.pug b/views/courses/index.pug index c865973..1f76642 100644 --- a/views/courses/index.pug +++ b/views/courses/index.pug @@ -2,21 +2,22 @@ extends ../layout block content h2 - i.fa.fa-graduation-cap - | Courses + i.fa.fa-graduation-cap + | Courses hr - .text-right - a.btn.btn-primary(href='/courses/create') - i.fa.fa-plus - | New Course + if authedUser && (authedUser.level === 'instructor' || authedUser.level === 'admin') + .text-right + a.btn.btn-primary(href='/courses/create') + i.fa.fa-plus + | New Course for course in courses - .card.my-3 - .card-block - h4.card-title= course.title - h6.card-subtitle.mb-2.text-muted= `Created by ${course.createdBy || 'unknown'} at ${course.createdAt || 'unknown'}` - p.card-text= course.description - a.card-link(href="/courses/" + course._id) Details - a.card-link(href='#') Schedule - a.card-link(href="/courses/" + course._id + "/checkin") Register + .card.my-3 + .card-block + h4.card-title= course.title + h6.card-subtitle.mb-2.text-muted= `Created by ${course.createdBy || 'unknown'} at ${course.createdAt || 'unknown'}` + p.card-text= course.description + a.card-link(href="/courses/" + course._id) Details + a.card-link(href='#') Schedule + a.card-link(href="/courses/" + course._id + "/checkin") Register diff --git a/views/courses/show.pug b/views/courses/show.pug index 759f3a6..5926609 100644 --- a/views/courses/show.pug +++ b/views/courses/show.pug @@ -1,9 +1,10 @@ extends ../layout block content - h1 course page - p= course + h1 course page + p= course - a(href="/courses/" + course._id + "/edit") edit - form(method="Post" action="/courses/" + course._id + "/delete") - button(type="submit") delete + if authedUser && (authedUser.level === 'instructor' || authedUser.level === 'admin') + a(href="/courses/" + course._id + "/edit") edit + form(method="Post" action="/courses/" + course._id + "/delete") + button(type="submit") delete diff --git a/views/users/show.pug b/views/users/show.pug index 350c7c5..cb7f6d4 100644 --- a/views/users/show.pug +++ b/views/users/show.pug @@ -1,31 +1,28 @@ extends ../layout block content - .user-profile.col-lg-8 - .row - .col-md-4.col-sm-12 - img(src='http://via.placeholder.com/180') - .col-sm-4 - h1= user.username - h4= user.hometown - .col-sm-2 - a(href="/users/" + user._id + "/edit") edit - hr - p checkins: #{user.checkIns.length} - table.col-sm-8.offset-sm-4 - tr - td level - td= user.level - tr - td email - td= user.email - tr - td website - td= user.website - tr - td description - td= user.description - - - - + .user-profile.col-lg-8 + .row + .col-md-4.col-sm-12 + img(src='http://via.placeholder.com/180') + .col-sm-4 + h1= user.username + h4= user.hometown + if authedUser && (String(authedUser._id) === String(user._id) || authedUser.level === 'admin') + .col-sm-2 + a(href="/users/" + user._id + "/edit") edit + hr + p checkins: #{user.checkIns.length} + table.col-sm-8.offset-sm-4 + tr + td level + td= user.level + tr + td email + td= user.email + tr + td website + td= user.website + tr + td description + td= user.description From ec04bd7e83446a3c724496ca7fcecd07eda6640e Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Wed, 1 Nov 2017 10:39:00 +0900 Subject: [PATCH 25/81] Updated gitignore. Added package lock --- .gitignore | 1 + package-lock.json | 4351 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 4352 insertions(+) create mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index c56a9e6..4a04ff2 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,4 @@ Session.vim tags # End of https://www.gitignore.io/api/node +.idea \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..aa0525d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4351 @@ +{ + "username": "ltc-attendance", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" + }, + "acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "ajv": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", + "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "2.1.1" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.7" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assertion-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", + "dev": true + }, + "async": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", + "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", + "requires": { + "lodash": "4.17.4" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "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.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "basic-auth": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz", + "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=" + }, + "bcrypt": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-1.0.3.tgz", + "integrity": "sha512-pRyDdo73C8Nim3jwFJ7DWe3TZCgwDfWZ6nHS5LSdU77kWbj1frruvdndP02AOavtD4y8v6Fp2dolbHgp4SDrfg==", + "requires": { + "nan": "2.6.2", + "node-pre-gyp": "0.6.36" + }, + "dependencies": { + "nan": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", + "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=" + } + } + }, + "bcrypt-nodejs": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/bcrypt-nodejs/-/bcrypt-nodejs-0.0.3.tgz", + "integrity": "sha1-xgkX8m3CNWYVZsaBBhwwPCsohCs=" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "binary-extensions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "2.0.3" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "body-parser": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", + "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=", + "requires": { + "bytes": "2.4.0", + "content-type": "1.0.4", + "debug": "2.6.7", + "depd": "1.1.1", + "http-errors": "1.6.2", + "iconv-lite": "0.4.15", + "on-finished": "2.3.0", + "qs": "6.4.0", + "raw-body": "2.2.0", + "type-is": "1.6.15" + }, + "dependencies": { + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "requires": { + "hoek": "4.2.0" + } + }, + "boxen": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.2.tgz", + "integrity": "sha1-Px1AMsMP/qnUsCwyLq8up0HcvOU=", + "dev": true, + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.3.0", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "bson": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", + "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" + }, + "buffer-crc32": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz", + "integrity": "sha1-vj5TgvwCttYySVasGvmKqYsIU0w=" + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "bytes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "1.0.2", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.3" + } + }, + "chai-http": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-3.0.0.tgz", + "integrity": "sha1-VGDYA24fGhKwtbXL1Snm3B0x60s=", + "dev": true, + "requires": { + "cookiejar": "2.0.6", + "is-ip": "1.0.0", + "methods": "1.1.2", + "qs": "6.4.0", + "superagent": "2.3.0" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", + "requires": { + "is-regex": "1.0.4" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.2", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", + "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", + "requires": { + "commander": "2.8.1", + "source-map": "0.4.4" + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "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.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "configstore": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", + "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.1.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, + "connect-flash": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/connect-flash/-/connect-flash-0.1.1.tgz", + "integrity": "sha1-2GMPJtlaf4UfmVax6MxnMvO2qjA=" + }, + "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=" + }, + "constantinople": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.0.tgz", + "integrity": "sha1-dWnKqKo/jVk11i4fqW+fcCzYHHk=", + "requires": { + "acorn": "3.3.0", + "is-expression": "2.1.0" + } + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.0.6.tgz", + "integrity": "sha1-Cr81atANHFohnYjURRgEbdAmrP4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "4.0.3" + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + }, + "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.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + }, + "es6-promise": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", + "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" + }, + "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=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "requires": { + "duplexer": "0.1.1", + "from": "0.1.7", + "map-stream": "0.1.0", + "pause-stream": "0.0.11", + "split": "0.3.3", + "stream-combiner": "0.0.4", + "through": "2.3.8" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "express": { + "version": "4.15.5", + "resolved": "https://registry.npmjs.org/express/-/express-4.15.5.tgz", + "integrity": "sha1-ZwI1ypWYiQpa6BcLg9tyK4Qu2Sc=", + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.1", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.0.6", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "1.1.5", + "qs": "6.5.0", + "range-parser": "1.2.0", + "send": "0.15.6", + "serve-static": "1.12.6", + "setprototypeof": "1.0.3", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.0", + "vary": "1.1.2" + }, + "dependencies": { + "qs": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", + "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==" + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "express-session": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.0.4.tgz", + "integrity": "sha1-oQBFrz8kaTycGbGRShHQyrj3sps=", + "requires": { + "buffer-crc32": "0.2.1", + "cookie": "0.1.2", + "cookie-signature": "1.0.3", + "debug": "0.8.1", + "uid2": "0.0.3", + "utils-merge": "1.0.0" + }, + "dependencies": { + "cookie": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", + "integrity": "sha1-cv7D0k5Io0Mgc9kMEmQgBQYQBLE=" + }, + "cookie-signature": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.3.tgz", + "integrity": "sha1-kc2ZfMUftkFZVzjGnNoCAyj1D/k=" + }, + "debug": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz", + "integrity": "sha1-IP9NJvXkIstoobrLu2EDmtjBwTA=" + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "finalhandler": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", + "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "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": "1.0.0-rc4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", + "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=", + "dev": true, + "requires": { + "async": "1.5.2", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "formidable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", + "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=", + "dev": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.7.0", + "node-pre-gyp": "0.6.36" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "aproba": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "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=", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.36", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz", + "integrity": "sha1-22BBEst04NR3VU6bUFsXq936t4Y=", + "dev": true, + "optional": true, + "requires": { + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", + "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", + "dev": true + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "optional": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "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=", + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", + "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + }, + "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.1" + } + }, + "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.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "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.1.1" + } + } + } + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "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.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "global-dirs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.0.tgz", + "integrity": "sha1-ENNAOeDfBCcuJizyQiT3IJQ0308=", + "dev": true, + "requires": { + "ini": "1.3.4" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "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.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "5.3.0", + "har-schema": "2.0.0" + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "requires": { + "function-bind": "1.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.1.0" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" + }, + "hooks-fixed": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.2.tgz", + "integrity": "sha512-YurCM4gQSetcrhwEtpQHhQ4M7Zo7poNGqY4kQGeBS6eZtOcT3tnNs01ThFa0jYBByAiYt1MjMjP/YApG0EnAvQ==" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + } + }, + "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.4.1", + "sshpk": "1.13.1" + } + }, + "iconv-lite": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=" + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" + }, + "ip-regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", + "dev": true + }, + "ipaddr.js": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", + "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.10.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-expression": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-2.1.0.tgz", + "integrity": "sha1-kb6dR968/vB3l36XIr5tz7RGXvA=", + "requires": { + "acorn": "3.3.0", + "object-assign": "4.1.1" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "0.1.0", + "is-path-inside": "1.0.0" + } + }, + "is-ip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-1.0.0.tgz", + "integrity": "sha1-K7aVn3l8zW+f3IEnWLy8h8TFkHQ=", + "dev": true, + "requires": { + "ip-regex": "1.0.3" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "1.0.1" + } + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "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=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jquery": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", + "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" + }, + "js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "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=" + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "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" + } + }, + "jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", + "requires": { + "is-promise": "2.1.0", + "promise": "7.3.1" + } + }, + "kareem": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-1.5.0.tgz", + "integrity": "sha1-4+QQHZ3P3imXadr0tNtk2JXRdEg=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "4.0.1" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, + "lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "dev": true, + "requires": { + "lodash._bindcallback": "3.0.1", + "lodash._isiterateecall": "3.0.9", + "lodash.restparam": "3.6.1" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._createassigner": "3.1.1", + "lodash.keys": "3.1.2" + } + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.defaults": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", + "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", + "dev": true, + "requires": { + "lodash.assign": "3.2.0", + "lodash.restparam": "3.6.1" + } + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", + "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, + "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=" + }, + "method-override": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-1.0.2.tgz", + "integrity": "sha1-1vgCddsjojOAAoySFbl0cL4B1ok=", + "requires": { + "methods": "1.0.0" + }, + "dependencies": { + "methods": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.0.0.tgz", + "integrity": "sha1-mnPYY3XfzvJu9hyj5Lii4lOKgOM=" + } + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "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.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "mongodb": { + "version": "2.2.33", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.33.tgz", + "integrity": "sha1-tTfEcdNKZlG0jzb9vyl1A0Dgi1A=", + "requires": { + "es6-promise": "3.2.1", + "mongodb-core": "2.1.17", + "readable-stream": "2.2.7" + } + }, + "mongodb-core": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.17.tgz", + "integrity": "sha1-pBizN6FKFJkPtRC5I97mqBMXPfg=", + "requires": { + "bson": "1.0.4", + "require_optional": "1.0.1" + } + }, + "mongoose": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.12.5.tgz", + "integrity": "sha512-dhCcCfYJjZv95nn4mAIAzj/+o2iR8rIBPOFlWps/STe+wJD53B2sKOpS+UH2bp7CqBHcLnwdRJL6aGJUcWS7kg==", + "requires": { + "async": "2.1.4", + "bson": "1.0.4", + "hooks-fixed": "2.0.2", + "kareem": "1.5.0", + "mongodb": "2.2.33", + "mpath": "0.3.0", + "mpromise": "0.5.5", + "mquery": "2.3.2", + "ms": "2.0.0", + "muri": "1.3.0", + "regexp-clone": "0.0.1", + "sliced": "1.0.1" + } + }, + "mongoose-unique-validator": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-1.0.6.tgz", + "integrity": "sha512-hJf1eiWPw9O5ed7HUtFHtHhqnWDpm42Q5iC3xs6p99kr1qrVMq8WR2x+yobx6rY5F26Ki2NqGvJTe8v/Fax0kw==", + "requires": { + "lodash.foreach": "4.5.0", + "lodash.get": "4.4.2" + } + }, + "morgan": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.8.2.tgz", + "integrity": "sha1-eErHc05KRTqcbm6GgKkyknXItoc=", + "requires": { + "basic-auth": "1.1.0", + "debug": "2.6.8", + "depd": "1.1.1", + "on-finished": "2.3.0", + "on-headers": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "mpath": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.3.0.tgz", + "integrity": "sha1-elj3iem1/TyUUgY0FXlg8mvV70Q=" + }, + "mpromise": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mpromise/-/mpromise-0.5.5.tgz", + "integrity": "sha1-9bJCWddjrMIlewoMjG2Gb9UXMuY=" + }, + "mquery": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-2.3.2.tgz", + "integrity": "sha512-KXWMypZSvhCuqRtza+HMQZdYw7PfFBjBTFvP31NNAq0OX0/NTIgpcDpkWQ2uTxk6vGQtwQ2elhwhs+ZvCA8OaA==", + "requires": { + "bluebird": "3.5.1", + "debug": "2.6.9", + "regexp-clone": "0.0.1", + "sliced": "0.0.5" + }, + "dependencies": { + "sliced": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz", + "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8=" + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "muri": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/muri/-/muri-1.3.0.tgz", + "integrity": "sha512-FiaFwKl864onHFFUV/a2szAl7X0fxVlSKNdhTf+BM8i8goEgYut8u5P9MqQqIYwvaMxjzVESsoEm/2kfkFH1rg==" + }, + "nan": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", + "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", + "dev": true, + "optional": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "node-pre-gyp": { + "version": "0.6.36", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz", + "integrity": "sha1-22BBEst04NR3VU6bUFsXq936t4Y=", + "requires": { + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.2", + "rc": "1.2.2", + "request": "2.83.0", + "rimraf": "2.6.2", + "semver": "5.4.1", + "tar": "2.2.1", + "tar-pack": "3.4.1" + }, + "dependencies": { + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.4" + } + } + } + }, + "nodemon": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.12.1.tgz", + "integrity": "sha1-mWpW3EnZ8Wu/G3ik3gjxNjSzh40=", + "dev": true, + "requires": { + "chokidar": "1.7.0", + "debug": "2.6.9", + "es6-promise": "3.3.1", + "ignore-by-default": "1.0.1", + "lodash.defaults": "3.1.2", + "minimatch": "3.0.4", + "ps-tree": "1.1.0", + "touch": "3.1.0", + "undefsafe": "0.0.3", + "update-notifier": "2.3.0" + }, + "dependencies": { + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", + "dev": true + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.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.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.1", + "registry-url": "3.1.0", + "semver": "5.4.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "passport": { + "version": "0.1.18", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.1.18.tgz", + "integrity": "sha1-yCZEedy2QUytu2Z1LRKzfgtlJaE=", + "requires": { + "pause": "0.0.1", + "pkginfo": "0.2.3" + } + }, + "passport-local": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-0.1.6.tgz", + "integrity": "sha1-+wz4KASNuTG2fRmYXHqgbdN3qds=", + "requires": { + "passport": "0.1.18", + "pkginfo": "0.2.3" + } + }, + "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-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "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=" + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkginfo": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.2.3.tgz", + "integrity": "sha1-cjnEKl72wwuPMoQ52bn/cQQkkPg=" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "2.0.6" + } + }, + "proxy-addr": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", + "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.4.0" + } + }, + "ps-tree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", + "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", + "dev": true, + "requires": { + "event-stream": "3.3.4" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "pug": { + "version": "2.0.0-rc.4", + "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.0-rc.4.tgz", + "integrity": "sha512-SL7xovj6E2Loq9N0UgV6ynjMLW4urTFY/L/Fprhvz13Xc5vjzkjZjI1QHKq31200+6PSD8PyU6MqrtCTJj6/XA==", + "requires": { + "pug-code-gen": "2.0.0", + "pug-filters": "2.1.5", + "pug-lexer": "3.1.0", + "pug-linker": "3.0.3", + "pug-load": "2.0.9", + "pug-parser": "4.0.0", + "pug-runtime": "2.0.3", + "pug-strip-comments": "1.0.2" + } + }, + "pug-attrs": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.2.tgz", + "integrity": "sha1-i+KyIlVo/6ddG4Zpgr/59BEa/8s=", + "requires": { + "constantinople": "3.1.0", + "js-stringify": "1.0.2", + "pug-runtime": "2.0.3" + } + }, + "pug-code-gen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.0.tgz", + "integrity": "sha512-E4oiJT+Jn5tyEIloj8dIJQognbiNNp0i0cAJmYtQTFS0soJ917nlIuFtqVss3IXMEyQKUew3F4gIkBpn18KbVg==", + "requires": { + "constantinople": "3.1.0", + "doctypes": "1.1.0", + "js-stringify": "1.0.2", + "pug-attrs": "2.0.2", + "pug-error": "1.3.2", + "pug-runtime": "2.0.3", + "void-elements": "2.0.1", + "with": "5.1.1" + } + }, + "pug-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.2.tgz", + "integrity": "sha1-U659nSm7A89WRJOgJhCfVMR/XyY=" + }, + "pug-filters": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-2.1.5.tgz", + "integrity": "sha512-xkw71KtrC4sxleKiq+cUlQzsiLn8pM5+vCgkChW2E6oNOzaqTSIBKIQ5cl4oheuDzvJYCTSYzRaVinMUrV4YLQ==", + "requires": { + "clean-css": "3.4.28", + "constantinople": "3.1.0", + "jstransformer": "1.0.0", + "pug-error": "1.3.2", + "pug-walk": "1.1.5", + "resolve": "1.5.0", + "uglify-js": "2.8.29" + } + }, + "pug-lexer": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-3.1.0.tgz", + "integrity": "sha1-/QhzdtSmdbT1n4/vQiiDQ06VgaI=", + "requires": { + "character-parser": "2.2.0", + "is-expression": "3.0.0", + "pug-error": "1.3.2" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + }, + "is-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", + "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=", + "requires": { + "acorn": "4.0.13", + "object-assign": "4.1.1" + } + } + } + }, + "pug-linker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.3.tgz", + "integrity": "sha512-DCKczglCXOzJ1lr4xUj/lVHYvS+lGmR2+KTCjZjtIpdwaN7lNOoX2SW6KFX5X4ElvW+6ThwB+acSUg08UJFN5A==", + "requires": { + "pug-error": "1.3.2", + "pug-walk": "1.1.5" + } + }, + "pug-load": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.9.tgz", + "integrity": "sha512-BDdZOCru4mg+1MiZwRQZh25+NTRo/R6/qArrdWIf308rHtWA5N9kpoUskRe4H6FslaQujC+DigH9LqlBA4gf6Q==", + "requires": { + "object-assign": "4.1.1", + "pug-walk": "1.1.5" + } + }, + "pug-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-4.0.0.tgz", + "integrity": "sha512-ocEUFPdLG9awwFj0sqi1uiZLNvfoodCMULZzkRqILryIWc/UUlDlxqrKhKjAIIGPX/1SNsvxy63+ayEGocGhQg==", + "requires": { + "pug-error": "1.3.2", + "token-stream": "0.0.1" + } + }, + "pug-runtime": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.3.tgz", + "integrity": "sha1-mBYmB7D86eJU1CfzOYelrucWi9o=" + }, + "pug-strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.2.tgz", + "integrity": "sha1-0xOvoBvMN0mA4TmeI+vy65vchRM=", + "requires": { + "pug-error": "1.3.2" + } + }, + "pug-walk": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.5.tgz", + "integrity": "sha512-rJlH1lXerCIAtImXBze3dtKq/ykZMA4rpO9FnPcIgsWcxZLOvd8zltaoeOVFyBSSqCkhhJWbEbTMga8UxWUUSA==" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", + "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=", + "requires": { + "bytes": "2.4.0", + "iconv-lite": "0.4.15", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz", + "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=", + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "readable-stream": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", + "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.2.7", + "set-immediate-shim": "1.0.1" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regexp-clone": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", + "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" + }, + "registry-auth-token": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", + "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "dev": true, + "requires": { + "rc": "1.2.2", + "safe-buffer": "5.1.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "1.2.2" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + }, + "dependencies": { + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + } + } + }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "2.0.0", + "semver": "5.4.1" + } + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "7.1.1" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "5.4.1" + } + }, + "send": { + "version": "0.15.6", + "resolved": "https://registry.npmjs.org/send/-/send-0.15.6.tgz", + "integrity": "sha1-IPI6nJJbdiq4JwX+L52yUqzkfjQ=", + "requires": { + "debug": "2.6.9", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.3.4", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "serve-favicon": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.5.tgz", + "integrity": "sha512-s7F8h2NrslMkG50KxvlGdj+ApSwaLex0vexuJ9iFf3GLTIp1ph/l1qZvRe9T9TJEYZgmq72ZwJ2VYiAEtChknw==", + "requires": { + "etag": "1.8.1", + "fresh": "0.5.2", + "ms": "2.0.0", + "parseurl": "1.3.2", + "safe-buffer": "5.1.1" + } + }, + "serve-static": { + "version": "1.12.6", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.6.tgz", + "integrity": "sha1-uXN3P2NEmTTaVOW+ul4x2fQhFXc=", + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.15.6" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "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=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "requires": { + "hoek": "4.2.0" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "1.0.1" + } + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "0.1.1" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "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=" + }, + "superagent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-2.3.0.tgz", + "integrity": "sha1-cDUpoHFOV+EjlZ3e+84ZOy5Q0RU=", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "cookiejar": "2.0.6", + "debug": "2.6.9", + "extend": "3.0.1", + "form-data": "1.0.0-rc4", + "formidable": "1.1.1", + "methods": "1.1.2", + "mime": "1.3.4", + "qs": "6.4.0", + "readable-stream": "2.2.7" + } + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.1.tgz", + "integrity": "sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg==", + "requires": { + "debug": "2.6.9", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.7", + "rimraf": "2.6.2", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "0.7.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "token-stream": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", + "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "1.0.10" + } + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "requires": { + "punycode": "1.4.1" + } + }, + "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.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-detect": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", + "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", + "dev": true + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=" + }, + "uid2": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", + "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" + }, + "undefsafe": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz", + "integrity": "sha1-7Mo6A+VrmvFzhbqsgSrIO5lKli8=", + "dev": true + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "update-notifier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", + "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", + "dev": true, + "requires": { + "boxen": "1.2.2", + "chalk": "2.3.0", + "configstore": "3.1.1", + "import-lazy": "2.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "1.0.4" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + }, + "validator": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz", + "integrity": "sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA==" + }, + "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.3.0" + } + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "requires": { + "string-width": "1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "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.1" + } + }, + "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.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "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.1.1" + } + } + } + }, + "widest-line": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", + "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "dev": true, + "requires": { + "string-width": "1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "with": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", + "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=", + "requires": { + "acorn": "3.3.0", + "acorn-globals": "3.1.0" + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } +} From 94cc27e1336f9a54a4307ecf65a116b42b11d264 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Wed, 1 Nov 2017 10:53:24 +0900 Subject: [PATCH 26/81] Some changes were missing from merge. Added here --- README.md | 36 ++++++++++++++++++++++++++++++------ package.json | 5 +---- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 2147fa6..ff6bc89 100644 --- a/README.md +++ b/README.md @@ -42,9 +42,38 @@ npm run test-watch => runs all tests each time a change is saved ### Collections #### Users * _id +* username +* password * email * level * name (optional) +* website +* hometown +* description +* checkIns + +#### Course +* _id +* title +* description +* tags +* createdAt +* instructors + +#### CheckIn +* _id +* user +* course +* date + +#### Session +* _id +* sessionOpen +* date +* checkIns +* course + +### Unknown/Missing Collections #### UsersClasses * _id @@ -57,9 +86,4 @@ npm run test-watch => runs all tests each time a change is saved * course_id * time * location -* url - -#### Course -* _id -* title -* description +* url \ No newline at end of file diff --git a/package.json b/package.json index d87e224..c1fdb5c 100644 --- a/package.json +++ b/package.json @@ -26,10 +26,7 @@ "serve-favicon": "~2.4.2", "validator": "^8.0.0", "passport": "~0.1.17", - "passport-local": "~0.1.6", - "bcrypt-nodejs": "latest", - "method-override": "~1.0.0", - "express-session": "~1.0.0" + "passport-local": "~0.1.6" }, "devDependencies": { "chai": "^4.0.2", From 37694000b29688023542b3f264734831eb257196 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Wed, 1 Nov 2017 11:22:44 +0900 Subject: [PATCH 27/81] Fixes for editing users --- public/stylesheets/style.css | 199 ++++++++++++++++++++--------------- routes/users.js | 2 +- views/users/show.pug | 7 +- 3 files changed, 119 insertions(+), 89 deletions(-) diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index 5d4a641..5a40280 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -1,138 +1,167 @@ body { - font-family: 'Source Sans Pro', sans-serif; - color: #333; + font-family: 'Source Sans Pro', sans-serif; + color: #333; } + /********************************************/ /* form styles */ /********************************************/ .form { - margin-top: 80px; + margin-top: 80px; } + label { - margin-top: 15px; + margin-top: 15px; } + input[type="submit"] { - margin-top: 20px; - cursor: pointer; + margin-top: 20px; + cursor: pointer; } + /********************************************/ /* leaderboard styles */ /********************************************/ .leaderboard { - margin: 60px 0; - max-width: 600px; + margin: 60px 0; + max-width: 600px; } + .leaderboard a { - text-decoration: none; - color: inherit; + text-decoration: none; + color: inherit; } + .leader { - border: 2px solid #eee; - margin-bottom: 10px; - padding: 6px; - border-radius: 8px; + border: 2px solid #eee; + margin-bottom: 10px; + padding: 6px; + border-radius: 8px; } + .leader img { - border-radius: 50%; + border-radius: 50%; } + .leader h2, .leader h3, .leader h4, .leader p { - display: inline-block; + display: inline-block; } + .leader p { - background-color: #2674F2; - font-size: 10px; - letter-spacing: 1.5px; - vertical-align: 8px; - color: #fff; - border-radius: 4px; - padding: 2px 5px; - position: absolute; - top: 46px; - right: 10px; -} + background-color: #2674F2; + font-size: 10px; + letter-spacing: 1.5px; + vertical-align: 8px; + color: #fff; + border-radius: 4px; + padding: 2px 5px; + position: absolute; + top: 46px; + right: 10px; +} + .leader h2 { - font-size: 20px; - padding: 0 10px; + font-size: 20px; + padding: 0 10px; } + .leader h4 { - position: absolute; - top: 46px; - left: 78px; - font-size: 12px; - letter-spacing: 2px; - color: #aaa; -} + position: absolute; + top: 46px; + left: 78px; + font-size: 12px; + letter-spacing: 2px; + color: #aaa; +} + .leader h3 { - margin: 6px 4px; - font-size: 16px; - float: right; + margin: 6px 4px; + font-size: 16px; + float: right; } + .leader .counter { - background: crimson; - color: #ddd; - font-size: 11px; - text-align: center; - font-weight: bold; - padding: 3px; - border-radius: 50%; - width: 18px; -} + background: crimson; + color: #ddd; + font-size: 11px; + text-align: center; + font-weight: bold; + padding: 3px; + border-radius: 50%; + width: 18px; +} + .leader .teacher { - background: limegreen; + background: limegreen; } + /********************************************/ /* user-profile styles */ /********************************************/ .user-profile { - margin: 40px auto; - padding: 0 40px; + margin: 40px auto; + padding: 0 40px; } + .user-profile img { - width: 180px; - height: 180px; - border-radius: 50%; + width: 180px; + height: 180px; + border-radius: 50%; } + .user-profile .center-column { - margin: auto; + margin: auto; } + .user-profile h1 { - margin-top: 20px; + margin-top: 20px; } + .user-profile hr { - border: 0; - height: 1px; - margin: 20px 0 40px -80px; - background-image: linear-gradient(to right, rgba(0, 0, 0, .05), rgba(0, 0, 0, .5), rgba(0, 0, 0, .05)); - width: 120%; - position: absolute; - top: 50px; - z-index: -1; -} + border: 0; + height: 1px; + margin: 20px 0 40px -80px; + background-image: linear-gradient(to right, rgba(0, 0, 0, .05), rgba(0, 0, 0, .5), rgba(0, 0, 0, .05)); + width: 120%; + position: absolute; + top: 50px; + z-index: -1; +} + .user-profile a { - display: inline-block; - background-image: url('../images/edit.png'); - background-color: #fff; - background-size: 104px 84px; - background-position: 20px -10px; - background-repeat: no-repeat; - height: 34px; - width: 54px; -} + display: inline-block; + background-image: url('../images/edit.png'); + background-color: #fff; + background-size: 104px 84px; + background-position: 20px -10px; + background-repeat: no-repeat; + height: 34px; + width: 54px; +} + .user-profile a:hover { - text-decoration: none; + text-decoration: none; } + /********************************************/ /* user-profile-edit styles */ /********************************************/ .user-profile-edit #delete-user { - background-image: url('../images/trash.png'); - border: none; - background-color: #fff; - background-size: 24px 24px; - background-repeat: no-repeat; - height: 24px; - width: 24px; - position: relative; - top: 20px; - left: 20px; + background-image: url('../images/trash.png'); + border: none; + background-color: #fff; + background-size: 24px 24px; + background-repeat: no-repeat; + height: 24px; + width: 24px; + position: relative; + top: 20px; + left: 20px; +} + +/********************************************/ +/* course index styles */ +/********************************************/ +.course-index-checkin { + display: inline-block; } diff --git a/routes/users.js b/routes/users.js index 24261e7..baaef9b 100644 --- a/routes/users.js +++ b/routes/users.js @@ -101,7 +101,7 @@ router.get('/:id', (req, res) => { }); router.get('/:id/edit', (req, res) => { - if (req.params.id !== req.user._id) { + if (String(req.params.id) !== String(req.user._id)) { res.redirect('/users'); } else { userRepo.getUser(req.params.id, user => { diff --git a/views/users/show.pug b/views/users/show.pug index cb7f6d4..0d48794 100644 --- a/views/users/show.pug +++ b/views/users/show.pug @@ -17,9 +17,10 @@ block content tr td level td= user.level - tr - td email - td= user.email + if authedUser + tr + td email + td= user.email tr td website td= user.website From d5c2cf517407378e8d7903c091a4521a4a7e3fc1 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Wed, 1 Nov 2017 13:16:36 +0900 Subject: [PATCH 28/81] Fixed authentication. It wasn't logging in using passport. Found a tutorial and followed it --- app.js | 4 ++ config/passport.js | 70 ++++++++++++++++++++++ package.json | 6 +- routes/courses.js | 17 +++--- routes/loginCheck.js | 9 +++ routes/users.js | 127 ++++++++++++---------------------------- views/courses/index.pug | 10 +++- 7 files changed, 141 insertions(+), 102 deletions(-) create mode 100644 routes/loginCheck.js diff --git a/app.js b/app.js index adbe1b3..cb1bc52 100644 --- a/app.js +++ b/app.js @@ -42,6 +42,10 @@ mongoose.connect(configDB.MONGO_DEV, err => { app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'pug'); +// pass passport for configuration +const configurePassport = require('./config/passport'); +configurePassport(passport); + // uncomment after placing your favicon in /public //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); app.use(morgan('dev')); diff --git a/config/passport.js b/config/passport.js index e69de29..301b0af 100644 --- a/config/passport.js +++ b/config/passport.js @@ -0,0 +1,70 @@ +const LocalStrategy = require('passport-local').Strategy; +const User = require('../models/User'); +const userRepo = require('../src/userRepository'); + +module.exports = (passport) => { + + passport.use('local-login', new LocalStrategy({ + passReqToCallback: true + }, + (req, username, password, done) => { + console.log('local strategy call invoked'); + userRepo.getUserByUsername(username, (user) => { + console.log('passport auth getting user by username'); + if (user.err) { + return done(user.err); + } + + if (!user) { + return done(null, false, req.flash('loginMessage', 'Incorrect username.')); + } + + user.comparePassword(password, (err, isMatch) => { + if (err) { + return done(err); + } + + if (isMatch) { + return done(null, user); + } + return done(null, false, req.flash('loginMessage', 'Incorrect password.')); + }); + }); + } + )); + + // https://scotch.io/tutorials/easy-node-authentication-setup-and-local + passport.use('local-signup', new LocalStrategy({ + passReqToCallback: true + }, + (req, username, password, done) => { + process.nextTick(() => { + userRepo.getUserByUsername(username, (existingUser) => { + if (existingUser.err) { + return done(existingUser.err); + } else if (existingUser) { + return done(null, false, req.flash('signupMessage', 'That username is already in use')); + } else { + userRepo.createUser(req.body, newUser => { + if (newUser.err) { + throw newUser.err; + } else { + return done(null, newUser) + } + }); + } + }); + }); + }) + ); + + passport.serializeUser((user, done) => { + done(null, user.id); + }); + + passport.deserializeUser((id, done) => { + User.findById(id, (err, user) => { + done(err, user); + }); + }); +}; \ No newline at end of file diff --git a/package.json b/package.json index c1fdb5c..cd31966 100644 --- a/package.json +++ b/package.json @@ -22,11 +22,11 @@ "mongoose": "^4.7.2", "mongoose-unique-validator": "^1.0.5", "morgan": "~1.8.1", + "passport": "~0.1.17", + "passport-local": "~0.1.6", "pug": "~2.0.0-beta11", "serve-favicon": "~2.4.2", - "validator": "^8.0.0", - "passport": "~0.1.17", - "passport-local": "~0.1.6" + "validator": "^8.0.0" }, "devDependencies": { "chai": "^4.0.2", diff --git a/routes/courses.js b/routes/courses.js index ae1b130..465e81e 100644 --- a/routes/courses.js +++ b/routes/courses.js @@ -1,6 +1,7 @@ const router = require('express').Router(); const Course = require('../models/Course'); const passport = require('passport'); +const isLoggedIn = require('./loginCheck'); const canEditEvents = (user) => { if (user === null) { @@ -17,7 +18,7 @@ router.get('/', function (req, res) { }); router.get('/create', - passport.authenticate('local'), + isLoggedIn, (req, res) => { if (canEditEvents(req.user)) { res.render('courses/create') @@ -28,7 +29,7 @@ router.get('/create', ); router.post('/create', - passport.authenticate('local'), + isLoggedIn, (req, res) => { if (canEditEvents(req.user)) { Course.create(req.body, (err) => { @@ -58,7 +59,7 @@ router.get('/:id', (req, res) => { }); router.get('/:id/edit', - passport.authenticate('local'), + isLoggedIn, (req, res) => { if (canEditEvents(req.user)) { Course.findById(req.params.id, (err, course) => { @@ -77,7 +78,7 @@ router.get('/:id/edit', ); router.post('/:id', - passport.authenticate('local'), + isLoggedIn, (req, res) => { if (canEditEvents(req.user)) { Course.findByIdAndUpdate(req.params.id, req.body, (err) => { @@ -95,21 +96,21 @@ router.post('/:id', ); router.post('/:id/checkin', - passport.authenticate('local'), + isLoggedIn, (req, res) => { Course.findById(req.params.id, (err, course) => { if (err) { console.log(err); } else { - res.render('users/signup', {course: course, authedUser: req.user}); - res.redirect('/courses/' + req.params.id); + // TODO: checkin + res.render('/courses/' + req.params.id, {checkedIn: true, authedUser: req.user}); } }); } ); router.post('/:id/delete', - passport.authenticate('local'), + isLoggedIn, (req, res) => { if (canEditEvents(req.user)) { Course.findByIdAndRemove(req.params.id, (err) => { diff --git a/routes/loginCheck.js b/routes/loginCheck.js new file mode 100644 index 0000000..cd193a5 --- /dev/null +++ b/routes/loginCheck.js @@ -0,0 +1,9 @@ +module.exports = (req, res, next) => { + + // if user is authenticated in the session, carry on + if (req.isAuthenticated()) + return next(); + + // if they aren't redirect them to the home page + res.redirect('/users/login'); +}; \ No newline at end of file diff --git a/routes/users.js b/routes/users.js index baaef9b..8611a90 100644 --- a/routes/users.js +++ b/routes/users.js @@ -1,46 +1,8 @@ const express = require('express'); const router = express.Router(); const userRepo = require('../src/userRepository'); -const passport = require('passport') - , LocalStrategy = require('passport-local').Strategy; -const User = require('../models/User'); - -passport.use(new LocalStrategy( - (username, password, done) => { - console.log('local strategy call invoked'); - userRepo.getUserByUsername(username, (user) => { - console.log('passport auth getting user by username'); - if (user.err) { - return done(user.err); - } - - if (!user) { - return done(null, false, {message: 'Incorrect username.'}); - } - - user.comparePassword(password, (err, isMatch) => { - if (err) { - return done(err); - } - - if (isMatch) { - return done(null, user); - } - return done(null, false, {message: 'Incorrect password.'}); - }); - }); - } -)); - -passport.serializeUser((user, done) => { - done(null, user.id); -}); - -passport.deserializeUser((id, done) => { - User.findById(id, (err, user) => { - done(err, user); - }); -}); +const passport = require('passport'); +const isLoggedIn = require('./loginCheck'); router.get('/', (req, res) => { userRepo.getUsers(users => { @@ -52,31 +14,11 @@ router.get('/signup', (req, res) => { res.render('users/signup'); }); -router.post('/signup', (req, res) => { - console.log('signup...req.body'); - console.log(req.body); - userRepo.getUserByUsername(req.body.username, cb => { - if (cb === null) { - userRepo.createUser(req.body, cb => { - if (cb.err) { - //const error = 'Unable to create user'; - res.render('users/signup', {error: cb.err, course: req.body}); - } else { - //const success = 'to the class ' + req.body.username + '!'; - req.login(cb, (err) => { - if (err) { - return next(err); - } - return res.redirect('/users'); - }); - } - }); - } else { - //const success = 'back to class ' + req.body.username + '!'; - res.redirect('/courses'); - } - }); -}); +router.post('/signup', passport.authenticate('local-signup', { + successRedirect: '/courses', + failureRedirect: '/signup', + failureFlash: true +})); router.get('/login', (req, res) => { res.render('users/login'); @@ -88,7 +30,7 @@ router.get('/logout', (req, res) => { }); router.post('/login', - passport.authenticate('local'), + passport.authenticate('local-login'), (req, res) => { res.redirect('/courses'); } @@ -100,32 +42,41 @@ router.get('/:id', (req, res) => { }); }); -router.get('/:id/edit', (req, res) => { - if (String(req.params.id) !== String(req.user._id)) { - res.redirect('/users'); - } else { - userRepo.getUser(req.params.id, user => { - res.render('users/edit', {user: user, authedUser: req.user}); - }); +router.get('/:id/edit', + isLoggedIn, + (req, res) => { + if (String(req.params.id) !== String(req.user._id)) { + res.redirect('/users'); + } else { + userRepo.getUser(req.params.id, user => { + res.render('users/edit', {user: user, authedUser: req.user}); + }); + } } -}); +); -router.post('/:id', (req, res) => { - userRepo.updateUser(req.params.id, req.body, user => { - console.log('user...........'); - console.log(user); - res.redirect('/users/' + req.params.id); - }); -}); +router.post('/:id', + isLoggedIn, + (req, res) => { + userRepo.updateUser(req.params.id, req.body, user => { + console.log('user...........'); + console.log(user); + res.redirect('/users/' + req.params.id); + }); + } +); -router.post('/:id/delete', (req, res) => { - if (req.params.id !== req.user._id) { - res.redirect('/users'); - } else { - userRepo.deleteUser(req.params.id, () => { +router.post('/:id/delete', + isLoggedIn, + (req, res) => { + if (req.params.id !== req.user._id) { res.redirect('/users'); - }); + } else { + userRepo.deleteUser(req.params.id, () => { + res.redirect('/users'); + }); + } } -}); +); module.exports = router; diff --git a/views/courses/index.pug b/views/courses/index.pug index 1f76642..405b11f 100644 --- a/views/courses/index.pug +++ b/views/courses/index.pug @@ -18,6 +18,10 @@ block content h4.card-title= course.title h6.card-subtitle.mb-2.text-muted= `Created by ${course.createdBy || 'unknown'} at ${course.createdAt || 'unknown'}` p.card-text= course.description - a.card-link(href="/courses/" + course._id) Details - a.card-link(href='#') Schedule - a.card-link(href="/courses/" + course._id + "/checkin") Register + a.card-link(href="/courses/" + course._id) + button Details + a.card-link(href='#') + button Schedule + if authedUser + form.course-index-checkin.card-link(method="Post" action="/courses/" + course._id + "/checkin") + button(type="submit") Register From 82c69f14a8f94d4b60d96de56ce8def03fe9e17b Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Wed, 1 Nov 2017 13:23:13 +0900 Subject: [PATCH 29/81] Fix for course checkin route. Need to implement checkin logic --- routes/courses.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/courses.js b/routes/courses.js index 465e81e..5c3f176 100644 --- a/routes/courses.js +++ b/routes/courses.js @@ -103,7 +103,7 @@ router.post('/:id/checkin', console.log(err); } else { // TODO: checkin - res.render('/courses/' + req.params.id, {checkedIn: true, authedUser: req.user}); + res.redirect('/courses/' + req.params.id); } }); } From cde63d66a74026876009b7e18c96cd5af417c8aa Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Wed, 1 Nov 2017 13:25:50 +0900 Subject: [PATCH 30/81] Merge branch 'add_passport_authentication' of github.com:LearnTeachCodeSeoul/ltc_attendance into add_passport_authentication From 46eba002307dcbf7c68fbcbbd063df3f8bda8577 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Wed, 1 Nov 2017 13:36:23 +0900 Subject: [PATCH 31/81] Checkins work, but a user can checkin an infinite number of times --- routes/courses.js | 7 ++++--- src/userRepository.js | 7 +++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/routes/courses.js b/routes/courses.js index 5c3f176..1943098 100644 --- a/routes/courses.js +++ b/routes/courses.js @@ -1,7 +1,7 @@ const router = require('express').Router(); const Course = require('../models/Course'); -const passport = require('passport'); const isLoggedIn = require('./loginCheck'); +const userRepo = require('../src/userRepository'); const canEditEvents = (user) => { if (user === null) { @@ -102,8 +102,9 @@ router.post('/:id/checkin', if (err) { console.log(err); } else { - // TODO: checkin - res.redirect('/courses/' + req.params.id); + userRepo.createCheckIn(req.user._id, course._id, () => { + res.redirect('/courses/' + req.params.id); + }) } }); } diff --git a/src/userRepository.js b/src/userRepository.js index 2543782..781390a 100644 --- a/src/userRepository.js +++ b/src/userRepository.js @@ -26,18 +26,17 @@ module.exports = { }); }, - createCheckIn(data, cb) { - User.findOne({email: data.email}, (err, user) => { + createCheckIn(userId, courseId, cb) { + User.findOne({_id: userId}, (err, user) => { const result = {err: err, res: user}; if (err) { cb(result); } else { const newCheckIn = new CheckIn({ user: user._id, - course: data.courseId + course: courseId }); user.checkIns.push({_id: newCheckIn._id}); - user.username = data.username; User.findByIdAndUpdate(user._id, user, (err, result) => { result = {err: err, res: user}; cb(result); From 3d3f37be71a43055c5b5118028144bb720e6ac3e Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Wed, 1 Nov 2017 13:45:37 +0900 Subject: [PATCH 32/81] Fixed checkins better. Still need to prevent infinite checkins --- routes/courses.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/routes/courses.js b/routes/courses.js index 1943098..9c346b6 100644 --- a/routes/courses.js +++ b/routes/courses.js @@ -102,8 +102,12 @@ router.post('/:id/checkin', if (err) { console.log(err); } else { - userRepo.createCheckIn(req.user._id, course._id, () => { - res.redirect('/courses/' + req.params.id); + userRepo.createCheckIn(req.user._id, course._id, (result) => { + if (result.err) { + res.render('courses/show', {course: course, errorMessage: result.err, authedUser: req.user}) + } else { + res.render('courses/show', {course: course, checkedIn: true, authedUser: req.user}); + } }) } }); From 02212d88a402749500931d360600e81555f814ea Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Wed, 1 Nov 2017 16:01:27 +0900 Subject: [PATCH 33/81] Checking in multiple times for the same event has no effect. We need to remove the checkin button for those that have already checked in. --- routes/courses.js | 4 ++-- src/checkInRepository.js | 43 ++++++++++++++++++++++++++++++++++++++++ src/userRepository.js | 19 ------------------ views/courses/index.pug | 2 +- 4 files changed, 46 insertions(+), 22 deletions(-) create mode 100644 src/checkInRepository.js diff --git a/routes/courses.js b/routes/courses.js index 9c346b6..488dd59 100644 --- a/routes/courses.js +++ b/routes/courses.js @@ -1,7 +1,7 @@ const router = require('express').Router(); const Course = require('../models/Course'); const isLoggedIn = require('./loginCheck'); -const userRepo = require('../src/userRepository'); +const checkInRepo = require('../src/checkInRepository'); const canEditEvents = (user) => { if (user === null) { @@ -102,7 +102,7 @@ router.post('/:id/checkin', if (err) { console.log(err); } else { - userRepo.createCheckIn(req.user._id, course._id, (result) => { + checkInRepo.createCheckIn(req.user, course, (result) => { if (result.err) { res.render('courses/show', {course: course, errorMessage: result.err, authedUser: req.user}) } else { diff --git a/src/checkInRepository.js b/src/checkInRepository.js new file mode 100644 index 0000000..033eb7b --- /dev/null +++ b/src/checkInRepository.js @@ -0,0 +1,43 @@ +const CheckIn = require('../models/checkIn'); +const userRepo = require('./userRepository'); + +module.exports = { + + createCheckIn(user, course, cb) { + CheckIn.findOne({user: user._id, course: course._id}, (err, foundCheckIn) => { + if (err) { + const result = {err: err, res: foundCheckIn}; + cb(result); + } else if (foundCheckIn !== null) { // checkin exists + console.log('already checked in'); + const result = {err: 'Already checked in', res: foundCheckIn}; + cb(result); + } else { // not checkin, let's checkin + console.log('has not checked in. checking in'); + const newCheckIn = new CheckIn({ + user: user, + course: course + }); + CheckIn.create(newCheckIn, (err, checkIn) => { + user.checkIns.push(checkIn); + userRepo.updateUser(user._id, user, (result) => { + if(result) { + cb(checkIn); + } else { + const output = {err: 'Failed to update user with checkIn', res: result}; + cb(output); + } + }); + }); + } + }); + }, + + getCheckInByUserIdAndCourseId(userId, courseId, cb) { + CheckIn.findOne({user: userId, course: courseId}, (err, checkIn) => { + const result = {err: err, res: checkIn}; + cb(result); + }); + }, + +}; \ No newline at end of file diff --git a/src/userRepository.js b/src/userRepository.js index 781390a..7377dae 100644 --- a/src/userRepository.js +++ b/src/userRepository.js @@ -26,25 +26,6 @@ module.exports = { }); }, - createCheckIn(userId, courseId, cb) { - User.findOne({_id: userId}, (err, user) => { - const result = {err: err, res: user}; - if (err) { - cb(result); - } else { - const newCheckIn = new CheckIn({ - user: user._id, - course: courseId - }); - user.checkIns.push({_id: newCheckIn._id}); - User.findByIdAndUpdate(user._id, user, (err, result) => { - result = {err: err, res: user}; - cb(result); - }); - } - }); - }, - getUser(id, cb) { User.findById(id, (err, user) => { if (err) return console.log(err); diff --git a/views/courses/index.pug b/views/courses/index.pug index 405b11f..f2c3902 100644 --- a/views/courses/index.pug +++ b/views/courses/index.pug @@ -22,6 +22,6 @@ block content button Details a.card-link(href='#') button Schedule - if authedUser + if authedUser && !checkedIn form.course-index-checkin.card-link(method="Post" action="/courses/" + course._id + "/checkin") button(type="submit") Register From ebdcb3bc8440be3c759b9e7bab89382a21da3b3b Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Wed, 1 Nov 2017 16:09:45 +0900 Subject: [PATCH 34/81] Removed checkin creation from user creation --- src/userRepository.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/userRepository.js b/src/userRepository.js index 7377dae..95a429c 100644 --- a/src/userRepository.js +++ b/src/userRepository.js @@ -1,5 +1,4 @@ const User = require('../models/User'); -const CheckIn = require('../models/checkIn'); module.exports = { getUsers(cb) { @@ -10,15 +9,11 @@ module.exports = { }, createUser(reqBody, cb) { - const newCheckIn = new CheckIn({ - user: reqBody._id, - course: reqBody.courseId - }); const user = { username: reqBody.username, email: reqBody.email, password: reqBody.password, - checkIns: [newCheckIn] + checkIns: [] }; User.create(user, (err, user) => { const result = {err: err, res: user}; From aaacb93d611e07148d3c7b3247557bd280859ca6 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Wed, 1 Nov 2017 17:41:27 +0900 Subject: [PATCH 35/81] Slight organizational change --- src/checkInRepository.js | 44 ++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/src/checkInRepository.js b/src/checkInRepository.js index 033eb7b..48cd8d5 100644 --- a/src/checkInRepository.js +++ b/src/checkInRepository.js @@ -8,27 +8,37 @@ module.exports = { if (err) { const result = {err: err, res: foundCheckIn}; cb(result); - } else if (foundCheckIn !== null) { // checkin exists - console.log('already checked in'); - const result = {err: 'Already checked in', res: foundCheckIn}; - cb(result); } else { // not checkin, let's checkin - console.log('has not checked in. checking in'); - const newCheckIn = new CheckIn({ - user: user, - course: course - }); - CheckIn.create(newCheckIn, (err, checkIn) => { - user.checkIns.push(checkIn); - userRepo.updateUser(user._id, user, (result) => { - if(result) { - cb(checkIn); + + if (foundCheckIn !== null) { // checkin exists + console.log('already checked in'); + console.log(foundCheckIn); + const result = {err: 'Already checked in', res: foundCheckIn}; + cb(result); + } else { + console.log('has not checked in. checking in'); + const newCheckIn = new CheckIn({ + user: user, + course: course + }); + CheckIn.create(newCheckIn, (err, checkIn) => { + if (err) { + console.log(err); + const result = {err: err, res: checkIn}; + cb(result); } else { - const output = {err: 'Failed to update user with checkIn', res: result}; - cb(output); + user.checkIns.push(checkIn); + userRepo.updateUser(user._id, { $push: {checkIns: checkIn} }, (result) => { + if(result) { + cb(checkIn); + } else { + const output = {err: 'Failed to update user with checkIn', res: result}; + cb(output); + } + }); } }); - }); + } } }); }, From 1954a1cdf0ad63181a8075bc1ba2413b9b33c102 Mon Sep 17 00:00:00 2001 From: Hazelton Jacob Date: Wed, 1 Nov 2017 21:13:55 +0900 Subject: [PATCH 36/81] Changed 'Courses' to 'Events' --- src/ClassRepo.js | 114 ++++++++++++++++++------------------- src/CourseRepo.js | 116 +++++++++++++++++++------------------- views/includes/header.pug | 2 +- 3 files changed, 116 insertions(+), 116 deletions(-) diff --git a/src/ClassRepo.js b/src/ClassRepo.js index e7753cb..31ff2bd 100644 --- a/src/ClassRepo.js +++ b/src/ClassRepo.js @@ -1,57 +1,57 @@ -// const mongoose = require('mongoose'); -// -// mongoose.connect('mongodb://heroku_d895z9hp:74v0ph37vib5v5gf02jb675acf@ds135522.mlab.com:35522/heroku_d895z9hp', err => { -// if (err) { -// console.log("couldn't connect to MongoDB"); -// } -// console.log('#connected to MongoDB!') -// }) -// -// const Class = mongoose.model('Class', { -// course_id: String, -// time: Date, -// location: String, -// url: String -// }) -// -// Class.create({ -// course_id: "301230213201430232103012a302", -// time: new Date(), -// location: "Wcoding", -// url: "https://www.meetup.com/Learn-Teach-Code-Seoul/events/240927632/", -// }, (err, data)=>{ -// console.log('#saved ' + data); -// mongoose.disconnect(err =>{ -// console.log('#disconnected from MongoDB'); -// }) -// }) -// // -// // Class.findById('594f6dff9a856b58a9299750', (err, data) =>{ -// // console.log(data); -// // mongoose.disconnect(err =>{ -// // console.log('#disconnected from MongoDB'); -// // }) -// // }) -// // -// // Class.findByIdAndUpdate('594f6dff9a856b58a9299750', -// // {location: 'Hawaii', time: new Date()} -// // ,(err, data) =>{ -// // console.log(data); -// // mongoose.disconnect(err =>{ -// // console.log('#updated and disconnected from MongoDB'); -// // }) -// // }) -// // -// // Class.findByIdAndRemove('594f6dff9a856b58a9299750', (err, data) =>{ -// // console.log(data); -// // mongoose.disconnect(err =>{ -// // console.log('#Found, removed, and disconnected from MongoDB'); -// // }) -// // }) -// // -// // Class.find({}, (err, article) =>{ -// // console.log(article); -// // mongoose.disconnect(err =>{ -// // console.log('#found all and disconnected from MongoDB'); -// // }) -// // }) +const mongoose = require('mongoose'); + + mongoose.connect('mongodb://heroku_d895z9hp:74v0ph37vib5v5gf02jb675acf@ds135522.mlab.com:35522/heroku_d895z9hp', err => { + if (err) { + console.log("couldn't connect to MongoDB"); + } + console.log('#connected to MongoDB!') + }) + + const Class = mongoose.model('Class', { + course_id: String, + time: Date, + location: String, + url: String + }) + + Class.create({ + course_id: "301230213201430232103012a302", + time: new Date(), + location: "Wcoding", + url: "https://www.meetup.com/Learn-Teach-Code-Seoul/events/240927632/", + }, (err, data)=>{ + console.log('#saved ' + data); + mongoose.disconnect(err =>{ + console.log('#disconnected from MongoDB'); + }) + }) + + Class.findById('594f6dff9a856b58a9299750', (err, data) =>{ + console.log(data); + mongoose.disconnect(err =>{ + console.log('#disconnected from MongoDB'); + }) + }) + + Class.findByIdAndUpdate('594f6dff9a856b58a9299750', + {location: 'Hawaii', time: new Date()} + ,(err, data) =>{ + console.log(data); + mongoose.disconnect(err =>{ + console.log('#updated and disconnected from MongoDB'); + }) + }) + + Class.findByIdAndRemove('594f6dff9a856b58a9299750', (err, data) =>{ + console.log(data); + mongoose.disconnect(err =>{ + console.log('#Found, removed, and disconnected from MongoDB'); + }) + }) + + Class.find({}, (err, article) =>{ + console.log(article); + mongoose.disconnect(err =>{ + console.log('#found all and disconnected from MongoDB'); + }) + }) diff --git a/src/CourseRepo.js b/src/CourseRepo.js index e7555d7..11685ed 100644 --- a/src/CourseRepo.js +++ b/src/CourseRepo.js @@ -1,58 +1,58 @@ -// const mongoose = require('mongoose'); -// -// mongoose.connect('mongodb://heroku_d895z9hp:74v0ph37vib5v5gf02jb675acf@ds135522.mlab.com:35522/heroku_d895z9hp', err => { -// if (err) { -// console.log("couldn't connect to MongoDB"); -// } -// console.log('#connected to MongoDB!') -// }) -// -// const Course = mongoose.model('Course', { -// title: String, -// description: String -// }) -// -// // Course.create({ -// // title: "Web Dev", -// // description: "Learning Bootstrap" -// // }, (err, data)=>{ -// // console.log('#saved ' + data); -// // mongoose.disconnect(err =>{ -// // console.log('#disconnected from MongoDB'); -// // }) -// // }) -// -// // Course.findById('594f6dff9a856b58a9299750', (err, data) =>{ -// // console.log(data); -// // mongoose.disconnect(err =>{ -// // if(err){ -// // console.log("Couldn't find this course"); -// // } -// // console.log('#disconnected from MongoDB'); -// // }) -// // }) -// -// // Course.findByIdAndUpdate('594f6dff9a856b58a9299750', -// // {title: 'Java Beginners', description: "learn about objects"} -// // ,(err, data) =>{ -// // console.log(data); -// // mongoose.disconnect(err =>{ -// // console.log('#updated and disconnected from MongoDB'); -// // }) -// // }) -// // -// // Course.findByIdAndRemove('594f71d294f11e593a927ef9', (err, data) =>{ -// // console.log(data); -// // mongoose.disconnect(err =>{ -// // console.log('#Found, removed, and disconnected from MongoDB'); -// // }) -// // }) -// -// Course.find({}, (err, article) =>{ -// console.log(article); -// mongoose.disconnect(err =>{ -// console.log('#found all and disconnected from MongoDB'); -// }) -// }) -// // -// // module.exports = CourseRepo +const mongoose = require('mongoose'); + +mongoose.connect('mongodb://heroku_d895z9hp:74v0ph37vib5v5gf02jb675acf@ds135522.mlab.com:35522/heroku_d895z9hp', err => { + if (err) { + console.log("couldn't connect to MongoDB"); + } + console.log('#connected to MongoDB!') +}) + +const Course = mongoose.model('Course', { + title: String, + description: String +}) + +Course.create({ + title: "Web Dev", + description: "Learning Bootstrap" +}, (err, data)=>{ + console.log('#saved ' + data); + mongoose.disconnect(err =>{ + console.log('#disconnected from MongoDB'); + }) +}) + +Course.findById('594f6dff9a856b58a9299750', (err, data) =>{ + console.log(data); + mongoose.disconnect(err =>{ + if(err){ + console.log("Couldn't find this course"); + } + console.log('#disconnected from MongoDB'); + }) +}) + +Course.findByIdAndUpdate('594f6dff9a856b58a9299750', +{title: 'Java Beginners', description: "learn about objects"} + ,(err, data) =>{ + console.log(data); + mongoose.disconnect(err =>{ + console.log('#updated and disconnected from MongoDB'); + }) +}) + +Course.findByIdAndRemove('594f71d294f11e593a927ef9', (err, data) =>{ + console.log(data); + mongoose.disconnect(err =>{ + console.log('#Found, removed, and disconnected from MongoDB'); + }) +}) + +Course.find({}, (err, article) =>{ + console.log(article); + mongoose.disconnect(err =>{ + console.log('#found all and disconnected from MongoDB'); + }) +}) + +module.exports = CourseRepo diff --git a/views/includes/header.pug b/views/includes/header.pug index d8331a9..664baa1 100644 --- a/views/includes/header.pug +++ b/views/includes/header.pug @@ -11,7 +11,7 @@ nav.navbar.navbar-inverse.bg-inverse.rounded.navbar-toggleable-md li.nav-item a.nav-link(href='/courses') i.fa.fa-graduation-cap - | Courses + | Events form.form-inline.my-2.my-md-0 // input.form-control.mr-sm-2(type='text', placeholder='Search') a.btn.btn-outline-success.my-2.my-sm-0(href='/courses') Register for class From 5b83f92f0e497d88629e3ae0e2e8ebe996fe1940 Mon Sep 17 00:00:00 2001 From: Hazelton Jacob Date: Thu, 2 Nov 2017 16:07:33 +0900 Subject: [PATCH 37/81] 'Changed all 'Course' and 'Courses' to 'Event' and 'Events' --- README.md | 8 +- app.js | 4 +- models/{Course.js => Event.js} | 12 +- models/checkIn.js | 4 +- models/session.js | 4 +- public/stylesheets/style.css | 2 + routes/{courses.js => events.js} | 36 +++--- routes/users.js | 6 +- src/ClassRepo.js | 114 ++++++++--------- src/CourseRepo.js | 116 +++++++++--------- src/userRepository.js | 6 +- test/{course => event}/modelCreate.test.js | 18 +-- test/{course => event}/modelDestroy.test.js | 16 +-- test/{course => event}/modelRead.test.js | 10 +- test/{course => event}/modelUpdate.test.js | 18 +-- .../modelValidations.test.js | 16 +-- test/{course => event}/repo.test.js | 0 test/session/modelCreate.test.js | 20 +-- test/session/modelDestroy.test.js | 4 +- test/session/modelUpdate.test.js | 16 +-- test/test_helper.test.js | 4 +- test/user/modelDestroy.test.js | 4 +- views/courses/index.pug | 22 ---- views/courses/show.pug | 9 -- views/{courses => events}/create.pug | 4 +- views/{courses => events}/edit.pug | 6 +- views/events/index.pug | 22 ++++ views/events/show.pug | 9 ++ views/includes/header.pug | 4 +- views/users/show.pug | 10 +- views/users/signup.pug | 6 +- 31 files changed, 267 insertions(+), 263 deletions(-) rename models/{Course.js => Event.js} (74%) rename routes/{courses.js => events.js} (54%) rename test/{course => event}/modelCreate.test.js (72%) rename test/{course => event}/modelDestroy.test.js (54%) rename test/{course => event}/modelRead.test.js (52%) rename test/{course => event}/modelUpdate.test.js (78%) rename test/{course => event}/modelValidations.test.js (85%) rename test/{course => event}/repo.test.js (100%) delete mode 100644 views/courses/index.pug delete mode 100644 views/courses/show.pug rename views/{courses => events}/create.pug (84%) rename views/{courses => events}/edit.pug (59%) create mode 100644 views/events/index.pug create mode 100644 views/events/show.pug diff --git a/README.md b/README.md index 2147fa6..e31116e 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This is a tool to help Learn Teach Code track and manage attendance to meetup ev See Issues for the features we're working on. -Currently, the application has no authentication, and anyone can create events or register. The application is not yet ready for production, but the core features of event creation and attendance marking are there. +Currently, the application has no authentication, and anyone can create events or register. The application is not yet ready for production, but the core features of event creation and attendance marking are there. ## Setup instructions @@ -49,17 +49,17 @@ npm run test-watch => runs all tests each time a change is saved #### UsersClasses * _id * user_id -* course_id +* event_id * date #### Lecture * _id -* course_id +* event_id * time * location * url -#### Course +#### Event * _id * title * description diff --git a/app.js b/app.js index 6a1d340..a9deb80 100644 --- a/app.js +++ b/app.js @@ -11,7 +11,7 @@ const session = require('express-session'); const index = require('./routes/index'); const users = require('./routes/users'); -const courses = require('./routes/courses'); +const events = require('./routes/events'); const app = express(); // database @@ -52,7 +52,7 @@ app.use(express.static(path.join(__dirname, 'public'))); app.use('/', index); app.use('/users', users); -app.use('/courses', courses); +app.use('/events', events); // required for passport app.use(session({ secret: 'thisneedstobehidden' })); diff --git a/models/Course.js b/models/Event.js similarity index 74% rename from models/Course.js rename to models/Event.js index 505377d..56c2471 100644 --- a/models/Course.js +++ b/models/Event.js @@ -1,8 +1,8 @@ const mongoose = require('mongoose'); -const courseSchema = new mongoose.Schema({ +const eventSchema = new mongoose.Schema({ title: { - type: String, + type: String, required: [true, 'Title is required'], validate: { validator: (title) => title.length > 1 && title.length < 100, @@ -10,9 +10,9 @@ const courseSchema = new mongoose.Schema({ } }, description: { - type: String, + type: String, validate: { - validator: (description) => + validator: (description) => description.length > 2 && description.length < 10000, message: 'Description must be valid length' } @@ -27,6 +27,6 @@ const courseSchema = new mongoose.Schema({ ] }); -const Course = mongoose.model('course', courseSchema) +const Event = mongoose.model('event', eventSchema) -module.exports = Course +module.exports = Event diff --git a/models/checkIn.js b/models/checkIn.js index a3edd92..f24bca5 100644 --- a/models/checkIn.js +++ b/models/checkIn.js @@ -5,9 +5,9 @@ const checkInSchema = new mongoose.Schema({ type: mongoose.Schema.Types.ObjectId, ref: 'user' }, - course: { + event: { type: mongoose.Schema.Types.ObjectId, - ref: 'course' + ref: 'event' }, date: { type: Date, default: Date.now } }); diff --git a/models/session.js b/models/session.js index e39a7f9..89b98ae 100644 --- a/models/session.js +++ b/models/session.js @@ -9,9 +9,9 @@ const sessionSchema = new mongoose.Schema({ ref: 'checkIn' } ], - course: { + event: { type: mongoose.Schema.Types.ObjectId, - ref: 'course' + ref: 'event' } }); diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index 5d4a641..2eabb19 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -121,6 +121,8 @@ input[type="submit"] { .user-profile a:hover { text-decoration: none; } + + /********************************************/ /* user-profile-edit styles */ /********************************************/ diff --git a/routes/courses.js b/routes/events.js similarity index 54% rename from routes/courses.js rename to routes/events.js index c9cd8b2..9d11a21 100644 --- a/routes/courses.js +++ b/routes/events.js @@ -1,80 +1,80 @@ const router = require('express').Router(); -const Course = require('../models/Course') +const Event = require('../models/Event') router.get('/', function(req, res, next) { - Course.find({}).sort({createdAt: -1}).exec((err, courses) => { + Event.find({}).sort({createdAt: -1}).exec((err, events) => { if (err) return console.log(err); - res.render('courses/index', { courses: courses }); + res.render('events/index', { events: events }); }); }); router.get('/create', (req, res)=>{ - res.render('courses/create') + res.render('events/create') }) router.post('/create', (req, res) => { - Course.create(req.body, (err, newCourse) => { + Event.create(req.body, (err, newEvent) => { console.log("this is the post request"); if (err) { console.log(err); - res.redirect('/courses/create'); + res.redirect('/events/create'); } else { - res.redirect('/courses'); + res.redirect('/events'); } }); }); router.get('/:id', (req, res) => { - Course.findById(req.params.id, (err, course) => { + Event.findById(req.params.id, (err, event) => { if (err) { console.log(err); res.redirect('/'); } else { - res.render('courses/show', {course: course}); + res.render('events/show', {event: event}); } }); }); router.get('/:id/edit', (req, res) => { - Course.findById(req.params.id, (err, course) => { + Event.findById(req.params.id, (err, event) => { console.log("in id/edit of " + req.params.id); if (err) { console.log(err); res.redirect('/'); } else { - res.render('courses/edit', {course: course}); + res.render('events/edit', {event: event}); } }); }); router.post('/:id', (req, res) => { - Course.findByIdAndUpdate(req.params.id, req.body, (err, result) => { + Event.findByIdAndUpdate(req.params.id, req.body, (err, result) => { if (err) { console.log(err); res.redirect('/'); } else { - res.redirect('/courses/' + req.params.id); + res.redirect('/events/' + req.params.id); } }); }); router.get('/:id/checkin', (req, res) => { - Course.findById(req.params.id, (err, course) => { + Event.findById(req.params.id, (err, event) => { if (err) { - console.log(err); + console.log(err); } else { - res.render('users/signup', {course: course}) + res.render('users/signup', {event: event}) } }); }); router.post('/:id/delete', (req, res) => { - Course.findByIdAndRemove(req.params.id, (err, result) => { + Event.findByIdAndRemove(req.params.id, (err, result) => { if (err) { console.log(err); res.redirect('/'); } else { - res.redirect('/courses'); + res.redirect('/events'); } }); }); diff --git a/routes/users.js b/routes/users.js index bd0f89c..da3ef54 100644 --- a/routes/users.js +++ b/routes/users.js @@ -22,13 +22,13 @@ router.post('/signup', (req, res) => { userRepo.createUser(req.body, cb => { if (cb.err) { const error = 'Unable to create user'; - res.render('users/signup', {error: cb.err, course: req.body}); - } else { + res.render('users/signup', {error: cb.err, event: req.body}); + } else { const success = 'to the class ' + req.body.name + '!'; res.redirect('/users'); } }); - } else { + } else { userRepo.createCheckIn(req.body, cb => { const success = 'back to class ' + req.body.name + '!'; res.redirect('/users'); diff --git a/src/ClassRepo.js b/src/ClassRepo.js index 31ff2bd..543da4d 100644 --- a/src/ClassRepo.js +++ b/src/ClassRepo.js @@ -1,57 +1,57 @@ -const mongoose = require('mongoose'); - - mongoose.connect('mongodb://heroku_d895z9hp:74v0ph37vib5v5gf02jb675acf@ds135522.mlab.com:35522/heroku_d895z9hp', err => { - if (err) { - console.log("couldn't connect to MongoDB"); - } - console.log('#connected to MongoDB!') - }) - - const Class = mongoose.model('Class', { - course_id: String, - time: Date, - location: String, - url: String - }) - - Class.create({ - course_id: "301230213201430232103012a302", - time: new Date(), - location: "Wcoding", - url: "https://www.meetup.com/Learn-Teach-Code-Seoul/events/240927632/", - }, (err, data)=>{ - console.log('#saved ' + data); - mongoose.disconnect(err =>{ - console.log('#disconnected from MongoDB'); - }) - }) - - Class.findById('594f6dff9a856b58a9299750', (err, data) =>{ - console.log(data); - mongoose.disconnect(err =>{ - console.log('#disconnected from MongoDB'); - }) - }) - - Class.findByIdAndUpdate('594f6dff9a856b58a9299750', - {location: 'Hawaii', time: new Date()} - ,(err, data) =>{ - console.log(data); - mongoose.disconnect(err =>{ - console.log('#updated and disconnected from MongoDB'); - }) - }) - - Class.findByIdAndRemove('594f6dff9a856b58a9299750', (err, data) =>{ - console.log(data); - mongoose.disconnect(err =>{ - console.log('#Found, removed, and disconnected from MongoDB'); - }) - }) - - Class.find({}, (err, article) =>{ - console.log(article); - mongoose.disconnect(err =>{ - console.log('#found all and disconnected from MongoDB'); - }) - }) +// const mongoose = require('mongoose'); +// +// mongoose.connect('mongodb://heroku_d895z9hp:74v0ph37vib5v5gf02jb675acf@ds135522.mlab.com:35522/heroku_d895z9hp', err => { +// if (err) { +// console.log("couldn't connect to MongoDB"); +// } +// console.log('#connected to MongoDB!') +// }) +// +// const Class = mongoose.model('Class', { +// event_id: String, +// time: Date, +// location: String, +// url: String +// }) +// +// Class.create({ +// event_id: "301230213201430232103012a302", +// time: new Date(), +// location: "Wcoding", +// url: "https://www.meetup.com/Learn-Teach-Code-Seoul/events/240927632/", +// }, (err, data)=>{ +// console.log('#saved ' + data); +// mongoose.disconnect(err =>{ +// console.log('#disconnected from MongoDB'); +// }) +// }) +// +// Class.findById('594f6dff9a856b58a9299750', (err, data) =>{ +// console.log(data); +// mongoose.disconnect(err =>{ +// console.log('#disconnected from MongoDB'); +// }) +// }) +// +// Class.findByIdAndUpdate('594f6dff9a856b58a9299750', +// {location: 'Hawaii', time: new Date()} +// ,(err, data) =>{ +// console.log(data); +// mongoose.disconnect(err =>{ +// console.log('#updated and disconnected from MongoDB'); +// }) +// }) +// +// Class.findByIdAndRemove('594f6dff9a856b58a9299750', (err, data) =>{ +// console.log(data); +// mongoose.disconnect(err =>{ +// console.log('#Found, removed, and disconnected from MongoDB'); +// }) +// }) +// +// Class.find({}, (err, article) =>{ +// console.log(article); +// mongoose.disconnect(err =>{ +// console.log('#found all and disconnected from MongoDB'); +// }) +// }) diff --git a/src/CourseRepo.js b/src/CourseRepo.js index 11685ed..61a9919 100644 --- a/src/CourseRepo.js +++ b/src/CourseRepo.js @@ -1,58 +1,58 @@ -const mongoose = require('mongoose'); - -mongoose.connect('mongodb://heroku_d895z9hp:74v0ph37vib5v5gf02jb675acf@ds135522.mlab.com:35522/heroku_d895z9hp', err => { - if (err) { - console.log("couldn't connect to MongoDB"); - } - console.log('#connected to MongoDB!') -}) - -const Course = mongoose.model('Course', { - title: String, - description: String -}) - -Course.create({ - title: "Web Dev", - description: "Learning Bootstrap" -}, (err, data)=>{ - console.log('#saved ' + data); - mongoose.disconnect(err =>{ - console.log('#disconnected from MongoDB'); - }) -}) - -Course.findById('594f6dff9a856b58a9299750', (err, data) =>{ - console.log(data); - mongoose.disconnect(err =>{ - if(err){ - console.log("Couldn't find this course"); - } - console.log('#disconnected from MongoDB'); - }) -}) - -Course.findByIdAndUpdate('594f6dff9a856b58a9299750', -{title: 'Java Beginners', description: "learn about objects"} - ,(err, data) =>{ - console.log(data); - mongoose.disconnect(err =>{ - console.log('#updated and disconnected from MongoDB'); - }) -}) - -Course.findByIdAndRemove('594f71d294f11e593a927ef9', (err, data) =>{ - console.log(data); - mongoose.disconnect(err =>{ - console.log('#Found, removed, and disconnected from MongoDB'); - }) -}) - -Course.find({}, (err, article) =>{ - console.log(article); - mongoose.disconnect(err =>{ - console.log('#found all and disconnected from MongoDB'); - }) -}) - -module.exports = CourseRepo +// const mongoose = require('mongoose'); +// +// mongoose.connect('mongodb://heroku_d895z9hp:74v0ph37vib5v5gf02jb675acf@ds135522.mlab.com:35522/heroku_d895z9hp', err => { +// if (err) { +// console.log("couldn't connect to MongoDB"); +// } +// console.log('#connected to MongoDB!') +// }) +// +// const Event = mongoose.model('Event', { +// title: String, +// description: String +// }) +// +// Event.create({ +// title: "Web Dev", +// description: "Learning Bootstrap" +// }, (err, data)=>{ +// console.log('#saved ' + data); +// mongoose.disconnect(err =>{ +// console.log('#disconnected from MongoDB'); +// }) +// }) +// +// Event.findById('594f6dff9a856b58a9299750', (err, data) =>{ +// console.log(data); +// mongoose.disconnect(err =>{ +// if(err){ +// console.log("Couldn't find this event"); +// } +// console.log('#disconnected from MongoDB'); +// }) +// }) +// +// Event.findByIdAndUpdate('594f6dff9a856b58a9299750', +// {title: 'Java Beginners', description: "learn about objects"} +// ,(err, data) =>{ +// console.log(data); +// mongoose.disconnect(err =>{ +// console.log('#updated and disconnected from MongoDB'); +// }) +// }) +// +// Event.findByIdAndRemove('594f71d294f11e593a927ef9', (err, data) =>{ +// console.log(data); +// mongoose.disconnect(err =>{ +// console.log('#Found, removed, and disconnected from MongoDB'); +// }) +// }) +// +// Event.find({}, (err, article) =>{ +// console.log(article); +// mongoose.disconnect(err =>{ +// console.log('#found all and disconnected from MongoDB'); +// }) +// }) +// +// module.exports = EventRepo diff --git a/src/userRepository.js b/src/userRepository.js index 2b8f70f..0fc8036 100644 --- a/src/userRepository.js +++ b/src/userRepository.js @@ -11,8 +11,8 @@ module.exports = { createUser(reqBody, cb) { const newCheckIn = new CheckIn({ - user: reqBody._id, - course: reqBody.courseId + user: reqBody._id, + event: reqBody.eventId }); const user = { name: reqBody.name, @@ -33,7 +33,7 @@ module.exports = { } else { const newCheckIn = new CheckIn({ user: user._id, - course: data.courseId + event: data.eventId }); user.checkIns.push({_id: newCheckIn._id}) user.name = data.name; diff --git a/test/course/modelCreate.test.js b/test/event/modelCreate.test.js similarity index 72% rename from test/course/modelCreate.test.js rename to test/event/modelCreate.test.js index 0b86219..21eb002 100644 --- a/test/course/modelCreate.test.js +++ b/test/event/modelCreate.test.js @@ -1,29 +1,29 @@ -const Course = require('../../models/Course'); +const Event = require('../../models/Event'); const User = require('../../models/User'); const config = require('../config.test.js'); const assert = require('assert'); const mongoose = require('mongoose'); -describe('Course modelCreate', () => { +describe('Event modelCreate', () => { let sql; beforeEach((done) => { - sql = new Course({title: 'sql'}) + sql = new Event({title: 'sql'}) sql.save() .then(() => done()); }); afterEach((done) => { User.collection.drop(); - Course.collection.drop(); + Event.collection.drop(); done(); }); - it('Should create a new Course record', (done) => { + it('Should create a new Event record', (done) => { assert(!sql.isNew); done(); }); - it('Should be able to set Course Description', (done) => { + it('Should be able to set Event Description', (done) => { sql.description = "beginner sql"; sql.save() .then((result) => { @@ -32,10 +32,10 @@ describe('Course modelCreate', () => { }) }); - it('Should be able to set Course Tags', (done) => { + it('Should be able to set Event Tags', (done) => { sql.tags = ['sql', 'beginner'] sql.save() - .then(() => Course.findOne({title: 'sql'})) + .then(() => Event.findOne({title: 'sql'})) .then((result) => { assert(result.tags[0] === 'sql'); assert(result.tags[1] === 'beginner'); @@ -52,7 +52,7 @@ describe('Course modelCreate', () => { const joe = new User({}); sql.instructors.push({_id: joe._id}) sql.save() - .then(() => Course.findOne({title: 'sql'})) + .then(() => Event.findOne({title: 'sql'})) .then((result) => { assert(String(result.instructors) === String(joe._id)); done(); diff --git a/test/course/modelDestroy.test.js b/test/event/modelDestroy.test.js similarity index 54% rename from test/course/modelDestroy.test.js rename to test/event/modelDestroy.test.js index 46fc4f0..f13b090 100644 --- a/test/course/modelDestroy.test.js +++ b/test/event/modelDestroy.test.js @@ -1,24 +1,24 @@ -const Course = require('../../models/Course'); +const Event = require('../../models/Event'); const config = require('../config.test.js'); const assert = require('assert'); const mongoose = require('mongoose'); -describe('Course modelDestroy', () => { +describe('Event modelDestroy', () => { beforeEach((done) => { - const sql = new Course({title: 'sql'}) + const sql = new Event({title: 'sql'}) sql.save() .then(() => done()); }); afterEach((done) => { - Course.collection.drop(); + Event.collection.drop(); done(); }); - it('Should destroy course record', (done) => { - const ruby = new Course({title: 'ruby'}) + it('Should destroy event record', (done) => { + const ruby = new Event({title: 'ruby'}) ruby.save() - .then(() => Course.remove({title: 'sql'})) - .then(() => Course.find({})) + .then(() => Event.remove({title: 'sql'})) + .then(() => Event.find({})) .then((results) => { assert(results.length === 1); assert(results[0].title === 'ruby'); diff --git a/test/course/modelRead.test.js b/test/event/modelRead.test.js similarity index 52% rename from test/course/modelRead.test.js rename to test/event/modelRead.test.js index 75d9c42..c582669 100644 --- a/test/course/modelRead.test.js +++ b/test/event/modelRead.test.js @@ -1,14 +1,14 @@ -const Course = require('../../models/Course'); +const Event = require('../../models/Event'); const config = require('../config.test.js'); const assert = require('assert'); const mongoose = require('mongoose'); -describe('Course modelRead', () => { +describe('Event modelRead', () => { - it('Should find a Course by _id', (done) => { - const sql = new Course({title: 'sql'}); + it('Should find a Event by _id', (done) => { + const sql = new Event({title: 'sql'}); sql.save() - .then(() => Course.findOne({_id: sql._id})) + .then(() => Event.findOne({_id: sql._id})) .then((result) => { assert(String(result._id) === String(sql._id)); done() diff --git a/test/course/modelUpdate.test.js b/test/event/modelUpdate.test.js similarity index 78% rename from test/course/modelUpdate.test.js rename to test/event/modelUpdate.test.js index 92465b3..5024df7 100644 --- a/test/course/modelUpdate.test.js +++ b/test/event/modelUpdate.test.js @@ -1,16 +1,16 @@ -const Course = require('../../models/Course'); +const Event = require('../../models/Event'); const User = require('../../models/User'); const config = require('../config.test.js'); const assert = require('assert'); const mongoose = require('mongoose'); -describe('Course modelUpdate', () => { +describe('Event modelUpdate', () => { let sql; beforeEach((done) => { const joe = new User({}); - sql = new Course({ - title: 'sql', + sql = new Event({ + title: 'sql', description: 'beginner sql', tags: ['beginner', 'sql'], instructors: [{_id: joe._id}] @@ -20,7 +20,7 @@ describe('Course modelUpdate', () => { }); afterEach((done) => { - Course.collection.drop(); + Event.collection.drop(); User.collection.drop(); done(); }); @@ -28,7 +28,7 @@ describe('Course modelUpdate', () => { it('Should update Title', (done) => { sql.title = 'ruby'; sql.save() - .then(() => Course.findOne({_id: sql._id})) + .then(() => Event.findOne({_id: sql._id})) .then((result) => { assert(result.title === 'ruby'); done(); @@ -38,7 +38,7 @@ describe('Course modelUpdate', () => { it('Should update Description', (done) => { sql.description = 'beginner ruby'; sql.save() - .then(() => Course.findOne({_id: sql._id})) + .then(() => Event.findOne({_id: sql._id})) .then((result) => { assert(result.description === 'beginner ruby'); done(); @@ -48,7 +48,7 @@ describe('Course modelUpdate', () => { it('Should update Tags', (done) => { sql.tags = ['beginner', 'ruby'] sql.save() - .then(() => Course.findOne({_id: sql._id})) + .then(() => Event.findOne({_id: sql._id})) .then((result) => { assert(result.tags[0] === 'beginner'); assert(result.tags[1] === 'ruby'); @@ -60,7 +60,7 @@ describe('Course modelUpdate', () => { const jane = new User({}); sql.instructors = {_id: jane._id}; sql.save() - .then(() => Course.findOne({_id: sql._id})) + .then(() => Event.findOne({_id: sql._id})) .then((result) => { assert(String(result.instructors[0]) === String(jane._id)); done(); diff --git a/test/course/modelValidations.test.js b/test/event/modelValidations.test.js similarity index 85% rename from test/course/modelValidations.test.js rename to test/event/modelValidations.test.js index bcb8e2b..1d228f6 100644 --- a/test/course/modelValidations.test.js +++ b/test/event/modelValidations.test.js @@ -1,19 +1,19 @@ -const Course = require('../../models/Course'); +const Event = require('../../models/Event'); const config = require('../config.test.js'); const assert = require('assert'); const mongoose = require('mongoose'); -describe('Course model validations', () => { +describe('Event model validations', () => { it('Should require title', (done) => { - const ruby = new Course({ name: undefined }); + const ruby = new Event({ name: undefined }); const validationResult = ruby.validateSync(); const message = validationResult.errors.title.message; assert(message === 'Title is required'); done(); }); - + it('Should require title length more than 1 chars', (done) => { - const ruby = new Course({ + const ruby = new Event({ title: 'r', }); const validationResult = ruby.validateSync(); @@ -23,7 +23,7 @@ describe('Course model validations', () => { }); it('Should require title length less than 100 chars', (done) => { - const ruby = new Course({ + const ruby = new Event({ title: 'r'.repeat(100), }); const validationResult = ruby.validateSync(); @@ -33,7 +33,7 @@ describe('Course model validations', () => { }); it('Should require description length more than 2 chars', (done) => { - const ruby = new Course({ + const ruby = new Event({ title: 'ruby', description: 'rr' }); @@ -44,7 +44,7 @@ describe('Course model validations', () => { }); it('Should require description length less than 10000 chars', (done) => { - const ruby = new Course({ + const ruby = new Event({ title: 'ruby', description: 'r'.repeat(10000) }); diff --git a/test/course/repo.test.js b/test/event/repo.test.js similarity index 100% rename from test/course/repo.test.js rename to test/event/repo.test.js diff --git a/test/session/modelCreate.test.js b/test/session/modelCreate.test.js index f5bfa92..a5e52c9 100644 --- a/test/session/modelCreate.test.js +++ b/test/session/modelCreate.test.js @@ -1,5 +1,5 @@ const Session = require('../../models/session'); -const Course = require('../../models/Course'); +const Event = require('../../models/Event'); const CheckIn = require('../../models/checkIn'); const config = require('../config.test.js'); const assert = require('assert'); @@ -12,10 +12,10 @@ describe('Session modelCreate', () => { firstSession = new Session({}); firstSession.save() .then(() => done()); - + }); afterEach((done) => { - Course.collection.drop(); + Event.collection.drop(); Session.collection.drop(); done(); }); @@ -29,23 +29,23 @@ describe('Session modelCreate', () => { assert(firstSession.sessionOpen === true); done() }); - + it('Should have Date timestamp be a date type', (done) => { assert(firstSession.date instanceof Date); done() }); - it('Should be able to set Course', (done) => { - const sql = new Course({title: 'sql', description: 'beginner sql'}) - firstSession.course = {_id: sql._id}; + it('Should be able to set Event', (done) => { + const sql = new Event({title: 'sql', description: 'beginner sql'}) + firstSession.event = {_id: sql._id}; firstSession.save() .then(() => Session.findOne({_id: firstSession._id})) .then((result) => { - assert(String(result.course) === String(sql._id)); + assert(String(result.event) === String(sql._id)); done() }) - }); - + }); + it('Should be able to add to CheckIns', (done) => { const firstCheckIn = new CheckIn({}); firstSession.checkIns.push(firstCheckIn) diff --git a/test/session/modelDestroy.test.js b/test/session/modelDestroy.test.js index a9dda82..9f675ff 100644 --- a/test/session/modelDestroy.test.js +++ b/test/session/modelDestroy.test.js @@ -1,5 +1,5 @@ const Session = require('../../models/session'); -const Course = require('../../models/Course'); +const Event = require('../../models/Event'); const config = require('../config.test.js'); const assert = require('assert'); const mongoose = require('mongoose'); @@ -14,7 +14,7 @@ describe('Session modelDestroy', () => { }); afterEach((done) => { Session.collection.drop(); - Course.collection.drop(); + Event.collection.drop(); done(); }); diff --git a/test/session/modelUpdate.test.js b/test/session/modelUpdate.test.js index b6809fc..eda817d 100644 --- a/test/session/modelUpdate.test.js +++ b/test/session/modelUpdate.test.js @@ -1,6 +1,6 @@ const Session = require('../../models/session'); const CheckIn = require('../../models/checkIn'); -const Course = require('../../models/Course'); +const Event = require('../../models/Event'); const config = require('../config.test.js'); const assert = require('assert'); const mongoose = require('mongoose'); @@ -11,9 +11,9 @@ describe('Session modelUpdate', () => { beforeEach((done) => { firstSession = new Session({}); firstCheckIn = new CheckIn({}); - sql = new Course({title: 'sql'}); + sql = new Event({title: 'sql'}); firstSession.checkIns = [{_id: firstCheckIn._id}]; - firstSession.course = {_id: sql._id}; + firstSession.event = {_id: sql._id}; firstSession.save() .then(() => done()); @@ -21,7 +21,7 @@ describe('Session modelUpdate', () => { afterEach((done) => { Session.collection.drop(); CheckIn.collection.drop(); - Course.collection.drop(); + Event.collection.drop(); done(); }); @@ -44,13 +44,13 @@ describe('Session modelUpdate', () => { done(); }); }); - it('Should update a Session course', (done) => { - const ruby = new Course({title: 'ruby'}); - firstSession.course = {_id: ruby._id}; + it('Should update a Session event', (done) => { + const ruby = new Event({title: 'ruby'}); + firstSession.event = {_id: ruby._id}; firstSession.save() .then(() => Session.findOne({_id: firstSession._id})) .then((result) => { - assert(String(result.course) === String(ruby._id)); + assert(String(result.event) === String(ruby._id)); done(); }); }); diff --git a/test/test_helper.test.js b/test/test_helper.test.js index 41a05d6..0194299 100644 --- a/test/test_helper.test.js +++ b/test/test_helper.test.js @@ -7,8 +7,8 @@ mongoose.createConnection(config.MONGODB_URI); mongoose.Promise = global.Promise; beforeEach((done) => { - const { users, courses } = mongoose.connection.collections; + const { users, events } = mongoose.connection.collections; users.drop(() => { - courses.drop(() => done()); + events.drop(() => done()); }); }); diff --git a/test/user/modelDestroy.test.js b/test/user/modelDestroy.test.js index 9a94018..e9ec971 100644 --- a/test/user/modelDestroy.test.js +++ b/test/user/modelDestroy.test.js @@ -1,5 +1,5 @@ const User = require('../../models/User'); -const Course = require('../../models/Course'); +const Event = require('../../models/Event'); const config = require('../config.test.js'); const assert = require('assert'); const mongoose = require('mongoose'); @@ -14,7 +14,7 @@ describe('User modelDestroy', () => { }); afterEach((done) => { User.collection.drop(); - Course.collection.drop(); + Event.collection.drop(); done(); }); diff --git a/views/courses/index.pug b/views/courses/index.pug deleted file mode 100644 index c865973..0000000 --- a/views/courses/index.pug +++ /dev/null @@ -1,22 +0,0 @@ -extends ../layout - -block content - h2 - i.fa.fa-graduation-cap - | Courses - hr - - .text-right - a.btn.btn-primary(href='/courses/create') - i.fa.fa-plus - | New Course - - for course in courses - .card.my-3 - .card-block - h4.card-title= course.title - h6.card-subtitle.mb-2.text-muted= `Created by ${course.createdBy || 'unknown'} at ${course.createdAt || 'unknown'}` - p.card-text= course.description - a.card-link(href="/courses/" + course._id) Details - a.card-link(href='#') Schedule - a.card-link(href="/courses/" + course._id + "/checkin") Register diff --git a/views/courses/show.pug b/views/courses/show.pug deleted file mode 100644 index 759f3a6..0000000 --- a/views/courses/show.pug +++ /dev/null @@ -1,9 +0,0 @@ -extends ../layout - -block content - h1 course page - p= course - - a(href="/courses/" + course._id + "/edit") edit - form(method="Post" action="/courses/" + course._id + "/delete") - button(type="submit") delete diff --git a/views/courses/create.pug b/views/events/create.pug similarity index 84% rename from views/courses/create.pug rename to views/events/create.pug index e84ba1d..78bd937 100644 --- a/views/courses/create.pug +++ b/views/events/create.pug @@ -6,9 +6,9 @@ block content div(class="row") div(class="col-md-2") div(class="col-md-8") - h2 Register a new course + h2 Register a new event - form(method="Post" action="/courses/create") + form(method="Post" action="/events/create") div(class="form-group") label(for="title") Name input(class="form-control" type="text" name="title" id="title") diff --git a/views/courses/edit.pug b/views/events/edit.pug similarity index 59% rename from views/courses/edit.pug rename to views/events/edit.pug index e7c7f88..59186ac 100644 --- a/views/courses/edit.pug +++ b/views/events/edit.pug @@ -2,9 +2,9 @@ extends ../layout block content h1 edit - form(method="Post" action="/courses/" + course._id) + form(method="Post" action="/events/" + event._id) label(for="title") Title - input(type="text" name="title" id="title" value=course.title) + input(type="text" name="title" id="title" value=event.title) label(for="description") Description - textarea(type="text" name="description" id="description") #{course.description} + textarea(type="text" name="description" id="description") #{event.description} input(type="submit") diff --git a/views/events/index.pug b/views/events/index.pug new file mode 100644 index 0000000..a9b8c19 --- /dev/null +++ b/views/events/index.pug @@ -0,0 +1,22 @@ +extends ../layout + +block content + h2 + i.fa.fa-graduation-cap + | Events + hr + + .text-right + a.btn.btn-primary(href='/events/create') + i.fa.fa-plus + | New Event + + for event in events + .card.my-3 + .card-block + h4.card-title= event.title + h6.card-subtitle.mb-2.text-muted= `Created by ${event.createdBy || 'unknown'} at ${event.createdAt || 'unknown'}` + p.card-text= event.description + a.card-link(href="/events/" + event._id) Details + a.card-link(href='#') Schedule + a.card-link(href="/events/" + event._id + "/checkin") Register diff --git a/views/events/show.pug b/views/events/show.pug new file mode 100644 index 0000000..11bdbf8 --- /dev/null +++ b/views/events/show.pug @@ -0,0 +1,9 @@ +extends ../layout + +block content + h1 Event Page + p= event + + a(href="/events/" + event._id + "/edit") edit + form(method="Post" action="/events/" + event._id + "/delete") + button(type="submit") delete diff --git a/views/includes/header.pug b/views/includes/header.pug index 664baa1..04c73ed 100644 --- a/views/includes/header.pug +++ b/views/includes/header.pug @@ -9,9 +9,9 @@ nav.navbar.navbar-inverse.bg-inverse.rounded.navbar-toggleable-md i.fa.fa-users | Users li.nav-item - a.nav-link(href='/courses') + a.nav-link(href='/events') i.fa.fa-graduation-cap | Events form.form-inline.my-2.my-md-0 // input.form-control.mr-sm-2(type='text', placeholder='Search') - a.btn.btn-outline-success.my-2.my-sm-0(href='/courses') Register for class + a.btn.btn-outline-success.my-2.my-sm-0(href='/events') Register for class diff --git a/views/users/show.pug b/views/users/show.pug index 39e7ff1..f783ce8 100644 --- a/views/users/show.pug +++ b/views/users/show.pug @@ -1,6 +1,8 @@ extends ../layout block content + + .user-profile.col-lg-8 .row .col-md-4.col-sm-12 @@ -25,7 +27,7 @@ block content tr td description td= user.description - - - - + hr + .text-right + a.btn.btn-primary(href='#') + | Request Badge diff --git a/views/users/signup.pug b/views/users/signup.pug index 5b9b53f..57154ec 100644 --- a/views/users/signup.pug +++ b/views/users/signup.pug @@ -7,7 +7,7 @@ block content div(class="col-md-8") h2 I attended strong - em #{course.title} + em #{event.title} container.alert-wrap - if(success) { .alert.alert-success @@ -23,7 +23,7 @@ block content input(class="form-control" type="text" name="name" id="name") label(for="email") Email input(class="form-control" type="email" name="email" id="email") - input(type="text" name="courseId" value=course._id hidden) - input(type="text" name="courseTitle" value=course.title hidden) + input(type="text" name="eventId" value=event._id hidden) + input(type="text" name="eventTitle" value=event.title hidden) input(class="btn btn-success" type="submit") div(class="col-md-2") From 0f40d46bebfea0a7cec30561c0689f561da8acf1 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Thu, 2 Nov 2017 18:18:19 +0900 Subject: [PATCH 38/81] Bookshelf is running with SQLite. Need to fix everything to use it --- .gitignore | 3 + app.js | 33 +- bin/www | 85 +- config/bookshelf.js | 70 ++ config/database.js | 5 - config/database.template.js | 7 + config/passport.js | 72 +- models/Course.js | 57 +- models/User.js | 149 +-- models/checkIn.js | 42 +- models/session.js | 20 - package-lock.json | 1791 +++++++++++++++++++++++------ package.json | 17 +- routes/courses.js | 2 + routes/users.js | 39 +- src/CourseRepo.js | 105 +- src/userRepository.js | 61 +- test/config.test.js | 3 - test/session/modelCreate.test.js | 59 - test/session/modelDestroy.test.js | 32 - test/session/modelRead.test.js | 18 - test/session/modelUpdate.test.js | 57 - test/session/repo.test.js | 0 test/test_helper.test.js | 16 +- test/user/repo.test.js | 108 +- 25 files changed, 1886 insertions(+), 965 deletions(-) create mode 100644 config/bookshelf.js delete mode 100644 config/database.js create mode 100644 config/database.template.js delete mode 100644 models/session.js delete mode 100644 test/config.test.js delete mode 100644 test/session/modelCreate.test.js delete mode 100644 test/session/modelDestroy.test.js delete mode 100644 test/session/modelRead.test.js delete mode 100644 test/session/modelUpdate.test.js delete mode 100644 test/session/repo.test.js diff --git a/.gitignore b/.gitignore index a1779a1..cd49af7 100644 --- a/.gitignore +++ b/.gitignore @@ -76,3 +76,6 @@ tags # End of https://www.gitignore.io/api/node .idea/ +config/database.dev.js +config/database.prod.js +*.sqlite diff --git a/app.js b/app.js index cb1bc52..6182754 100644 --- a/app.js +++ b/app.js @@ -4,40 +4,23 @@ const favicon = require('serve-favicon'); const morgan = require('morgan'); const cookieParser = require('cookie-parser'); const bodyParser = require('body-parser'); -const configDB = require('./config/database.js'); const passport = require('passport'); const flash = require('connect-flash'); const session = require('express-session'); + +// database +const bookshelfSetup = require('./config/bookshelf'); +bookshelfSetup.configureBookshelf(process.env.RUN_MODE); +if (process.env.RUN_MODE !== 'prod') { + bookshelfSetup.initializeDevDb(); +} + const index = require('./routes/index'); const users = require('./routes/users'); const courses = require('./routes/courses'); const app = express(); -// database -const mongoose = require('mongoose'); - -mongoose.Promise = global.Promise; -mongoose.set('debug', true); - -mongoose.connect(configDB.MONGO_DEV, err => { - if (err) { - console.log("# Failed to connect to MongoDB Dev:"); - } else { - console.log('# Connected to MongoDB Dev:') - } -}); - -// mongoose.connect(configDB.MONGODB_URI, err => { -// if (err) { -// console.log("# Failed to connect to MongoDB :", configDB.MONGODB_URI); -// } else { -// console.log('# Connected to MongoDB :', configDB.MONGODB_URI) -// } -// }) - -// require('./config/passport')(passport); - // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'pug'); diff --git a/bin/www b/bin/www index fc58d86..401352b 100755 --- a/bin/www +++ b/bin/www @@ -3,23 +3,20 @@ /** * Module dependencies. */ - -var app = require('../app'); -var debug = require('debug')('ltc-attendance:server'); -var http = require('http'); +const app = require('../app'); +const debug = require('debug')('ltc-attendance:server'); +const http = require('http'); /** * Get port from environment and store in Express. */ - -var port = normalizePort(process.env.PORT || '3000'); +let port = normalizePort(process.env.PORT || '3000'); app.set('port', port); /** * Create HTTP server. */ - -var server = http.createServer(app); +const server = http.createServer(app); /** * Listen on provided port, on all network interfaces. @@ -34,19 +31,19 @@ server.on('listening', onListening); */ function normalizePort(val) { - var port = parseInt(val, 10); + const port = parseInt(val, 10); - if (isNaN(port)) { - // named pipe - return val; - } + if (isNaN(port)) { + // named pipe + return val; + } - if (port >= 0) { - // port number - return port; - } + if (port >= 0) { + // port number + return port; + } - return false; + return false; } /** @@ -54,27 +51,27 @@ function normalizePort(val) { */ function onError(error) { - if (error.syscall !== 'listen') { - throw error; - } - - var bind = typeof port === 'string' - ? 'Pipe ' + port - : 'Port ' + port; - - // handle specific listen errors with friendly messages - switch (error.code) { - case 'EACCES': - console.error(bind + ' requires elevated privileges'); - process.exit(1); - break; - case 'EADDRINUSE': - console.error(bind + ' is already in use'); - process.exit(1); - break; - default: - throw error; - } + if (error.syscall !== 'listen') { + throw error; + } + + const bind = typeof port === 'string' + ? 'Pipe ' + port + : 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } } /** @@ -82,9 +79,9 @@ function onError(error) { */ function onListening() { - var addr = server.address(); - var bind = typeof addr === 'string' - ? 'pipe ' + addr - : 'port ' + addr.port; - debug('Listening on ' + bind); + let addr = server.address(); + const bind = typeof addr === 'string' + ? 'pipe ' + addr + : 'port ' + addr.port; + debug('Listening on ' + bind); } diff --git a/config/bookshelf.js b/config/bookshelf.js new file mode 100644 index 0000000..b5b9566 --- /dev/null +++ b/config/bookshelf.js @@ -0,0 +1,70 @@ +module.exports = { + + configureBookshelf: (runMode) => { + if (runMode === 'prod') { + + console.log('configuring database in prod mode'); + const config = require('./database.prod.js'); + + module.exports.knex = require('knex')({ + client: config.DB_TYPE, + connection: { + host: config.HOST, + user: config.USER, + password: config.PASSWORD, + database: config.DATABASE, + charset: config.CHARSET + } + }); + } else { + + console.log('configuring database in dev mode'); + const config = require('./database.dev.js'); + + module.exports.knex = require('knex')({ + client: config.DB_TYPE, + connection: { + filename: config.FILENAME + } + }); + } + + const bookshelf = require('bookshelf')(module.exports.knex); + bookshelf.plugin('registry'); + bookshelf.plugin('virtuals'); + bookshelf.plugin('visibility'); + module.exports.bookshelf = bookshelf; + }, + + initializeDevDb: () => { + console.log('creating tables'); + module.exports.knex.schema.createTableIfNotExists('user', (table) => { + table.increments(); + table.string('username'); + table.string('password'); + table.string('name'); + table.string('email', 128); + table.string('level').defaultTo('student'); + table.string('website'); + table.string('hometown'); + table.string('description'); + table.timestamps(); + }).createTableIfNotExists('course', (table) => { + table.increments(); + table.string('title'); + table.string('description'); + table.timestamps(); + }).createTableIfNotExists('check_in', (table) => { + table.increments(); + table.integer('user_id'); + table.integer('course_id'); + table.timestamps(); + }).createTableIfNotExists('course_instructor', (table) => { + table.increments(); + table.integer('course_id'); + table.integer('user_id'); + table.timestamps(); + }).toString(); + console.log('created tables'); + } +}; diff --git a/config/database.js b/config/database.js deleted file mode 100644 index 02e2ad6..0000000 --- a/config/database.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - MONGODB_URI: 'mongodb://heroku_d895z9hp:74v0ph37vib5v5gf02jb675acf@ds135522.mlab.com:35522/heroku_d895z9hp', - MONGO_DEV: 'mongodb://localhost/ltc_dev' -} - diff --git a/config/database.template.js b/config/database.template.js new file mode 100644 index 0000000..6a11b8d --- /dev/null +++ b/config/database.template.js @@ -0,0 +1,7 @@ +module.exports = { + HOST: '127.0.0.1', + USER: 'user', + PASSWORD: 'password', + DATABASE: 'database', + CHATSET: 'utf8' +}; \ No newline at end of file diff --git a/config/passport.js b/config/passport.js index 301b0af..3418a15 100644 --- a/config/passport.js +++ b/config/passport.js @@ -9,51 +9,54 @@ module.exports = (passport) => { }, (req, username, password, done) => { console.log('local strategy call invoked'); - userRepo.getUserByUsername(username, (user) => { - console.log('passport auth getting user by username'); - if (user.err) { - return done(user.err); - } + const user = userRepo.getUserByUsername(username) + .then(user => { + console.log('passport auth getting user by username'); - if (!user) { - return done(null, false, req.flash('loginMessage', 'Incorrect username.')); - } - - user.comparePassword(password, (err, isMatch) => { - if (err) { - return done(err); + if (!user) { + return done(null, false, req.flash('loginMessage', 'Incorrect username.')); } + return user; + }) + .catch(err => { + return done(err) + }); + + if (typeof user !== User) { + return user; + } + + user.comparePassword(password) + .then(isMatch => { if (isMatch) { return done(null, user); } return done(null, false, req.flash('loginMessage', 'Incorrect password.')); }); - }); } )); - // https://scotch.io/tutorials/easy-node-authentication-setup-and-local +// https://scotch.io/tutorials/easy-node-authentication-setup-and-local passport.use('local-signup', new LocalStrategy({ passReqToCallback: true }, (req, username, password, done) => { process.nextTick(() => { - userRepo.getUserByUsername(username, (existingUser) => { - if (existingUser.err) { - return done(existingUser.err); - } else if (existingUser) { - return done(null, false, req.flash('signupMessage', 'That username is already in use')); - } else { - userRepo.createUser(req.body, newUser => { - if (newUser.err) { - throw newUser.err; - } else { - return done(null, newUser) - } - }); - } - }); + userRepo.getUserByUsername(username) + .then(existingUser => { + if (existingUser) { + return done(null, false, req.flash('signupMessage', 'That username is already in use')); + } else { + return userRepo.createUser(req.body); + } + }) + .then(newUser => { + return done(null, newUser); + }) + .catch(err => { + return done(err) + }); }); }) ); @@ -63,8 +66,11 @@ module.exports = (passport) => { }); passport.deserializeUser((id, done) => { - User.findById(id, (err, user) => { - done(err, user); - }); + userRepo.getUser(id) + .then(user => { + done(null, user); + }) + .catch(err => done(err, null)); }); -}; \ No newline at end of file +} +; \ No newline at end of file diff --git a/models/Course.js b/models/Course.js index b2c5812..0f58587 100644 --- a/models/Course.js +++ b/models/Course.js @@ -1,32 +1,31 @@ -const mongoose = require('mongoose'); +const bookshelf = require('../config/bookshelf').bookshelf; -const courseSchema = new mongoose.Schema({ - title: { - type: String, - required: [true, 'Title is required'], - validate: { - validator: (title) => title.length > 1 && title.length < 100, - message: 'Title must be valid length' - } - }, - description: { - type: String, - validate: { - validator: (description) => - description.length > 2 && description.length < 10000, - message: 'Description must be valid length' - } - }, - tags: [String], - createdAt: {type: Date, default: Date.now}, - instructors: [ - { - type: mongoose.Schema.Types.ObjectId, - ref: 'user' - } - ] -}); +class Course extends bookshelf.Model { -const Course = mongoose.model('course', courseSchema) + get tableName() { + return 'course'; + } -module.exports = Course + get hasTimestamps() { + return true; + } + + get checkIns() { + return this.hasMany('CheckIn', 'course_id'); + } + + get instructors() { + return this.belongsToMany('User', 'course_instructor', 'course_id'); + } +} + +class Courses extends bookshelf.Collection { + get model() { + return Course; + } +} + +module.exports = { + Course: Course, + Courses: Courses +}; diff --git a/models/User.js b/models/User.js index 8e30106..23d8a68 100644 --- a/models/User.js +++ b/models/User.js @@ -1,102 +1,77 @@ -const mongoose = require('mongoose'); +const bookshelf = require('../config/bookshelf').bookshelf; const validator = require('validator'); +const checkit = require('checkit'); const bcrypt = require('bcrypt'); -const uniqueValidator = require('mongoose-unique-validator'); const SALT_WORK_FACTOR = 10; +const CheckIn = require('./checkIn'); // http://devsmash.com/blog/password-authentication-with-mongoose-and-bcrypt -const userSchema = new mongoose.Schema({ - username: { - type: String, - validate: { - validator: (name) => name.length > 2 && name.length < 100, - message: 'Username must be valid length' - }, - required: true - }, - password: { - type: String, - required: true - }, - name: { - type: String, - validate: { - validator: (name) => name.length > 2 && name.length < 100, - message: 'Name must be valid length' - } - }, - email: { - type: String, - unique: [true, 'Email must be unique'], - validate: { - validator: (email) => validator.isEmail(email), - message: 'Email must be valid' - } - }, - level: { - type: String, - default: 'student', - enum: ['student', 'instructor', 'admin'] - }, - website: { - type: String, - validate: { - validator: (website) => validator.isURL(website), - message: 'Website must be valid url' - } - }, - hometown: { - type: String, - default: 'hometown', - validate: { - validator: (hometown) => hometown.length < 100, - message: 'Hometown must be less than 100 characters' - } - }, - description: { - type: String, - validate: { - validator: (description) => description.length < 1000, - message: 'Description must be less than 1000 characters' - } - }, - checkIns: [ - { - type: mongoose.Schema.Types.ObjectId, - ref: 'checkIn' - } - ] -}); +class User extends bookshelf.Model { -// Mongoose middleware is not invoked on update() operations, so you must use a save() if you want to update user passwords. -userSchema.pre('save', function(next) { - const user = this; + constructor() { + super(); + this.on('saving', this.hashPassword); + } - if (!user.isModified('password')) return next(); + get tableName() { + return 'user'; + } - bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) { - if (err) return next(err); + get hasTimestamps() { + return true; + } - bcrypt.hash(user.password, salt, function(err, hash) { - if (err) return next(err); + get hidden() { + return ['password']; + } - user.password = hash; - next(); - }); - }); -}); + get checkIns() { + return this.hasMany('CheckIn', 'user_id'); + } -// add a comparePassword method with callback to our user model -userSchema.methods.comparePassword = function(candidatePassword, cb) { - bcrypt.compare(candidatePassword, this.password, function(err, isMatch) { - if (err) return cb(err); - cb(null, isMatch); - }); -}; + get instructingCourses() { + return this.belongsToMany('Course', 'course_instructor', 'user_id'); + } -userSchema.plugin(uniqueValidator); + get virtuals() { + return { + countCheckIns: () => { + return this.get('checkIns').count(); + } + } + } + + hashPassword() { + const user = this; + + if (!user.hasChanged('password')) return; -const User = mongoose.model('user', userSchema); + bcrypt.genSalt(SALT_WORK_FACTOR) + .then(salt => { + return bcrypt.hash(user.password, salt); + }) + .then(hashedPassword => { + user.password = hashedPassword; + }) + .catch(err => { + console.log('Error salting and hashing password:', err); + throw err; + }); + } -module.exports = User; + comparePassword(candidatePassword) { + return bcrypt.compare(candidatePassword, this.password); + }; +} + +class Users extends bookshelf.Collection { + get model() { + return User; + } +} + +module.exports = { + User: User, + Users: Users +}; diff --git a/models/checkIn.js b/models/checkIn.js index 955f2c7..b786f5f 100644 --- a/models/checkIn.js +++ b/models/checkIn.js @@ -1,17 +1,31 @@ -const mongoose = require('mongoose') +const bookshelf = require('../config/bookshelf').bookshelf; -const checkInSchema = new mongoose.Schema({ - user: { - type: mongoose.Schema.Types.ObjectId, - ref: 'user' - }, - course: { - type: mongoose.Schema.Types.ObjectId, - ref: 'course' - }, - date: {type: Date, default: Date.now} -}); +class CheckIn extends bookshelf.Model { -const CheckIn = mongoose.model('checkIn', checkInSchema); + get tableName() { + return 'check_in'; + } -module.exports = CheckIn; + get hasTimestamps() { + return true; + } + + get user() { + return this.belongsTo('User', 'user_id'); + } + + get course() { + return this.belongsTo('Course', 'course_id'); + } +} + +class CheckIns extends bookshelf.Collection { + get model() { + return CheckIn; + } +} + +module.exports = { + CheckIn: CheckIn, + CheckIns: CheckIns +}; diff --git a/models/session.js b/models/session.js deleted file mode 100644 index 8dd11a1..0000000 --- a/models/session.js +++ /dev/null @@ -1,20 +0,0 @@ -const mongoose = require('mongoose') - -const sessionSchema = new mongoose.Schema({ - sessionOpen: {type: Boolean, default: true}, - date: {type: Date, default: Date.now}, - checkIns: [ - { - type: mongoose.Schema.Types.ObjectId, - ref: 'checkIn' - } - ], - course: { - type: mongoose.Schema.Types.ObjectId, - ref: 'course' - } -}); - -const Session = mongoose.model('session', sessionSchema); - -module.exports = Session; diff --git a/package-lock.json b/package-lock.json index 205a749..673d6aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -116,7 +116,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, "requires": { "arr-flatten": "1.1.0" } @@ -124,8 +123,7 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" }, "array-flatten": { "version": "1.1.1", @@ -135,8 +133,7 @@ "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, "asap": { "version": "2.0.6", @@ -159,14 +156,6 @@ "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", "dev": true }, - "async": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", - "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", - "requires": { - "lodash": "4.17.4" - } - }, "async-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", @@ -188,6 +177,15 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "2.5.1", + "regenerator-runtime": "0.11.0" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -274,6 +272,57 @@ } } }, + "bookshelf": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/bookshelf/-/bookshelf-0.10.4.tgz", + "integrity": "sha1-/gaYRFZ0BBeroT0NdsewZdHxd00=", + "requires": { + "babel-runtime": "6.26.0", + "bluebird": "3.5.1", + "chalk": "1.1.3", + "create-error": "0.3.1", + "inflection": "1.12.0", + "inherits": "2.0.3", + "lodash": "4.17.4" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.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.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, "boom": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", @@ -318,7 +367,6 @@ "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, "requires": { "expand-range": "1.8.2", "preserve": "0.2.0", @@ -331,11 +379,6 @@ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", "dev": true }, - "bson": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", - "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" - }, "buffer-crc32": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz", @@ -346,6 +389,11 @@ "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" }, + "buffer-writer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.1.tgz", + "integrity": "sha1-Iqk2kB4wKa/NdUfrRIfOtpejvwg=" + }, "bytes": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", @@ -445,6 +493,15 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, + "checkit": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/checkit/-/checkit-0.7.0.tgz", + "integrity": "sha1-FJeavJMBg0a/z9y6vBmrVMC/10o=", + "requires": { + "inherits": "2.0.3", + "lodash": "4.17.4" + } + }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -607,11 +664,21 @@ "integrity": "sha1-Cr81atANHFohnYjURRgEbdAmrP4=", "dev": true }, + "core-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=" + }, "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=" }, + "create-error": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/create-error/-/create-error-0.3.1.tgz", + "integrity": "sha1-aYECRaYp5lRDK/BDdzYAA6U1GiM=" + }, "create-error-class": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", @@ -711,6 +778,14 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "detect-file": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", + "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", + "requires": { + "fs-exists-sync": "0.1.0" + } + }, "diff": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", @@ -762,11 +837,6 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" }, - "es6-promise": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", - "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -775,8 +845,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "etag": { "version": "1.8.1", @@ -817,7 +886,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, "requires": { "is-posix-bracket": "0.1.1" } @@ -826,11 +894,18 @@ "version": "1.8.2", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, "requires": { "fill-range": "2.2.3" } }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "requires": { + "os-homedir": "1.0.2" + } + }, "express": { "version": "4.15.5", "resolved": "https://registry.npmjs.org/express/-/express-4.15.5.tgz", @@ -917,7 +992,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, "requires": { "is-extglob": "1.0.0" } @@ -940,14 +1014,12 @@ "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" }, "fill-range": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, "requires": { "is-number": "2.1.0", "isobject": "2.1.0", @@ -977,17 +1049,31 @@ } } }, + "findup-sync": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", + "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", + "requires": { + "detect-file": "0.1.0", + "is-glob": "2.0.1", + "micromatch": "2.3.11", + "resolve-dir": "0.1.1" + } + }, + "flagged-respawn": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", + "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=" + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "for-own": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, "requires": { "for-in": "1.0.2" } @@ -1038,6 +1124,11 @@ "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", "dev": true }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2129,6 +2220,11 @@ } } }, + "generic-pool": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.5.4.tgz", + "integrity": "sha1-OMYYhRPhQDCUjsblz2VSPZd5KZs=" + }, "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", @@ -2166,7 +2262,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, "requires": { "glob-parent": "2.0.0", "is-glob": "2.0.1" @@ -2176,7 +2271,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, "requires": { "is-glob": "2.0.1" } @@ -2190,6 +2284,26 @@ "ini": "1.3.4" } }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "requires": { + "global-prefix": "0.1.5", + "is-windows": "0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "requires": { + "homedir-polyfill": "1.0.1", + "ini": "1.3.4", + "is-windows": "0.2.0", + "which": "1.3.0" + } + }, "got": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", @@ -2247,6 +2361,21 @@ "function-bind": "1.1.1" } }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, "has-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", @@ -2280,10 +2409,13 @@ "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" }, - "hooks-fixed": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.2.tgz", - "integrity": "sha512-YurCM4gQSetcrhwEtpQHhQ4M7Zo7poNGqY4kQGeBS6eZtOcT3tnNs01ThFa0jYBByAiYt1MjMjP/YApG0EnAvQ==" + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "requires": { + "parse-passwd": "1.0.0" + } }, "http-errors": { "version": "1.6.2", @@ -2329,6 +2461,11 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2348,6 +2485,11 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" }, + "interpret": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", + "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls=" + }, "ip-regex": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", @@ -2376,14 +2518,12 @@ "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" }, "is-equal-shallow": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, "requires": { "is-primitive": "2.0.0" } @@ -2400,14 +2540,12 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-fullwidth-code-point": { "version": "2.0.0", @@ -2419,7 +2557,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, "requires": { "is-extglob": "1.0.0" } @@ -2453,7 +2590,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, "requires": { "kind-of": "3.2.2" } @@ -2476,14 +2612,12 @@ "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" }, "is-primitive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" }, "is-promise": { "version": "2.1.0", @@ -2521,6 +2655,11 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -2529,14 +2668,12 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, "requires": { "isarray": "1.0.0" } @@ -2551,6 +2688,11 @@ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" }, + "js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=" + }, "js-stringify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", @@ -2603,11 +2745,6 @@ "promise": "7.3.1" } }, - "kareem": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-1.5.0.tgz", - "integrity": "sha1-4+QQHZ3P3imXadr0tNtk2JXRdEg=" - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -2616,6 +2753,94 @@ "is-buffer": "1.1.6" } }, + "knex": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/knex/-/knex-0.13.0.tgz", + "integrity": "sha1-CN1JT2u2SSiTTuydrDR4ehTKX6Q=", + "requires": { + "babel-runtime": "6.26.0", + "bluebird": "3.5.1", + "chalk": "1.1.3", + "commander": "2.8.1", + "debug": "2.6.9", + "generic-pool": "2.5.4", + "inherits": "2.0.3", + "interpret": "0.6.6", + "liftoff": "2.2.5", + "lodash": "4.17.4", + "minimist": "1.1.3", + "mkdirp": "0.5.1", + "pg-connection-string": "0.1.3", + "readable-stream": "1.1.14", + "safe-buffer": "5.1.1", + "tildify": "1.0.0", + "uuid": "3.1.0", + "v8flags": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "minimist": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz", + "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "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.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, "latest-version": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", @@ -2630,6 +2855,18 @@ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, + "liftoff": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.2.5.tgz", + "integrity": "sha1-mYwods/0hLED5EI7k9NW2kRzTJE=", + "requires": { + "extend": "3.0.1", + "findup-sync": "0.4.3", + "flagged-respawn": "0.3.2", + "rechoir": "0.6.2", + "resolve": "1.5.0" + } + }, "lodash": { "version": "4.17.4", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", @@ -2718,16 +2955,6 @@ "lodash.restparam": "3.6.1" } }, - "lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", @@ -2827,7 +3054,6 @@ "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, "requires": { "arr-diff": "2.0.0", "array-unique": "0.2.1", @@ -2923,53 +3149,6 @@ } } }, - "mongodb": { - "version": "2.2.33", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.33.tgz", - "integrity": "sha1-tTfEcdNKZlG0jzb9vyl1A0Dgi1A=", - "requires": { - "es6-promise": "3.2.1", - "mongodb-core": "2.1.17", - "readable-stream": "2.2.7" - } - }, - "mongodb-core": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.17.tgz", - "integrity": "sha1-pBizN6FKFJkPtRC5I97mqBMXPfg=", - "requires": { - "bson": "1.0.4", - "require_optional": "1.0.1" - } - }, - "mongoose": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.12.5.tgz", - "integrity": "sha512-dhCcCfYJjZv95nn4mAIAzj/+o2iR8rIBPOFlWps/STe+wJD53B2sKOpS+UH2bp7CqBHcLnwdRJL6aGJUcWS7kg==", - "requires": { - "async": "2.1.4", - "bson": "1.0.4", - "hooks-fixed": "2.0.2", - "kareem": "1.5.0", - "mongodb": "2.2.33", - "mpath": "0.3.0", - "mpromise": "0.5.5", - "mquery": "2.3.2", - "ms": "2.0.0", - "muri": "1.3.0", - "regexp-clone": "0.0.1", - "sliced": "1.0.1" - } - }, - "mongoose-unique-validator": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-1.0.6.tgz", - "integrity": "sha512-hJf1eiWPw9O5ed7HUtFHtHhqnWDpm42Q5iC3xs6p99kr1qrVMq8WR2x+yobx6rY5F26Ki2NqGvJTe8v/Fax0kw==", - "requires": { - "lodash.foreach": "4.5.0", - "lodash.get": "4.4.2" - } - }, "morgan": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.8.2.tgz", @@ -2992,50 +3171,16 @@ } } }, - "mpath": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.3.0.tgz", - "integrity": "sha1-elj3iem1/TyUUgY0FXlg8mvV70Q=" - }, - "mpromise": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mpromise/-/mpromise-0.5.5.tgz", - "integrity": "sha1-9bJCWddjrMIlewoMjG2Gb9UXMuY=" - }, - "mquery": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-2.3.2.tgz", - "integrity": "sha512-KXWMypZSvhCuqRtza+HMQZdYw7PfFBjBTFvP31NNAq0OX0/NTIgpcDpkWQ2uTxk6vGQtwQ2elhwhs+ZvCA8OaA==", - "requires": { - "bluebird": "3.5.1", - "debug": "2.6.9", - "regexp-clone": "0.0.1", - "sliced": "0.0.5" - }, - "dependencies": { - "sliced": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz", - "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8=" - } - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "muri": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/muri/-/muri-1.3.0.tgz", - "integrity": "sha512-FiaFwKl864onHFFUV/a2szAl7X0fxVlSKNdhTf+BM8i8goEgYut8u5P9MqQqIYwvaMxjzVESsoEm/2kfkFH1rg==" - }, "nan": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", - "dev": true, - "optional": true + "dev": true }, "negotiator": { "version": "0.6.1", @@ -3108,7 +3253,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, "requires": { "remove-trailing-separator": "1.1.0" } @@ -3152,7 +3296,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, "requires": { "for-own": "0.1.5", "is-extendable": "0.1.1" @@ -3216,11 +3359,15 @@ "semver": "5.4.1" } }, + "packet-reader": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-0.3.1.tgz", + "integrity": "sha1-zWLmCvjX/qinBexP+ZCHHEaHHyc=" + }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, "requires": { "glob-base": "0.3.0", "is-dotfile": "1.0.3", @@ -3228,6 +3375,11 @@ "is-glob": "2.0.1" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", @@ -3303,6 +3455,67 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "pg": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-7.3.0.tgz", + "integrity": "sha1-J14nRm5UpkX2tKFvasrfa4Sa2Ds=", + "requires": { + "buffer-writer": "1.0.1", + "js-string-escape": "1.0.1", + "packet-reader": "0.3.1", + "pg-connection-string": "0.1.3", + "pg-pool": "2.0.3", + "pg-types": "1.12.1", + "pgpass": "1.0.2", + "semver": "4.3.2" + }, + "dependencies": { + "semver": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz", + "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=" + } + } + }, + "pg-connection-string": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz", + "integrity": "sha1-2hhHsglA5C7hSSvq9l1J2RskXfc=" + }, + "pg-pool": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.3.tgz", + "integrity": "sha1-wCIDLIlJ8xKk+R+2QJzgQHa+Mlc=" + }, + "pg-types": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-1.12.1.tgz", + "integrity": "sha1-1kCH45A7WP+q0nnnWVxSIIoUw9I=", + "requires": { + "postgres-array": "1.0.2", + "postgres-bytea": "1.0.0", + "postgres-date": "1.0.3", + "postgres-interval": "1.1.1" + } + }, + "pgpass": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz", + "integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=", + "requires": { + "split": "1.0.1" + }, + "dependencies": { + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "requires": { + "through": "2.3.8" + } + } + } + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -3314,6 +3527,29 @@ "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.2.3.tgz", "integrity": "sha1-cjnEKl72wwuPMoQ52bn/cQQkkPg=" }, + "postgres-array": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-1.0.2.tgz", + "integrity": "sha1-jgsy6wO/d6XAp4UeBEHBaaJWojg=" + }, + "postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" + }, + "postgres-date": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.3.tgz", + "integrity": "sha1-4tiXAu/bJY/52c7g/pG9BpdSV6g=" + }, + "postgres-interval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.1.1.tgz", + "integrity": "sha512-OkuCi9t/3CZmeQreutGgx/OVNv9MKHGIT5jH8KldQ4NLYXkvmT9nDVxEuCENlNwhlGPE374oA/xMqn05G49pHA==", + "requires": { + "xtend": "4.0.1" + } + }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", @@ -3323,8 +3559,7 @@ "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" }, "process-nextick-args": { "version": "1.0.7", @@ -3507,7 +3742,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, "requires": { "is-number": "3.0.0", "kind-of": "4.0.0" @@ -3517,7 +3751,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3526,7 +3759,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3537,7 +3769,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3603,20 +3834,27 @@ "set-immediate-shim": "1.0.1" } }, - "regex-cache": { + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "1.5.0" + } + }, + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" + }, + "regex-cache": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, "requires": { "is-equal-shallow": "0.1.3" } }, - "regexp-clone": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", - "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" - }, "registry-auth-token": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", @@ -3639,14 +3877,12 @@ "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "repeat-element": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" }, "repeat-string": { "version": "1.6.1", @@ -3687,191 +3923,1006 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + } + } + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "requires": { + "expand-tilde": "1.2.2", + "global-modules": "0.2.3" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "7.1.1" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "5.4.1" + } + }, + "send": { + "version": "0.15.6", + "resolved": "https://registry.npmjs.org/send/-/send-0.15.6.tgz", + "integrity": "sha1-IPI6nJJbdiq4JwX+L52yUqzkfjQ=", + "requires": { + "debug": "2.6.9", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.3.4", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "serve-favicon": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.5.tgz", + "integrity": "sha512-s7F8h2NrslMkG50KxvlGdj+ApSwaLex0vexuJ9iFf3GLTIp1ph/l1qZvRe9T9TJEYZgmq72ZwJ2VYiAEtChknw==", + "requires": { + "etag": "1.8.1", + "fresh": "0.5.2", + "ms": "2.0.0", + "parseurl": "1.3.2", + "safe-buffer": "5.1.1" + } + }, + "serve-static": { + "version": "1.12.6", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.6.tgz", + "integrity": "sha1-uXN3P2NEmTTaVOW+ul4x2fQhFXc=", + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.15.6" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "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=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "requires": { + "hoek": "4.2.0" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "1.0.1" + } + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "sqlite3": { + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-3.1.13.tgz", + "integrity": "sha512-JxXKPJnkZ6NuHRojq+g2WXWBt3M1G9sjZaYiHEWSTGijDM3cwju/0T2XbWqMXFmPqDgw+iB7zKQvnns4bvzXlw==", + "dev": true, + "requires": { + "nan": "2.7.0", + "node-pre-gyp": "0.6.38" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "mime-db": { + "version": "1.30.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "node-pre-gyp": { + "version": "0.6.38", + "bundled": true, + "dev": true, + "requires": { + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.2", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.2", + "semver": "5.4.1", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.4.1", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.1", + "bundled": true, + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" } }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - } - } - }, - "require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "requires": { - "resolve-from": "2.0.0", - "semver": "5.4.1" - } - }, - "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", - "requires": { - "path-parse": "1.0.5" - } - }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "7.1.1" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, - "requires": { - "semver": "5.4.1" - } - }, - "send": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/send/-/send-0.15.6.tgz", - "integrity": "sha1-IPI6nJJbdiq4JwX+L52yUqzkfjQ=", - "requires": { - "debug": "2.6.9", - "depd": "1.1.1", - "destroy": "1.0.4", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", - "fresh": "0.5.2", - "http-errors": "1.6.2", - "mime": "1.3.4", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.1" - }, - "dependencies": { - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "requires": { + "debug": "2.6.9", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.3.3", + "rimraf": "2.6.2", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.1.0", + "bundled": true, + "dev": true + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true + } + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true } } }, - "serve-favicon": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.5.tgz", - "integrity": "sha512-s7F8h2NrslMkG50KxvlGdj+ApSwaLex0vexuJ9iFf3GLTIp1ph/l1qZvRe9T9TJEYZgmq72ZwJ2VYiAEtChknw==", - "requires": { - "etag": "1.8.1", - "fresh": "0.5.2", - "ms": "2.0.0", - "parseurl": "1.3.2", - "safe-buffer": "5.1.1" - } - }, - "serve-static": { - "version": "1.12.6", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.6.tgz", - "integrity": "sha1-uXN3P2NEmTTaVOW+ul4x2fQhFXc=", - "requires": { - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.15.6" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "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=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "sliced": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" - }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", - "requires": { - "hoek": "4.2.0" - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": "1.0.1" - } - }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "dev": true, - "requires": { - "through": "2.3.8" - } - }, "sshpk": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", @@ -4008,8 +5059,15 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "tildify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.0.0.tgz", + "integrity": "sha1-KgIdtej73gqPi03zetqo+x05190=", + "requires": { + "user-home": "1.1.1" + } }, "timed-out": { "version": "4.0.1", @@ -4153,6 +5211,11 @@ "prepend-http": "1.0.4" } }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=" + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -4168,6 +5231,14 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "requires": { + "user-home": "1.1.1" + } + }, "validator": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz", @@ -4197,7 +5268,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, "requires": { "isexe": "2.0.0" } @@ -4330,6 +5400,11 @@ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", "dev": true }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", diff --git a/package.json b/package.json index cd31966..479065d 100644 --- a/package.json +++ b/package.json @@ -3,27 +3,29 @@ "version": "0.0.0", "private": true, "scripts": { - "start": "node ./bin/www", - "dev": "nodemon ./bin/www", - "test": "mocha --recursive", - "test-watch": "nodemon --exec 'npm test'" + "start": "RUN_MODE=prod node ./bin/www", + "dev": "RUN_MODE=dev nodemon ./bin/www", + "test": "RUN_MODE=dev mocha --recursive", + "test-watch": "RUN_MODE=dev nodemon --exec 'npm test'" }, "dependencies": { "bcrypt": "^1.0.3", "bcrypt-nodejs": "latest", "body-parser": "~1.17.1", + "bookshelf": "^0.10.4", + "checkit": "^0.7.0", "connect-flash": "^0.1.1", "cookie-parser": "~1.4.3", "debug": "~2.6.3", "express": "~4.15.2", "express-session": "~1.0.0", "jquery": "^3.2.1", + "knex": "^0.13.0", "method-override": "~1.0.0", - "mongoose": "^4.7.2", - "mongoose-unique-validator": "^1.0.5", "morgan": "~1.8.1", "passport": "~0.1.17", "passport-local": "~0.1.6", + "pg": "^7.3.0", "pug": "~2.0.0-beta11", "serve-favicon": "~2.4.2", "validator": "^8.0.0" @@ -32,6 +34,7 @@ "chai": "^4.0.2", "chai-http": "^3.0.0", "mocha": "^3.4.2", - "nodemon": "^1.11.0" + "nodemon": "^1.11.0", + "sqlite3": "^3.1.13" } } diff --git a/routes/courses.js b/routes/courses.js index 488dd59..b1fd96b 100644 --- a/routes/courses.js +++ b/routes/courses.js @@ -15,6 +15,8 @@ router.get('/', function (req, res) { if (err) return console.log(err); res.render('courses/index', {courses: courses, authedUser: req.user}); }); + + return Course.forge().orderBy('created_at', 'DESC').fetchAll(); }); router.get('/create', diff --git a/routes/users.js b/routes/users.js index 8611a90..e691f9f 100644 --- a/routes/users.js +++ b/routes/users.js @@ -5,9 +5,10 @@ const passport = require('passport'); const isLoggedIn = require('./loginCheck'); router.get('/', (req, res) => { - userRepo.getUsers(users => { - res.render('users/index', {users: users, authedUser: req.user}); - }); + userRepo.getUsers() + .then(users => { + res.render('users/index', {users: users, authedUser: req.user}); + }); }); router.get('/signup', (req, res) => { @@ -37,9 +38,10 @@ router.post('/login', ); router.get('/:id', (req, res) => { - userRepo.getUser(req.params.id, user => { - res.render('users/show', {user: user, authedUser: req.user}); - }); + userRepo.getUser(req.params.id) + .then(user => { + res.render('users/show', {user: user, authedUser: req.user}); + }); }); router.get('/:id/edit', @@ -48,9 +50,10 @@ router.get('/:id/edit', if (String(req.params.id) !== String(req.user._id)) { res.redirect('/users'); } else { - userRepo.getUser(req.params.id, user => { - res.render('users/edit', {user: user, authedUser: req.user}); - }); + userRepo.getUser(req.params.id) + .then(user => { + res.render('users/edit', {user: user, authedUser: req.user}); + }); } } ); @@ -58,11 +61,12 @@ router.get('/:id/edit', router.post('/:id', isLoggedIn, (req, res) => { - userRepo.updateUser(req.params.id, req.body, user => { - console.log('user...........'); - console.log(user); - res.redirect('/users/' + req.params.id); - }); + userRepo.updateUser(req.params.id, req.body) + .then(user => { + console.log('user...........'); + console.log(user); + res.redirect('/users/' + req.params.id); + }); } ); @@ -72,9 +76,10 @@ router.post('/:id/delete', if (req.params.id !== req.user._id) { res.redirect('/users'); } else { - userRepo.deleteUser(req.params.id, () => { - res.redirect('/users'); - }); + userRepo.deleteUser(req.params.id) + .then(() => { + res.redirect('/users'); + }); } } ); diff --git a/src/CourseRepo.js b/src/CourseRepo.js index e7555d7..debc102 100644 --- a/src/CourseRepo.js +++ b/src/CourseRepo.js @@ -1,58 +1,47 @@ -// const mongoose = require('mongoose'); -// -// mongoose.connect('mongodb://heroku_d895z9hp:74v0ph37vib5v5gf02jb675acf@ds135522.mlab.com:35522/heroku_d895z9hp', err => { -// if (err) { -// console.log("couldn't connect to MongoDB"); -// } -// console.log('#connected to MongoDB!') -// }) -// -// const Course = mongoose.model('Course', { -// title: String, -// description: String -// }) -// -// // Course.create({ -// // title: "Web Dev", -// // description: "Learning Bootstrap" -// // }, (err, data)=>{ -// // console.log('#saved ' + data); -// // mongoose.disconnect(err =>{ -// // console.log('#disconnected from MongoDB'); -// // }) -// // }) -// -// // Course.findById('594f6dff9a856b58a9299750', (err, data) =>{ -// // console.log(data); -// // mongoose.disconnect(err =>{ -// // if(err){ -// // console.log("Couldn't find this course"); -// // } -// // console.log('#disconnected from MongoDB'); -// // }) -// // }) -// -// // Course.findByIdAndUpdate('594f6dff9a856b58a9299750', -// // {title: 'Java Beginners', description: "learn about objects"} -// // ,(err, data) =>{ -// // console.log(data); -// // mongoose.disconnect(err =>{ -// // console.log('#updated and disconnected from MongoDB'); -// // }) -// // }) -// // -// // Course.findByIdAndRemove('594f71d294f11e593a927ef9', (err, data) =>{ -// // console.log(data); -// // mongoose.disconnect(err =>{ -// // console.log('#Found, removed, and disconnected from MongoDB'); -// // }) -// // }) -// -// Course.find({}, (err, article) =>{ -// console.log(article); -// mongoose.disconnect(err =>{ -// console.log('#found all and disconnected from MongoDB'); -// }) -// }) -// // -// // module.exports = CourseRepo +const Course = require('../models/Course').Course; +const Courses = require('../models/Course').Courses; + +Course.create({ + title: "Web Dev", + description: "Learning Bootstrap" +}, (err, data)=>{ + console.log('#saved ' + data); + mongoose.disconnect(err =>{ + console.log('#disconnected from MongoDB'); + }) +}) + +Course.findById('594f6dff9a856b58a9299750', (err, data) =>{ + console.log(data); + mongoose.disconnect(err =>{ + if(err){ + console.log("Couldn't find this course"); + } + console.log('#disconnected from MongoDB'); + }) +}) + +Course.findByIdAndUpdate('594f6dff9a856b58a9299750', +{title: 'Java Beginners', description: "learn about objects"} + ,(err, data) =>{ + console.log(data); + mongoose.disconnect(err =>{ + console.log('#updated and disconnected from MongoDB'); + }) +}) + +Course.findByIdAndRemove('594f71d294f11e593a927ef9', (err, data) =>{ + console.log(data); + mongoose.disconnect(err =>{ + console.log('#Found, removed, and disconnected from MongoDB'); + }) +}) + +Course.find({}, (err, article) =>{ + console.log(article); + mongoose.disconnect(err =>{ + console.log('#found all and disconnected from MongoDB'); + }) +}) + +module.exports = CourseRepo diff --git a/src/userRepository.js b/src/userRepository.js index 95a429c..8181146 100644 --- a/src/userRepository.js +++ b/src/userRepository.js @@ -1,59 +1,44 @@ -const User = require('../models/User'); +const User = require('../models/User').User; +const Users = require('../models/User').Users; module.exports = { - getUsers(cb) { - User.find({}).sort({checkIns: -1}).exec((err, users) => { - if (err) return console.log(err); - cb(users); - }); + getUsers() { + return Users.query(queryBuilder => { + queryBuilder.join('check_in', 'user.id', 'check_in.user_id'); + queryBuilder.groupBy('user.id'); + queryBuilder.select('user.*'); + queryBuilder.count('* as check_in_count'); + queryBuilder.orderBy('check_in_count', 'desc'); + }).fetch(); }, - createUser(reqBody, cb) { - const user = { + createUser(reqBody) { + return new User({ username: reqBody.username, email: reqBody.email, password: reqBody.password, checkIns: [] - }; - User.create(user, (err, user) => { - const result = {err: err, res: user}; - cb(result); - }); + }).save(); }, - getUser(id, cb) { - User.findById(id, (err, user) => { - if (err) return console.log(err); - cb(user); - }); + getUser(id) { + return User.where('id', id).fetch(); }, - getUserByEmail(email, cb) { - User.findOne({email: email}, (err, user) => { - if (err) return console.log(err); - cb(user); - }); + getUserByEmail(email) { + return User.where('email', email).fetch(); }, - getUserByUsername(name, cb) { - User.findOne({username: name}, (err, user) => { - if (err) return console.log(err); - cb(user); - }); + getUserByUsername(username) { + return User.where('username', username).fetch(); }, - updateUser(id, user, cb) { - User.findByIdAndUpdate(id, user, (err, result) => { - if (err) return console.log(err); - cb(result); - }); + updateUser(id, user) { + return User.where('id', id).save(user, {patch: true}); }, - deleteUser(id, cb) { - User.findByIdAndRemove(id, (err, result) => { - if (err) return console.log(err); - cb(result); - }); + deleteUser(id) { + return User.where('id', id).destroy(); } }; diff --git a/test/config.test.js b/test/config.test.js deleted file mode 100644 index e279eda..0000000 --- a/test/config.test.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - MONGODB_URI: 'mongodb://localhost:27017/test' -} diff --git a/test/session/modelCreate.test.js b/test/session/modelCreate.test.js deleted file mode 100644 index f5bfa92..0000000 --- a/test/session/modelCreate.test.js +++ /dev/null @@ -1,59 +0,0 @@ -const Session = require('../../models/session'); -const Course = require('../../models/Course'); -const CheckIn = require('../../models/checkIn'); -const config = require('../config.test.js'); -const assert = require('assert'); -const mongoose = require('mongoose'); - -describe('Session modelCreate', () => { - let firstSession; - - beforeEach((done) => { - firstSession = new Session({}); - firstSession.save() - .then(() => done()); - - }); - afterEach((done) => { - Course.collection.drop(); - Session.collection.drop(); - done(); - }); - - it('Should create a new Session record', (done) => { - assert(!firstSession.isNew); - done(); - }); - - it('Should have SessionOpen set to true by default', (done) => { - assert(firstSession.sessionOpen === true); - done() - }); - - it('Should have Date timestamp be a date type', (done) => { - assert(firstSession.date instanceof Date); - done() - }); - - it('Should be able to set Course', (done) => { - const sql = new Course({title: 'sql', description: 'beginner sql'}) - firstSession.course = {_id: sql._id}; - firstSession.save() - .then(() => Session.findOne({_id: firstSession._id})) - .then((result) => { - assert(String(result.course) === String(sql._id)); - done() - }) - }); - - it('Should be able to add to CheckIns', (done) => { - const firstCheckIn = new CheckIn({}); - firstSession.checkIns.push(firstCheckIn) - firstSession.save() - .then(() => Session.findOne({_id: firstSession._id})) - .then((result) => { - assert(String(result.checkIns) === String(firstCheckIn._id)); - done() - }) - }); -}); diff --git a/test/session/modelDestroy.test.js b/test/session/modelDestroy.test.js deleted file mode 100644 index a9dda82..0000000 --- a/test/session/modelDestroy.test.js +++ /dev/null @@ -1,32 +0,0 @@ -const Session = require('../../models/session'); -const Course = require('../../models/Course'); -const config = require('../config.test.js'); -const assert = require('assert'); -const mongoose = require('mongoose'); - -describe('Session modelDestroy', () => { - let firstSession; - - beforeEach((done) => { - firstSession = new Session({}); - firstSession.save() - .then(() => done()); - }); - afterEach((done) => { - Session.collection.drop(); - Course.collection.drop(); - done(); - }); - - it('Should destroy session record', (done) => { - const session2 = new Session({}) - session2.save() - .then(() => Session.remove({_id: firstSession._id})) - .then(() => Session.find({})) - .then((results) => { - assert(results.length === 1); - assert(String(results[0]._id) === String(session2._id)); - done() - }); - }); -}); diff --git a/test/session/modelRead.test.js b/test/session/modelRead.test.js deleted file mode 100644 index db9d30e..0000000 --- a/test/session/modelRead.test.js +++ /dev/null @@ -1,18 +0,0 @@ -const Session = require('../../models/session'); -const config = require('../config.test.js'); -const assert = require('assert'); -const mongoose = require('mongoose'); - -describe('Session modelRead', () => { - - it('Should find a session by _id', (done) => { - const firstSession = new Session({}); - firstSession.save() - .then(() => Session.findOne({_id: firstSession._id})) - .then((result) => { - assert(String(result._id) === String(firstSession._id)); - done() - }); - }); - -}); diff --git a/test/session/modelUpdate.test.js b/test/session/modelUpdate.test.js deleted file mode 100644 index b6809fc..0000000 --- a/test/session/modelUpdate.test.js +++ /dev/null @@ -1,57 +0,0 @@ -const Session = require('../../models/session'); -const CheckIn = require('../../models/checkIn'); -const Course = require('../../models/Course'); -const config = require('../config.test.js'); -const assert = require('assert'); -const mongoose = require('mongoose'); - -describe('Session modelUpdate', () => { - let firstSession; - - beforeEach((done) => { - firstSession = new Session({}); - firstCheckIn = new CheckIn({}); - sql = new Course({title: 'sql'}); - firstSession.checkIns = [{_id: firstCheckIn._id}]; - firstSession.course = {_id: sql._id}; - - firstSession.save() - .then(() => done()); - }); - afterEach((done) => { - Session.collection.drop(); - CheckIn.collection.drop(); - Course.collection.drop(); - done(); - }); - - it('Should update a Session sessionOpen status', (done) => { - firstSession.sessionOpen = false; - firstSession.save() - .then(() => Session.findOne({_id: firstSession._id})) - .then((result) => { - assert(result.sessionOpen === false); - done(); - }); - }); - it('Should update a Session checkIns list', (done) => { - const checkIn2 = new CheckIn({}); - firstSession.checkIns = [{_id: checkIn2._id}]; - firstSession.save() - .then(() => Session.findOne({_id: firstSession._id})) - .then((result) => { - assert(String(result.checkIns[0]) === String(checkIn2._id)); - done(); - }); - }); - it('Should update a Session course', (done) => { - const ruby = new Course({title: 'ruby'}); - firstSession.course = {_id: ruby._id}; - firstSession.save() - .then(() => Session.findOne({_id: firstSession._id})) - .then((result) => { - assert(String(result.course) === String(ruby._id)); - done(); - }); - }); -}); diff --git a/test/session/repo.test.js b/test/session/repo.test.js deleted file mode 100644 index e69de29..0000000 diff --git a/test/test_helper.test.js b/test/test_helper.test.js index 41a05d6..6f8ff6a 100644 --- a/test/test_helper.test.js +++ b/test/test_helper.test.js @@ -1,14 +1,4 @@ -const mongoose = require('mongoose'); -const config = require('./config.test.js') +const bookshelfSetup = require('../config/bookshelf'); -mongoose.set('debug', true); -mongoose.createConnection(config.MONGODB_URI); - -mongoose.Promise = global.Promise; - -beforeEach((done) => { - const { users, courses } = mongoose.connection.collections; - users.drop(() => { - courses.drop(() => done()); - }); -}); +bookshelfSetup.configureBookshelf('dev'); +bookshelfSetup.initializeDevDb(); \ No newline at end of file diff --git a/test/user/repo.test.js b/test/user/repo.test.js index 18cd7be..81e59d9 100644 --- a/test/user/repo.test.js +++ b/test/user/repo.test.js @@ -1,14 +1,10 @@ -const config = require('../config.test.js'); const Repo = require('../../src/userRepository'); const User = require('../../models/User'); const chai = require('chai'); const chaiHttp = require('chai-http'); -const mongoose = require('mongoose'); chai.use(chaiHttp); const expect = chai.expect; -mongoose.connect(config.MONGODB_URI); - describe('User Repo routes', () => { let joe, tad; @@ -25,11 +21,13 @@ describe('User Repo routes', () => { password: 'otherpass' }); - joe.save(() => { - tad.save(() => { + joe.save() + .then(() => { + return tad.save(); + }) + .then(() => { done(); }); - }); }); afterEach((done) => { @@ -38,68 +36,82 @@ describe('User Repo routes', () => { }); it('should list all users with getUsers()', (done) => { - Repo.getUsers(users => { - const sortedUsers = users.sort(function (a, b) { - if (a.username.toUpperCase() < b.username.toUpperCase()) return -1; - if (a.username.toUpperCase() > b.username.toUpperCase()) return 1; - return 0; - }); - expect(sortedUsers).to.be.a('array'); - expect(sortedUsers.length).to.be.eql(2); - expect(sortedUsers[0]).to.have.property('_id'); - expect(sortedUsers[0]).to.have.property('username').eql('joe'); - expect(sortedUsers[0]).to.have.property('email').eql('joe@mail.com'); - expect(sortedUsers[0]).to.have.property('level').eql('student'); - sortedUsers[0].comparePassword('somepass', (err, isMatch) => { - expect(err).to.eql(null); + Repo.getUsers() + .then(users => { + const sortedUsers = users.sort(function (a, b) { + if (a.username.toUpperCase() < b.username.toUpperCase()) return -1; + if (a.username.toUpperCase() > b.username.toUpperCase()) return 1; + return 0; + }); + expect(sortedUsers).to.be.a('array'); + expect(sortedUsers.length).to.be.eql(2); + expect(sortedUsers[0]).to.have.property('_id'); + expect(sortedUsers[0]).to.have.property('username').eql('joe'); + expect(sortedUsers[0]).to.have.property('email').eql('joe@mail.com'); + expect(sortedUsers[0]).to.have.property('level').eql('student'); + return sortedUsers[0].comparePassword('somepass'); + }) + .then(isMatch => { expect(isMatch).to.eql(true); done(); + }) + .catch(err => { + expect(err).to.eql(null); + done(); }); - }); }); it('should add new user with createUser()', (done) => { const jane = new User({username: 'jane', email: 'jane@mail.com', password: 'roflcopter'}); - Repo.createUser(jane, newUser => { - expect(newUser.res).to.have.property('username').eql('jane'); - expect(newUser.res).to.have.property('email').eql('jane@mail.com'); - Repo.getUsers(users => { + Repo.createUser(jane) + .then(newUser => { + expect(newUser.res).to.have.property('username').eql('jane'); + expect(newUser.res).to.have.property('email').eql('jane@mail.com'); + return Repo.getUsers(); + }) + .then(users => { expect(users).to.be.a('array'); expect(users.length).to.be.eql(3); done(); }); - }); }); it('should list single user with getUser()', (done) => { - Repo.getUser(joe._id, result => { - expect(result).to.have.property('username').eql('joe'); - done() - }); + Repo.getUser(joe._id) + .then(result => { + expect(result).to.have.property('username').eql('joe'); + done() + }); }); it('should update existing user with updateUser()', (done) => { const jane = new User({username: 'jane', email: 'jane@mail.com', password: 'datpass'}); - let toBeUpdated = {email: 'thadious@m.com'}; - Repo.createUser(jane, () => { - Repo.updateUser(tad._id, toBeUpdated, () => { - Repo.getUser(tad._id, user => { - expect(user.email).to.eql('thadious@m.com'); - done(); - }); + let toBeUpdated = new User({email: 'thadious@m.com'}); + Repo.createUser(jane) + .then(() => { + return Repo.updateUser(tad._id, toBeUpdated); }) - }); + .then(() => { + return Repo.getUser(tad._id) + }) + .then(user => { + expect(user.email).to.eql('thadious@m.com'); + done(); + }); }); +}); - it('should delete existing user with deleteUser()', (done) => { - Repo.getUsers(users => { +it('should delete existing user with deleteUser()', (done) => { + Repo.getUsers() + .then(users => { expect(users.length).to.eql(2); - Repo.deleteUser(joe._id, () => { - Repo.getUsers(users => { - expect(users.length).to.eql(1); - done(); - }); - }); + return Repo.deleteUser(joe._id) + }) + .then(() => { + return Repo.getUsers() + }) + .then(users => { + expect(users.length).to.eql(1); + done(); }); - }); }); From 34bd4079cdcea18bf25dab0b1b1350efc1e8014e Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Thu, 2 Nov 2017 18:37:10 +0900 Subject: [PATCH 39/81] Courses repo is setup. Route is working. Can't save users, apparently. --- models/User.js | 3 +- routes/courses.js | 101 +++++++++++++++++++++++----------------------- src/CourseRepo.js | 61 +++++++++------------------- 3 files changed, 71 insertions(+), 94 deletions(-) diff --git a/models/User.js b/models/User.js index 23d8a68..173ba10 100644 --- a/models/User.js +++ b/models/User.js @@ -5,8 +5,7 @@ const bcrypt = require('bcrypt'); const SALT_WORK_FACTOR = 10; const CheckIn = require('./checkIn'); -// http://devsmash.com/blog/password-authentication-with-mongoose-and-bcrypt - +// TODO: Add validations class User extends bookshelf.Model { constructor() { diff --git a/routes/courses.js b/routes/courses.js index b1fd96b..4d7099a 100644 --- a/routes/courses.js +++ b/routes/courses.js @@ -1,8 +1,9 @@ const router = require('express').Router(); -const Course = require('../models/Course'); const isLoggedIn = require('./loginCheck'); +const courseRepo = require('../src/CourseRepo'); const checkInRepo = require('../src/checkInRepository'); +// TODO: convert to middleware const canEditEvents = (user) => { if (user === null) { return false; @@ -11,12 +12,10 @@ const canEditEvents = (user) => { }; router.get('/', function (req, res) { - Course.find({}).sort({createdAt: -1}).exec((err, courses) => { - if (err) return console.log(err); - res.render('courses/index', {courses: courses, authedUser: req.user}); - }); - - return Course.forge().orderBy('created_at', 'DESC').fetchAll(); + return courseRepo.getCourses() + .then(courses => { + res.render('courses/index', {courses: courses, authedUser: req.user}); + }); }); router.get('/create', @@ -34,15 +33,14 @@ router.post('/create', isLoggedIn, (req, res) => { if (canEditEvents(req.user)) { - Course.create(req.body, (err) => { - console.log("this is the post request"); - if (err) { + courseRepo.createCourse(req.body) + .then(() => { + res.redirect('/courses'); + }) + .catch(err => { console.log(err); res.redirect('/courses/create'); - } else { - res.redirect('/courses'); - } - }); + }); } else { res.status(res.unauthorized).send(); } @@ -50,29 +48,28 @@ router.post('/create', ); router.get('/:id', (req, res) => { - Course.findById(req.params.id, (err, course) => { - if (err) { + courseRepo.getCourse(req.params.id) + .then(course => { + res.render('courses/show', {course: course, authedUser: req.user}); + }) + .catch(err => { console.log(err); res.redirect('/'); - } else { - res.render('courses/show', {course: course, authedUser: req.user}); - } - }); + }); }); router.get('/:id/edit', isLoggedIn, (req, res) => { if (canEditEvents(req.user)) { - Course.findById(req.params.id, (err, course) => { - console.log("in id/edit of " + req.params.id); - if (err) { + courseRepo.getCourse(req.params.id) + .then(course => { + res.render('courses/edit', {course: course, authedUser: req.user}); + }) + .catch(err => { console.log(err); res.redirect('/'); - } else { - res.render('courses/edit', {course: course, authedUser: req.user}); - } - }); + }); } else { res.status(res.unauthorized).send(); } @@ -83,14 +80,14 @@ router.post('/:id', isLoggedIn, (req, res) => { if (canEditEvents(req.user)) { - Course.findByIdAndUpdate(req.params.id, req.body, (err) => { - if (err) { + courseRepo.updateCourse(req.params.id, req.body) + .then(() => { + res.redirect('/courses/' + req.params.id); + }) + .catch(err => { console.log(err); res.redirect('/'); - } else { - res.redirect('/courses/' + req.params.id); - } - }); + }); } else { res.status(res.unauthorized).send(); } @@ -100,19 +97,21 @@ router.post('/:id', router.post('/:id/checkin', isLoggedIn, (req, res) => { - Course.findById(req.params.id, (err, course) => { - if (err) { + const course = courseRepo.getCourse(req.params.id) + .then(course => course) + .catch(err => { console.log(err); - } else { - checkInRepo.createCheckIn(req.user, course, (result) => { - if (result.err) { - res.render('courses/show', {course: course, errorMessage: result.err, authedUser: req.user}) - } else { - res.render('courses/show', {course: course, checkedIn: true, authedUser: req.user}); - } - }) - } - }); + res.render('courses/show', {course: null, errorMessage: err, authedUser: req.user}) + }); + + checkInRepo.createCheckIn(req.user, course) + .then(() => { + res.render('courses/show', {course: course, checkedIn: true, authedUser: req.user}); + }) + .catch(err => { + console.log(err); + res.render('courses/show', {course: course, errorMessage: err, authedUser: req.user}) + }); } ); @@ -120,14 +119,14 @@ router.post('/:id/delete', isLoggedIn, (req, res) => { if (canEditEvents(req.user)) { - Course.findByIdAndRemove(req.params.id, (err) => { - if (err) { + courseRepo.deleteCourse(req.params.id) + .then(() => { + res.redirect('/courses'); + }) + .catch(err => { console.log(err); res.redirect('/'); - } else { - res.redirect('/courses'); - } - }); + }); } else { res.status(res.unauthorized).send(); } diff --git a/src/CourseRepo.js b/src/CourseRepo.js index debc102..a79559c 100644 --- a/src/CourseRepo.js +++ b/src/CourseRepo.js @@ -1,47 +1,26 @@ const Course = require('../models/Course').Course; -const Courses = require('../models/Course').Courses; -Course.create({ - title: "Web Dev", - description: "Learning Bootstrap" -}, (err, data)=>{ - console.log('#saved ' + data); - mongoose.disconnect(err =>{ - console.log('#disconnected from MongoDB'); - }) -}) +module.exports = { + getCourses() { + return Course.forge().orderBy('created_at', 'DESC').fetchAll(); + }, -Course.findById('594f6dff9a856b58a9299750', (err, data) =>{ - console.log(data); - mongoose.disconnect(err =>{ - if(err){ - console.log("Couldn't find this course"); - } - console.log('#disconnected from MongoDB'); - }) -}) + createCourse(reqBody) { + return new Course({ + title: reqBody.title, + description: reqBody.description + }).save(); + }, -Course.findByIdAndUpdate('594f6dff9a856b58a9299750', -{title: 'Java Beginners', description: "learn about objects"} - ,(err, data) =>{ - console.log(data); - mongoose.disconnect(err =>{ - console.log('#updated and disconnected from MongoDB'); - }) -}) + getCourse(id) { + return Course.where('id', id).fetch(); + }, -Course.findByIdAndRemove('594f71d294f11e593a927ef9', (err, data) =>{ - console.log(data); - mongoose.disconnect(err =>{ - console.log('#Found, removed, and disconnected from MongoDB'); - }) -}) + updateCourse(id, course) { + return Course.where('id', id).save(course, {patch: true}); + }, -Course.find({}, (err, article) =>{ - console.log(article); - mongoose.disconnect(err =>{ - console.log('#found all and disconnected from MongoDB'); - }) -}) - -module.exports = CourseRepo + deleteCourse(id) { + return Course.where('id', id).destroy(); + } +}; From e95aedee8c5a33f485ed0b497173ab957d4a9535 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Fri, 3 Nov 2017 15:24:02 +0900 Subject: [PATCH 40/81] Fixed user to save properly, but displaying users on leaderboard does not seem to work --- config/passport.js | 36 ++++++++++++++++++++---------------- models/Course.js | 4 ++-- models/User.js | 35 +++++++++++++++++------------------ src/userRepository.js | 12 ++++++++---- 4 files changed, 47 insertions(+), 40 deletions(-) diff --git a/config/passport.js b/config/passport.js index 3418a15..c898d08 100644 --- a/config/passport.js +++ b/config/passport.js @@ -42,22 +42,26 @@ module.exports = (passport) => { passReqToCallback: true }, (req, username, password, done) => { - process.nextTick(() => { - userRepo.getUserByUsername(username) - .then(existingUser => { - if (existingUser) { - return done(null, false, req.flash('signupMessage', 'That username is already in use')); - } else { - return userRepo.createUser(req.body); - } - }) - .then(newUser => { - return done(null, newUser); - }) - .catch(err => { - return done(err) - }); - }); + userRepo.getUserByUsername(username) + .then(existingUser => { + console.log('sign-up existingUser'); + console.log(existingUser); + if (existingUser) { + return done(null, false, req.flash('signupMessage', 'That username is already in use')); + } else { + return userRepo.createUser(req.body); + } + }) + .then(newUser => { + console.log('new user'); + console.log(newUser); + return done(null, newUser); + }) + .catch(err => { + console.log('error'); + console.log(err); + return done(err) + }); }) ); diff --git a/models/Course.js b/models/Course.js index 0f58587..e97ecec 100644 --- a/models/Course.js +++ b/models/Course.js @@ -10,11 +10,11 @@ class Course extends bookshelf.Model { return true; } - get checkIns() { + checkIns() { return this.hasMany('CheckIn', 'course_id'); } - get instructors() { + instructors() { return this.belongsToMany('User', 'course_instructor', 'course_id'); } } diff --git a/models/User.js b/models/User.js index 173ba10..8d4a83c 100644 --- a/models/User.js +++ b/models/User.js @@ -8,9 +8,9 @@ const CheckIn = require('./checkIn'); // TODO: Add validations class User extends bookshelf.Model { - constructor() { - super(); - this.on('saving', this.hashPassword); + constructor(...args) { + super(...args); + this.on('saving', this.hashPassword, this); } get tableName() { @@ -41,22 +41,21 @@ class User extends bookshelf.Model { } } - hashPassword() { - const user = this; + // https://wesleytsai.io/2015/07/28/bookshelf-bcrpyt-password-hashing/ + hashPassword(model, attrs, options) { + return new Promise((resolve, reject) => { + if (!model.hasChanged('password')) return resolve.model.attributes.password; - if (!user.hasChanged('password')) return; - - bcrypt.genSalt(SALT_WORK_FACTOR) - .then(salt => { - return bcrypt.hash(user.password, salt); - }) - .then(hashedPassword => { - user.password = hashedPassword; - }) - .catch(err => { - console.log('Error salting and hashing password:', err); - throw err; - }); + bcrypt.hash(model.attributes.password, SALT_WORK_FACTOR) + .then(hashedPassword => { + model.set('password', hashedPassword); + resolve(hashedPassword); + }) + .catch(err => { + console.log('Error salting and hashing password:', err); + reject(err); + }); + }); } comparePassword(candidatePassword) { diff --git a/src/userRepository.js b/src/userRepository.js index 8181146..8e09471 100644 --- a/src/userRepository.js +++ b/src/userRepository.js @@ -13,12 +13,16 @@ module.exports = { }, createUser(reqBody) { - return new User({ + const newUser = new User({ username: reqBody.username, email: reqBody.email, - password: reqBody.password, - checkIns: [] - }).save(); + password: reqBody.password + }); + + console.log('new user model:'); + console.log(newUser); + + return newUser.save(); }, getUser(id) { From b8b431a85d1f368848ce84f133143e7d73ec045c Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Fri, 3 Nov 2017 15:59:08 +0900 Subject: [PATCH 41/81] Updated tons of stuff to reference model properties correctly. Removed bunches of logging --- config/passport.js | 6 ---- models/User.js | 7 ++++- routes/courses.js | 2 +- routes/users.js | 6 ++-- src/ClassRepo.js | 57 ----------------------------------- src/checkInRepository.js | 4 +-- src/userRepository.js | 5 +-- test/course/modelRead.test.js | 4 +-- views/courses/edit.pug | 6 ++-- views/courses/index.pug | 12 ++++---- views/courses/show.pug | 6 ++-- views/users/edit.pug | 14 ++++----- views/users/index.pug | 34 +++++++++------------ views/users/show.pug | 18 +++++------ 14 files changed, 58 insertions(+), 123 deletions(-) delete mode 100644 src/ClassRepo.js diff --git a/config/passport.js b/config/passport.js index c898d08..f161104 100644 --- a/config/passport.js +++ b/config/passport.js @@ -44,8 +44,6 @@ module.exports = (passport) => { (req, username, password, done) => { userRepo.getUserByUsername(username) .then(existingUser => { - console.log('sign-up existingUser'); - console.log(existingUser); if (existingUser) { return done(null, false, req.flash('signupMessage', 'That username is already in use')); } else { @@ -53,13 +51,9 @@ module.exports = (passport) => { } }) .then(newUser => { - console.log('new user'); - console.log(newUser); return done(null, newUser); }) .catch(err => { - console.log('error'); - console.log(err); return done(err) }); }) diff --git a/models/User.js b/models/User.js index 8d4a83c..75a143b 100644 --- a/models/User.js +++ b/models/User.js @@ -36,7 +36,12 @@ class User extends bookshelf.Model { get virtuals() { return { countCheckIns: () => { - return this.get('checkIns').count(); + const checkIns = this.get('checkIns'); + if (checkIns) { + return checkIns.count(); + } else { + return 0; + } } } } diff --git a/routes/courses.js b/routes/courses.js index 4d7099a..0a32389 100644 --- a/routes/courses.js +++ b/routes/courses.js @@ -14,7 +14,7 @@ const canEditEvents = (user) => { router.get('/', function (req, res) { return courseRepo.getCourses() .then(courses => { - res.render('courses/index', {courses: courses, authedUser: req.user}); + res.render('courses/index', {courses: courses.models, authedUser: req.user}); }); }); diff --git a/routes/users.js b/routes/users.js index e691f9f..a9ce8a0 100644 --- a/routes/users.js +++ b/routes/users.js @@ -7,7 +7,7 @@ const isLoggedIn = require('./loginCheck'); router.get('/', (req, res) => { userRepo.getUsers() .then(users => { - res.render('users/index', {users: users, authedUser: req.user}); + res.render('users/index', {users: users.models, authedUser: req.user}); }); }); @@ -47,7 +47,7 @@ router.get('/:id', (req, res) => { router.get('/:id/edit', isLoggedIn, (req, res) => { - if (String(req.params.id) !== String(req.user._id)) { + if (String(req.params.id) !== String(req.user.id)) { res.redirect('/users'); } else { userRepo.getUser(req.params.id) @@ -73,7 +73,7 @@ router.post('/:id', router.post('/:id/delete', isLoggedIn, (req, res) => { - if (req.params.id !== req.user._id) { + if (req.params.id !== req.user.id) { res.redirect('/users'); } else { userRepo.deleteUser(req.params.id) diff --git a/src/ClassRepo.js b/src/ClassRepo.js deleted file mode 100644 index e7753cb..0000000 --- a/src/ClassRepo.js +++ /dev/null @@ -1,57 +0,0 @@ -// const mongoose = require('mongoose'); -// -// mongoose.connect('mongodb://heroku_d895z9hp:74v0ph37vib5v5gf02jb675acf@ds135522.mlab.com:35522/heroku_d895z9hp', err => { -// if (err) { -// console.log("couldn't connect to MongoDB"); -// } -// console.log('#connected to MongoDB!') -// }) -// -// const Class = mongoose.model('Class', { -// course_id: String, -// time: Date, -// location: String, -// url: String -// }) -// -// Class.create({ -// course_id: "301230213201430232103012a302", -// time: new Date(), -// location: "Wcoding", -// url: "https://www.meetup.com/Learn-Teach-Code-Seoul/events/240927632/", -// }, (err, data)=>{ -// console.log('#saved ' + data); -// mongoose.disconnect(err =>{ -// console.log('#disconnected from MongoDB'); -// }) -// }) -// // -// // Class.findById('594f6dff9a856b58a9299750', (err, data) =>{ -// // console.log(data); -// // mongoose.disconnect(err =>{ -// // console.log('#disconnected from MongoDB'); -// // }) -// // }) -// // -// // Class.findByIdAndUpdate('594f6dff9a856b58a9299750', -// // {location: 'Hawaii', time: new Date()} -// // ,(err, data) =>{ -// // console.log(data); -// // mongoose.disconnect(err =>{ -// // console.log('#updated and disconnected from MongoDB'); -// // }) -// // }) -// // -// // Class.findByIdAndRemove('594f6dff9a856b58a9299750', (err, data) =>{ -// // console.log(data); -// // mongoose.disconnect(err =>{ -// // console.log('#Found, removed, and disconnected from MongoDB'); -// // }) -// // }) -// // -// // Class.find({}, (err, article) =>{ -// // console.log(article); -// // mongoose.disconnect(err =>{ -// // console.log('#found all and disconnected from MongoDB'); -// // }) -// // }) diff --git a/src/checkInRepository.js b/src/checkInRepository.js index 48cd8d5..723073d 100644 --- a/src/checkInRepository.js +++ b/src/checkInRepository.js @@ -4,7 +4,7 @@ const userRepo = require('./userRepository'); module.exports = { createCheckIn(user, course, cb) { - CheckIn.findOne({user: user._id, course: course._id}, (err, foundCheckIn) => { + CheckIn.findOne({user: user.id, course: course.id}, (err, foundCheckIn) => { if (err) { const result = {err: err, res: foundCheckIn}; cb(result); @@ -28,7 +28,7 @@ module.exports = { cb(result); } else { user.checkIns.push(checkIn); - userRepo.updateUser(user._id, { $push: {checkIns: checkIn} }, (result) => { + userRepo.updateUser(user.id, { $push: {checkIns: checkIn} }, (result) => { if(result) { cb(checkIn); } else { diff --git a/src/userRepository.js b/src/userRepository.js index 8e09471..5c3fefa 100644 --- a/src/userRepository.js +++ b/src/userRepository.js @@ -4,7 +4,7 @@ const Users = require('../models/User').Users; module.exports = { getUsers() { return Users.query(queryBuilder => { - queryBuilder.join('check_in', 'user.id', 'check_in.user_id'); + queryBuilder.leftJoin('check_in', 'user.id', 'check_in.user_id'); queryBuilder.groupBy('user.id'); queryBuilder.select('user.*'); queryBuilder.count('* as check_in_count'); @@ -19,9 +19,6 @@ module.exports = { password: reqBody.password }); - console.log('new user model:'); - console.log(newUser); - return newUser.save(); }, diff --git a/test/course/modelRead.test.js b/test/course/modelRead.test.js index 75d9c42..ce68ea7 100644 --- a/test/course/modelRead.test.js +++ b/test/course/modelRead.test.js @@ -8,9 +8,9 @@ describe('Course modelRead', () => { it('Should find a Course by _id', (done) => { const sql = new Course({title: 'sql'}); sql.save() - .then(() => Course.findOne({_id: sql._id})) + .then(() => Course.findOne({_id: sql.id})) .then((result) => { - assert(String(result._id) === String(sql._id)); + assert(String(result._id) === String(sql.id)); done() }); }); diff --git a/views/courses/edit.pug b/views/courses/edit.pug index e7c7f88..20581e2 100644 --- a/views/courses/edit.pug +++ b/views/courses/edit.pug @@ -2,9 +2,9 @@ extends ../layout block content h1 edit - form(method="Post" action="/courses/" + course._id) + form(method="Post" action="/courses/" + course.get('id')) label(for="title") Title - input(type="text" name="title" id="title" value=course.title) + input(type="text" name="title" id="title" value=course.get('title')) label(for="description") Description - textarea(type="text" name="description" id="description") #{course.description} + textarea(type="text" name="description" id="description") #{course.get('description')} input(type="submit") diff --git a/views/courses/index.pug b/views/courses/index.pug index f2c3902..6a7e0cc 100644 --- a/views/courses/index.pug +++ b/views/courses/index.pug @@ -6,7 +6,7 @@ block content | Courses hr - if authedUser && (authedUser.level === 'instructor' || authedUser.level === 'admin') + if authedUser && (authedUser.get('level') === 'instructor' || authedUser.get('level') === 'admin') .text-right a.btn.btn-primary(href='/courses/create') i.fa.fa-plus @@ -15,13 +15,13 @@ block content for course in courses .card.my-3 .card-block - h4.card-title= course.title - h6.card-subtitle.mb-2.text-muted= `Created by ${course.createdBy || 'unknown'} at ${course.createdAt || 'unknown'}` - p.card-text= course.description - a.card-link(href="/courses/" + course._id) + h4.card-title= course.get('title') + h6.card-subtitle.mb-2.text-muted= `Created by ${course.get('createdBy') || 'unknown'} at ${course.get('createdAt') || 'unknown'}` + p.card-text= course.get('description') + a.card-link(href="/courses/" + course.get('id')) button Details a.card-link(href='#') button Schedule if authedUser && !checkedIn - form.course-index-checkin.card-link(method="Post" action="/courses/" + course._id + "/checkin") + form.course-index-checkin.card-link(method="Post" action="/courses/" + course.get('id') + "/checkin") button(type="submit") Register diff --git a/views/courses/show.pug b/views/courses/show.pug index 5926609..5e2e4ff 100644 --- a/views/courses/show.pug +++ b/views/courses/show.pug @@ -4,7 +4,7 @@ block content h1 course page p= course - if authedUser && (authedUser.level === 'instructor' || authedUser.level === 'admin') - a(href="/courses/" + course._id + "/edit") edit - form(method="Post" action="/courses/" + course._id + "/delete") + if authedUser && (authedUser.get('level') === 'instructor' || authedUser.get('level') === 'admin') + a(href="/courses/" + course.get('id') + "/edit") edit + form(method="Post" action="/courses/" + course.get('id') + "/delete") button(type="submit") delete diff --git a/views/users/edit.pug b/views/users/edit.pug index a8019b7..cd255d9 100644 --- a/views/users/edit.pug +++ b/views/users/edit.pug @@ -7,7 +7,7 @@ block content .col-md-2 .col-md-8 - form(method="Post" action="/users/" + user._id) + form(method="Post" action="/users/" + user.get('id')) .form-group label(for="name") Name input( @@ -15,7 +15,7 @@ block content type="text" name="name" id="name" - value=user.username) + value=user.get('username')) label(for="email") Email input( @@ -23,7 +23,7 @@ block content type="email" name="email" id="email" - value=user.email) + value=user.get('email')) label(for="hometown") Hometown input( @@ -31,7 +31,7 @@ block content type="text" name="hometown" id="hometown" - value=user.hometown) + value=user.get('hometown')) label(for="website") Website input( @@ -39,14 +39,14 @@ block content type="text" name="website" id="website" - value=user.website) + value=user.get('website')) label(for="description") Description textarea( class="form-control" name="description" - id="description") #{user.description} + id="description") #{user.get('description')} input(class="btn btn-success" type="submit") - form(method="Post" action="/users/" + user._id + "/delete") + form(method="Post" action="/users/" + user.get('id') + "/delete") input(type="submit" id="delete-user" value="") .col-md-2 diff --git a/views/users/index.pug b/views/users/index.pug index bdc5ac4..e41c11a 100644 --- a/views/users/index.pug +++ b/views/users/index.pug @@ -1,23 +1,19 @@ extends ../layout block content - h1 Leaderboard - - .container.leaderboard - for user in users - a(href="/users/" + user._id) - .container.leader - img(src="http://via.placeholder.com/60" alt="profile image") - h2= user.username - if user.hometown - h4= user.hometown.toUpperCase() - h3.counter= user.checkIns.length - h3 Check Ins - if user.level === 'teacher' - p.teacher= user.level - else - p= user.level - - - + h1 Leaderboard + .container.leaderboard + for user in users + a(href="/users/" + user.get('id')) + .container.leader + img(src="http://via.placeholder.com/60" alt="profile image") + h2= user.get('username') + if user.get('hometown') + h4= user.get('hometown').toUpperCase() + h3.counter= user.get('countCheckIns') + h3 Check Ins + if user.get('level') === 'teacher' + p.teacher= user.get('level') + else + p= user.get('level') diff --git a/views/users/show.pug b/views/users/show.pug index 0d48794..61d6b8c 100644 --- a/views/users/show.pug +++ b/views/users/show.pug @@ -6,24 +6,24 @@ block content .col-md-4.col-sm-12 img(src='http://via.placeholder.com/180') .col-sm-4 - h1= user.username - h4= user.hometown - if authedUser && (String(authedUser._id) === String(user._id) || authedUser.level === 'admin') + h1= user.get('username') + h4= user.get('hometown') + if authedUser && (authedUser.get('id') === user.get('id') || authedUser.get('level') === 'admin') .col-sm-2 - a(href="/users/" + user._id + "/edit") edit + a(href="/users/" + user.get('id') + "/edit") edit hr - p checkins: #{user.checkIns.length} + p checkins: #{user.get('countCheckIns')} table.col-sm-8.offset-sm-4 tr td level - td= user.level + td= user.get('level') if authedUser tr td email - td= user.email + td= user.get('email') tr td website - td= user.website + td= user.get('website') tr td description - td= user.description + td= user.get('description') From ee0094bf8f0b6ce0afe09297ff8eab0ca2187892 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Fri, 3 Nov 2017 18:15:38 +0900 Subject: [PATCH 42/81] Doesn't error now, but password isn't matching --- config/passport.js | 69 ++++++++++++++++++++++++++----------------- models/User.js | 6 ++-- routes/users.js | 11 +++---- src/userRepository.js | 1 + 4 files changed, 52 insertions(+), 35 deletions(-) diff --git a/config/passport.js b/config/passport.js index f161104..d7c28df 100644 --- a/config/passport.js +++ b/config/passport.js @@ -10,30 +10,36 @@ module.exports = (passport) => { (req, username, password, done) => { console.log('local strategy call invoked'); const user = userRepo.getUserByUsername(username) - .then(user => { - console.log('passport auth getting user by username'); - if (!user) { - return done(null, false, req.flash('loginMessage', 'Incorrect username.')); - } + const passwordCompare = user.then(u => { + return u.comparePassword(password) + }); - return user; - }) - .catch(err => { - return done(err) - }); + return Promise.all([user, passwordCompare]).then((userResult, passwordResult) => { - if (typeof user !== User) { - return user; - } + console.log('userResult:'); + console.log(userResult); + console.log('passwordResult:'); + console.log(passwordResult); - user.comparePassword(password) - .then(isMatch => { - if (isMatch) { - return done(null, user); - } - return done(null, false, req.flash('loginMessage', 'Incorrect password.')); - }); + if (!userResult) { + console.log('calling done no user'); + return done(null, false, req.flash('loginMessage', 'Incorrect username.')); + } + + if (passwordResult) { + console.log('calling done compare password match'); + return done(null, user); + } + + console.log('calling done is not password compare match'); + return done(null, false, req.flash('loginMessage', 'Incorrect password.')); + + }).catch(err => { + console.log('error logging in'); + console.log(err); + return done(err); + }); } )); @@ -51,7 +57,11 @@ module.exports = (passport) => { } }) .then(newUser => { - return done(null, newUser); + if (typeof newUser === User) { + return done(null, newUser); + } else { + return newUser; + } }) .catch(err => { return done(err) @@ -59,16 +69,21 @@ module.exports = (passport) => { }) ); - passport.serializeUser((user, done) => { - done(null, user.id); - }); + /*passport.serializeUser((user, done) => { + console.log('calling done serialize'); + return done(null, user.id); + });*/ passport.deserializeUser((id, done) => { - userRepo.getUser(id) + return userRepo.getUser(id) .then(user => { - done(null, user); + console.log('calling done deserialize success'); + return done(null, user); }) - .catch(err => done(err, null)); + .catch(err => { + console.log('calling done deserialize fail'); + return done(err, null) + }); }); } ; \ No newline at end of file diff --git a/models/User.js b/models/User.js index 75a143b..5c9648a 100644 --- a/models/User.js +++ b/models/User.js @@ -49,9 +49,9 @@ class User extends bookshelf.Model { // https://wesleytsai.io/2015/07/28/bookshelf-bcrpyt-password-hashing/ hashPassword(model, attrs, options) { return new Promise((resolve, reject) => { - if (!model.hasChanged('password')) return resolve.model.attributes.password; + if (!model.hasChanged('password')) return resolve(model.get('password')); - bcrypt.hash(model.attributes.password, SALT_WORK_FACTOR) + bcrypt.hash(model.get('password'), SALT_WORK_FACTOR) .then(hashedPassword => { model.set('password', hashedPassword); resolve(hashedPassword); @@ -64,7 +64,7 @@ class User extends bookshelf.Model { } comparePassword(candidatePassword) { - return bcrypt.compare(candidatePassword, this.password); + return bcrypt.compare(candidatePassword, this.get('password')); }; } diff --git a/routes/users.js b/routes/users.js index a9ce8a0..f685a9c 100644 --- a/routes/users.js +++ b/routes/users.js @@ -30,12 +30,13 @@ router.get('/logout', (req, res) => { res.render('users/logout') }); -router.post('/login', - passport.authenticate('local-login'), - (req, res) => { - res.redirect('/courses'); +// https://stackoverflow.com/questions/13557256/passport-js-cant-set-headers-after-they-are-sent +router.post('/login', passport.authenticate('local-login', { + successRedirect: '/courses', + failureRedirect: '/users/login', + failureFlash: true } -); +)); router.get('/:id', (req, res) => { userRepo.getUser(req.params.id) diff --git a/src/userRepository.js b/src/userRepository.js index 5c3fefa..ffd4850 100644 --- a/src/userRepository.js +++ b/src/userRepository.js @@ -31,6 +31,7 @@ module.exports = { }, getUserByUsername(username) { + console.log('getting user by username'); return User.where('username', username).fetch(); }, From 52d5a41f75a243947ecad37c7ed9052925fc4a3d Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Fri, 3 Nov 2017 19:15:09 +0900 Subject: [PATCH 43/81] Errors serializing user again. It's receiving a promise. Updated packed to do debug happiness --- config/passport.js | 41 ++++++++++++++++++++++++++++------------- models/User.js | 6 +++++- package.json | 6 +++--- routes/users.js | 2 +- src/userRepository.js | 2 ++ 5 files changed, 39 insertions(+), 18 deletions(-) diff --git a/config/passport.js b/config/passport.js index d7c28df..091796f 100644 --- a/config/passport.js +++ b/config/passport.js @@ -1,5 +1,5 @@ const LocalStrategy = require('passport-local').Strategy; -const User = require('../models/User'); +const User = require('../models/User').User; const userRepo = require('../src/userRepository'); module.exports = (passport) => { @@ -12,19 +12,20 @@ module.exports = (passport) => { const user = userRepo.getUserByUsername(username) const passwordCompare = user.then(u => { - return u.comparePassword(password) + console.log('password compare user then promise'); + const result = u.comparePassword(password); + console.log('result:', result); + return result; }); - return Promise.all([user, passwordCompare]).then((userResult, passwordResult) => { + return Promise.all([user, passwordCompare]).then((promiseResult) => { - console.log('userResult:'); - console.log(userResult); - console.log('passwordResult:'); - console.log(passwordResult); + const userResult = promiseResult[0]; + const passwordResult = promiseResult[1]; if (!userResult) { console.log('calling done no user'); - return done(null, false, req.flash('loginMessage', 'Incorrect username.')); + return done(null, false, {message: 'Incorrect username.'}); } if (passwordResult) { @@ -33,7 +34,7 @@ module.exports = (passport) => { } console.log('calling done is not password compare match'); - return done(null, false, req.flash('loginMessage', 'Incorrect password.')); + return done(null, false, {message:'Incorrect password.'}); }).catch(err => { console.log('error logging in'); @@ -44,35 +45,49 @@ module.exports = (passport) => { )); // https://scotch.io/tutorials/easy-node-authentication-setup-and-local + // TODO: get flash to work nicely + // see this https://stackoverflow.com/questions/26403853/node-js-authentication-with-passport-how-to-flash-a-message-if-a-field-is-missi passport.use('local-signup', new LocalStrategy({ passReqToCallback: true }, (req, username, password, done) => { + console.log('starting signup'); userRepo.getUserByUsername(username) .then(existingUser => { + console.log('got existing user'); if (existingUser) { - return done(null, false, req.flash('signupMessage', 'That username is already in use')); + console.log('user exists'); + return done(null, false, {message: 'That username is already in use'}); } else { + console.log('returning createUser promise'); return userRepo.createUser(req.body); } }) .then(newUser => { - if (typeof newUser === User) { + console.log('working on createUser promise'); + if (newUser instanceof User) { + console.log('we got newly created user'); + console.log(newUser); return done(null, newUser); } else { + console.log('we got something that wasn\'t User'); + console.log(typeof newUser); + console.log(newUser instanceof User); + console.log(newUser); return newUser; } }) .catch(err => { + console.log('error signing up:', err); return done(err) }); }) ); - /*passport.serializeUser((user, done) => { + passport.serializeUser((user, done) => { console.log('calling done serialize'); return done(null, user.id); - });*/ + }); passport.deserializeUser((id, done) => { return userRepo.getUser(id) diff --git a/models/User.js b/models/User.js index 5c9648a..188e861 100644 --- a/models/User.js +++ b/models/User.js @@ -64,7 +64,11 @@ class User extends bookshelf.Model { } comparePassword(candidatePassword) { - return bcrypt.compare(candidatePassword, this.get('password')); + console.log('candidatePassword:', candidatePassword); + console.log('this password:', this.get('password')); + const result = bcrypt.compare(candidatePassword, this.get('password')); + console.log('bcrypt compare result:', result); + return result; }; } diff --git a/package.json b/package.json index 479065d..af367e1 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,9 @@ "private": true, "scripts": { "start": "RUN_MODE=prod node ./bin/www", - "dev": "RUN_MODE=dev nodemon ./bin/www", - "test": "RUN_MODE=dev mocha --recursive", - "test-watch": "RUN_MODE=dev nodemon --exec 'npm test'" + "dev": "RUN_MODE=dev nodemon $NODE_DEBUG_OPTION ./bin/www", + "test": "RUN_MODE=dev mocha $NODE_DEBUG_OPTION --recursive", + "test-watch": "RUN_MODE=dev nodemon $NODE_DEBUG_OPTION --exec 'npm test'" }, "dependencies": { "bcrypt": "^1.0.3", diff --git a/routes/users.js b/routes/users.js index f685a9c..e899d1c 100644 --- a/routes/users.js +++ b/routes/users.js @@ -17,7 +17,7 @@ router.get('/signup', (req, res) => { router.post('/signup', passport.authenticate('local-signup', { successRedirect: '/courses', - failureRedirect: '/signup', + failureRedirect: '/users/signup', failureFlash: true })); diff --git a/src/userRepository.js b/src/userRepository.js index ffd4850..c362730 100644 --- a/src/userRepository.js +++ b/src/userRepository.js @@ -18,6 +18,8 @@ module.exports = { email: reqBody.email, password: reqBody.password }); + console.log('createUser newUser'); + console.log(newUser); return newUser.save(); }, From b4c242098197fd63da8bbe9f4738c6aa9e90ea36 Mon Sep 17 00:00:00 2001 From: Hazelton Jacob Date: Sat, 4 Nov 2017 18:14:10 +0900 Subject: [PATCH 44/81] Added type to create event --- models/Event.js | 3 +++ public/javascripts/shared.js | 6 ++++++ routes/users.js | 6 ++++++ views/events/create.pug | 12 ++++++++++++ views/events/index.pug | 1 + views/layout.pug | 4 ++++ 6 files changed, 32 insertions(+) diff --git a/models/Event.js b/models/Event.js index 56c2471..d367ed5 100644 --- a/models/Event.js +++ b/models/Event.js @@ -9,6 +9,9 @@ const eventSchema = new mongoose.Schema({ message: 'Title must be valid length' } }, + type: { + type: String + }, description: { type: String, validate: { diff --git a/public/javascripts/shared.js b/public/javascripts/shared.js index 1c1b070..ada1758 100644 --- a/public/javascripts/shared.js +++ b/public/javascripts/shared.js @@ -1,5 +1,7 @@ console.log('shared js loaded'); +// const userRepo = require("../../src/userRepository") + document.addEventListener("DOMContentLoaded", function() { let alertMsg = document.querySelector('.alert'); let alertWrapper = document.querySelector('.alert-wrap'); @@ -8,4 +10,8 @@ document.addEventListener("DOMContentLoaded", function() { alertWrapper.removeChild(alertMsg); }, 2600); } + $(".dropdown-menu").click((e) => { + $("#dropdownMenuButton").html(e.target.innerHTML) + $("#type").val(e.target.innerHTML) + }); }); diff --git a/routes/users.js b/routes/users.js index da3ef54..f7b88cb 100644 --- a/routes/users.js +++ b/routes/users.js @@ -10,6 +10,12 @@ router.get('/', (req, res) => { }); }); +router.get('/api', (req, res) => { + userRepo.getUsers(users => { + res.send({ users: users }); + }); +}); + router.get('/signup', (req, res) => { res.render('users/signup'); }); diff --git a/views/events/create.pug b/views/events/create.pug index 78bd937..2c3d99e 100644 --- a/views/events/create.pug +++ b/views/events/create.pug @@ -12,6 +12,18 @@ block content div(class="form-group") label(for="title") Name input(class="form-control" type="text" name="title" id="title") + label(for="type") Type + input(type="hidden" name="type" id="type") + div(class="dropdown") + button(class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false") Select + div(class="dropdown-menu" aria-labelledby="dropdownMenuButton") + a(class="dropdown-item" href="#") Course + a(class="dropdown-item" href="#") Workshop + a(class="dropdown-item" href="#") Study Group + a(class="dropdown-item" href="#") Hack Night + a(class="dropdown-item" href="#") Special Event label(for="description") Description textarea(class="form-control" name="description" id="description") input(class="btn btn-success" type="submit") + + diff --git a/views/events/index.pug b/views/events/index.pug index a9b8c19..a239cf7 100644 --- a/views/events/index.pug +++ b/views/events/index.pug @@ -16,6 +16,7 @@ block content .card-block h4.card-title= event.title h6.card-subtitle.mb-2.text-muted= `Created by ${event.createdBy || 'unknown'} at ${event.createdAt || 'unknown'}` + p.card-text= event.type p.card-text= event.description a.card-link(href="/events/" + event._id) Details a.card-link(href='#') Schedule diff --git a/views/layout.pug b/views/layout.pug index 15ca27e..cf0b759 100644 --- a/views/layout.pug +++ b/views/layout.pug @@ -6,7 +6,11 @@ html link(href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css", rel="stylesheet", integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN", crossorigin="anonymous") link(rel='stylesheet', href='/stylesheets/style.css') link(href="https://fonts.googleapis.com/css?family=Source+Sans+Pro" rel="stylesheet") + script(src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js") + script(src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous") + script(src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js" integrity="sha384-vBWWzlZJ8ea9aCX4pEW3rVHjgjt7zpkNpZk+02D9phzyeVkE+jo0ieGizqPLForn" crossorigin="anonymous") script(type='text/javascript' src='../javascripts/shared.js') + body .container.mt-5 include includes/header From 053e1313075c18e27c06329e3a3f9f97d06f24fe Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 6 Nov 2017 16:35:11 +0900 Subject: [PATCH 45/81] Fixed bug where user wouldn't serialize properly --- config/passport.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/passport.js b/config/passport.js index 091796f..8377bcb 100644 --- a/config/passport.js +++ b/config/passport.js @@ -30,7 +30,7 @@ module.exports = (passport) => { if (passwordResult) { console.log('calling done compare password match'); - return done(null, user); + return done(null, userResult); } console.log('calling done is not password compare match'); @@ -86,7 +86,7 @@ module.exports = (passport) => { passport.serializeUser((user, done) => { console.log('calling done serialize'); - return done(null, user.id); + return done(null, user.get('id')); }); passport.deserializeUser((id, done) => { From 27dd77425b337eeeb9131a4b5b772dfb7ea6092f Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 6 Nov 2017 17:00:47 +0900 Subject: [PATCH 46/81] Creating courses works, but they're not tracking creator --- routes/courses.js | 16 ++++++---------- views/courses/create.pug | 29 +++++++++++++++++------------ 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/routes/courses.js b/routes/courses.js index 0a32389..8f4f2be 100644 --- a/routes/courses.js +++ b/routes/courses.js @@ -8,7 +8,7 @@ const canEditEvents = (user) => { if (user === null) { return false; } - return user.level === 'instructor' || user.level === 'admin'; + return user.get('level') === 'instructor' || user.get('level') === 'admin'; }; router.get('/', function (req, res) { @@ -21,11 +21,7 @@ router.get('/', function (req, res) { router.get('/create', isLoggedIn, (req, res) => { - if (canEditEvents(req.user)) { - res.render('courses/create') - } else { - res.status(res.unauthorized).send(); - } + res.render('courses/create', {canEdit: canEditEvents(req.user), authedUser: req.user}); } ); @@ -42,7 +38,7 @@ router.post('/create', res.redirect('/courses/create'); }); } else { - res.status(res.unauthorized).send(); + res.send(403); } } ); @@ -71,7 +67,7 @@ router.get('/:id/edit', res.redirect('/'); }); } else { - res.status(res.unauthorized).send(); + res.send(403); } } ); @@ -89,7 +85,7 @@ router.post('/:id', res.redirect('/'); }); } else { - res.status(res.unauthorized).send(); + res.send(403); } } ); @@ -128,7 +124,7 @@ router.post('/:id/delete', res.redirect('/'); }); } else { - res.status(res.unauthorized).send(); + res.send(403); } } ); diff --git a/views/courses/create.pug b/views/courses/create.pug index e84ba1d..9e20fd1 100644 --- a/views/courses/create.pug +++ b/views/courses/create.pug @@ -2,16 +2,21 @@ extends ../layout block content - div(class="container form") - div(class="row") - div(class="col-md-2") - div(class="col-md-8") - h2 Register a new course + div(class="container form") + div(class="row") + div(class="col-md-2") + div(class="col-md-8") + h2 Register a new course + + if (canEdit) + form(method="Post" action="/courses/create") + div(class="form-group") + label(for="title") Name + input(class="form-control" type="text" name="title" id="title") + label(for="description") Description + textarea(class="form-control" name="description" id="description") + input(class="btn btn-success" type="submit") + else + h5 You are not permitted to create courses. + p If this isn't right, please contact the LTC leadership on Slack - form(method="Post" action="/courses/create") - div(class="form-group") - label(for="title") Name - input(class="form-control" type="text" name="title" id="title") - label(for="description") Description - textarea(class="form-control" name="description" id="description") - input(class="btn btn-success" type="submit") From 93f156f5e98b025099ac84639ed1c91dcef48295 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Tue, 7 Nov 2017 17:06:59 +0900 Subject: [PATCH 47/81] Converted models away from class-style. Bookshelf didn't like it --- models/Course.js | 64 ++++++++++++++++++++++---------- models/User.js | 93 ++++++++++++++++++++++++++--------------------- models/checkIn.js | 47 +++++++++++++++--------- 3 files changed, 126 insertions(+), 78 deletions(-) diff --git a/models/Course.js b/models/Course.js index e97ecec..ffe6df2 100644 --- a/models/Course.js +++ b/models/Course.js @@ -1,29 +1,55 @@ const bookshelf = require('../config/bookshelf').bookshelf; -class Course extends bookshelf.Model { +const Course = bookshelf.Model.extend({ - get tableName() { - return 'course'; - } + tableName: 'course', + hasTimestamps: true, - get hasTimestamps() { - return true; - } - - checkIns() { + checkIns: function () { return this.hasMany('CheckIn', 'course_id'); - } + }, - instructors() { + instructors: function () { return this.belongsToMany('User', 'course_instructor', 'course_id'); - } -} - -class Courses extends bookshelf.Collection { - get model() { - return Course; - } -} + }, + + createdBy: function () { + return this.belongsTo('User', 'created_by'); + }, + + virtuals: { + createdAt: { + get: function () { + return this.get('created_at'); + }, + set: function (newDate) { + this.set('created_at', newDate); + } + }, + + updatedAt: { + get: function () { + return this.get('updated_at'); + }, + set: function (newDate) { + this.set('updated_at', newDate) + } + }, + + createdBy: { + get: function () { + return this.get('created_by'); + }, + set: function (user) { + this.set('created_by', user) + } + } + }, +}); + +const Courses = bookshelf.Collection.extend({ + model: Course +}); module.exports = { Course: Course, diff --git a/models/User.js b/models/User.js index 188e861..24fb370 100644 --- a/models/User.js +++ b/models/User.js @@ -1,53 +1,64 @@ const bookshelf = require('../config/bookshelf').bookshelf; -const validator = require('validator'); -const checkit = require('checkit'); const bcrypt = require('bcrypt'); const SALT_WORK_FACTOR = 10; const CheckIn = require('./checkIn'); // TODO: Add validations -class User extends bookshelf.Model { +const User = bookshelf.Model.extend({ - constructor(...args) { - super(...args); - this.on('saving', this.hashPassword, this); - } + tableName: 'user', + hasTimestamps: true, + hidden: ['password'], - get tableName() { - return 'user'; - } + initialize: function () { + console.log('this:', this); + console.log('this.on:', this.on); + this.on('save', this.hashPassword, this); + }, - get hasTimestamps() { - return true; - } - - get hidden() { - return ['password']; - } - - get checkIns() { + checkIns: function () { return this.hasMany('CheckIn', 'user_id'); - } + }, - get instructingCourses() { + instructingCourses: function () { return this.belongsToMany('Course', 'course_instructor', 'user_id'); - } + }, + + createdCourses: function () { + return this.hasMany('Course', 'created_by'); + }, - get virtuals() { - return { - countCheckIns: () => { - const checkIns = this.get('checkIns'); - if (checkIns) { - return checkIns.count(); - } else { - return 0; - } + virtuals: { + countCheckIns: function () { + const checkIns = this.get('checkIns'); + if (checkIns) { + return checkIns.count(); + } else { + return 0; + } + }, + createdAt: { + get: function () { + return this.get('created_at'); + }, + + set: function (newDate) { + this.set('created_at', newDate); + } + }, + updatedAt: { + get: function () { + return this.get('updated_at'); + }, + + set: function (newDate) { + this.set('updated_at', newDate); } } - } + }, // https://wesleytsai.io/2015/07/28/bookshelf-bcrpyt-password-hashing/ - hashPassword(model, attrs, options) { + hashPassword: function (model, attrs, options) { return new Promise((resolve, reject) => { if (!model.hasChanged('password')) return resolve(model.get('password')); @@ -61,22 +72,20 @@ class User extends bookshelf.Model { reject(err); }); }); - } + }, - comparePassword(candidatePassword) { + comparePassword: function (candidatePassword) { console.log('candidatePassword:', candidatePassword); console.log('this password:', this.get('password')); const result = bcrypt.compare(candidatePassword, this.get('password')); console.log('bcrypt compare result:', result); return result; - }; -} - -class Users extends bookshelf.Collection { - get model() { - return User; } -} +}); + +const Users = bookshelf.Collection.extend({ + model: User +}); module.exports = { User: User, diff --git a/models/checkIn.js b/models/checkIn.js index b786f5f..ef0bbb8 100644 --- a/models/checkIn.js +++ b/models/checkIn.js @@ -1,29 +1,42 @@ const bookshelf = require('../config/bookshelf').bookshelf; -class CheckIn extends bookshelf.Model { +const CheckIn = bookshelf.Model.extend({ - get tableName() { - return 'check_in'; - } - - get hasTimestamps() { - return true; - } + tableName: 'check_in', + hasTimestamps: true, - get user() { + user: () => { return this.belongsTo('User', 'user_id'); - } + }, - get course() { + course: () => { return this.belongsTo('Course', 'course_id'); - } -} + }, + + virtuals: { -class CheckIns extends bookshelf.Collection { - get model() { - return CheckIn; + createdAt: { + get: () => { + return this.get('created_at'); + }, + set: newDate => { + this.set('created_at', newDate); + } + }, + updatedAt: { + get: () => { + return this.get('updated_at'); + }, + set: newDate => { + this.set('updated_at', newDate) + } + } } -} +}); + +const CheckIns = bookshelf.Collection.extend({ + model: CheckIn +}); module.exports = { CheckIn: CheckIn, From fdba0e79174de55f1c2b80f9dfb60a4005b1c606 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Wed, 8 Nov 2017 14:16:20 +0900 Subject: [PATCH 48/81] Fix for registry plugin. Fix for course page. Relationships seem to work. Saving aliased attributes is not really a thing. Bookshelf kinda sucks. Added moment for datetime formatting --- config/bookshelf.js | 7 +++++-- config/passport.js | 15 ++------------- models/Course.js | 16 ++++------------ models/User.js | 7 +------ package-lock.json | 5 +++++ package.json | 1 + routes/courses.js | 3 ++- src/CourseRepo.js | 11 ++++++----- src/userRepository.js | 6 +----- views/courses/create.pug | 2 +- views/courses/index.pug | 2 +- 11 files changed, 29 insertions(+), 46 deletions(-) diff --git a/config/bookshelf.js b/config/bookshelf.js index b5b9566..3cc7dd8 100644 --- a/config/bookshelf.js +++ b/config/bookshelf.js @@ -53,6 +53,7 @@ module.exports = { table.increments(); table.string('title'); table.string('description'); + table.string('created_by'); table.timestamps(); }).createTableIfNotExists('check_in', (table) => { table.increments(); @@ -64,7 +65,9 @@ module.exports = { table.integer('course_id'); table.integer('user_id'); table.timestamps(); - }).toString(); - console.log('created tables'); + }).then(() => { + console.log('created tables'); + }); + } }; diff --git a/config/passport.js b/config/passport.js index 8377bcb..e9c9831 100644 --- a/config/passport.js +++ b/config/passport.js @@ -51,29 +51,19 @@ module.exports = (passport) => { passReqToCallback: true }, (req, username, password, done) => { - console.log('starting signup'); userRepo.getUserByUsername(username) .then(existingUser => { - console.log('got existing user'); if (existingUser) { - console.log('user exists'); return done(null, false, {message: 'That username is already in use'}); } else { - console.log('returning createUser promise'); return userRepo.createUser(req.body); } }) .then(newUser => { - console.log('working on createUser promise'); if (newUser instanceof User) { - console.log('we got newly created user'); - console.log(newUser); return done(null, newUser); } else { - console.log('we got something that wasn\'t User'); - console.log(typeof newUser); - console.log(newUser instanceof User); - console.log(newUser); + ; return newUser; } }) @@ -92,11 +82,10 @@ module.exports = (passport) => { passport.deserializeUser((id, done) => { return userRepo.getUser(id) .then(user => { - console.log('calling done deserialize success'); return done(null, user); }) .catch(err => { - console.log('calling done deserialize fail'); + console.log('calling done deserialize fail. err:', err); return done(err, null) }); }); diff --git a/models/Course.js b/models/Course.js index ffe6df2..2669131 100644 --- a/models/Course.js +++ b/models/Course.js @@ -1,4 +1,5 @@ const bookshelf = require('../config/bookshelf').bookshelf; +const moment = require('moment'); const Course = bookshelf.Model.extend({ @@ -20,7 +21,7 @@ const Course = bookshelf.Model.extend({ virtuals: { createdAt: { get: function () { - return this.get('created_at'); + return moment(this.get('created_at')).format('YYYY-MM-DD HH:mm:ss'); }, set: function (newDate) { this.set('created_at', newDate); @@ -29,20 +30,11 @@ const Course = bookshelf.Model.extend({ updatedAt: { get: function () { - return this.get('updated_at'); + return moment(this.get('updated_at')).format('YYYY-MM-DD HH:mm:ss'); }, set: function (newDate) { this.set('updated_at', newDate) } - }, - - createdBy: { - get: function () { - return this.get('created_by'); - }, - set: function (user) { - this.set('created_by', user) - } } }, }); @@ -52,6 +44,6 @@ const Courses = bookshelf.Collection.extend({ }); module.exports = { - Course: Course, + Course: bookshelf.model('Course', Course), Courses: Courses }; diff --git a/models/User.js b/models/User.js index 24fb370..928431c 100644 --- a/models/User.js +++ b/models/User.js @@ -11,8 +11,6 @@ const User = bookshelf.Model.extend({ hidden: ['password'], initialize: function () { - console.log('this:', this); - console.log('this.on:', this.on); this.on('save', this.hashPassword, this); }, @@ -75,10 +73,7 @@ const User = bookshelf.Model.extend({ }, comparePassword: function (candidatePassword) { - console.log('candidatePassword:', candidatePassword); - console.log('this password:', this.get('password')); const result = bcrypt.compare(candidatePassword, this.get('password')); - console.log('bcrypt compare result:', result); return result; } }); @@ -88,6 +83,6 @@ const Users = bookshelf.Collection.extend({ }); module.exports = { - User: User, + User: bookshelf.model('User', User), Users: Users }; diff --git a/package-lock.json b/package-lock.json index 673d6aa..ef2bea9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3149,6 +3149,11 @@ } } }, + "moment": { + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.1.tgz", + "integrity": "sha1-VtoaLRy/AdOLfhr8McELz6GSkWc=" + }, "morgan": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.8.2.tgz", diff --git a/package.json b/package.json index af367e1..1ab6856 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "jquery": "^3.2.1", "knex": "^0.13.0", "method-override": "~1.0.0", + "moment": "^2.19.1", "morgan": "~1.8.1", "passport": "~0.1.17", "passport-local": "~0.1.6", diff --git a/routes/courses.js b/routes/courses.js index 8f4f2be..c601d42 100644 --- a/routes/courses.js +++ b/routes/courses.js @@ -29,8 +29,9 @@ router.post('/create', isLoggedIn, (req, res) => { if (canEditEvents(req.user)) { - courseRepo.createCourse(req.body) + courseRepo.createCourse(req.body, req.user.get('id')) .then(() => { + console.log('created course successfully'); res.redirect('/courses'); }) .catch(err => { diff --git a/src/CourseRepo.js b/src/CourseRepo.js index a79559c..2aa2ba0 100644 --- a/src/CourseRepo.js +++ b/src/CourseRepo.js @@ -2,14 +2,15 @@ const Course = require('../models/Course').Course; module.exports = { getCourses() { - return Course.forge().orderBy('created_at', 'DESC').fetchAll(); + return Course.forge().orderBy('created_at', 'DESC').fetchAll({withRelated: ['createdBy']}); }, - createCourse(reqBody) { - return new Course({ + createCourse(reqBody, creator) { + return new Course().save({ title: reqBody.title, - description: reqBody.description - }).save(); + description: reqBody.description, + created_by: creator + }); }, getCourse(id) { diff --git a/src/userRepository.js b/src/userRepository.js index c362730..32a4a75 100644 --- a/src/userRepository.js +++ b/src/userRepository.js @@ -13,15 +13,11 @@ module.exports = { }, createUser(reqBody) { - const newUser = new User({ + return new User().save({ username: reqBody.username, email: reqBody.email, password: reqBody.password }); - console.log('createUser newUser'); - console.log(newUser); - - return newUser.save(); }, getUser(id) { diff --git a/views/courses/create.pug b/views/courses/create.pug index 9e20fd1..409767d 100644 --- a/views/courses/create.pug +++ b/views/courses/create.pug @@ -8,7 +8,7 @@ block content div(class="col-md-8") h2 Register a new course - if (canEdit) + if canEdit form(method="Post" action="/courses/create") div(class="form-group") label(for="title") Name diff --git a/views/courses/index.pug b/views/courses/index.pug index 6a7e0cc..68ebdf6 100644 --- a/views/courses/index.pug +++ b/views/courses/index.pug @@ -16,7 +16,7 @@ block content .card.my-3 .card-block h4.card-title= course.get('title') - h6.card-subtitle.mb-2.text-muted= `Created by ${course.get('createdBy') || 'unknown'} at ${course.get('createdAt') || 'unknown'}` + h6.card-subtitle.mb-2.text-muted= `Created by ${course.related('createdBy').get('name') || 'unknown'} at ${course.get('createdAt') || 'unknown'}` p.card-text= course.get('description') a.card-link(href="/courses/" + course.get('id')) button Details From 55528a3fd9cfb6e33b69cf8c483d13ba4d8ab357 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Wed, 8 Nov 2017 15:38:46 +0900 Subject: [PATCH 49/81] Fixed course display page --- models/Course.js | 12 +++++++++++- public/stylesheets/style.css | 17 +++++++++++++++++ routes/courses.js | 15 +++++++++++++-- src/CourseRepo.js | 4 ++++ views/courses/show.pug | 16 ++++++++++++++-- 5 files changed, 59 insertions(+), 5 deletions(-) diff --git a/models/Course.js b/models/Course.js index 2669131..4f448c4 100644 --- a/models/Course.js +++ b/models/Course.js @@ -11,7 +11,7 @@ const Course = bookshelf.Model.extend({ }, instructors: function () { - return this.belongsToMany('User', 'course_instructor', 'course_id'); + return this.belongsToMany('User', 'course_instructor'); }, createdBy: function () { @@ -19,6 +19,16 @@ const Course = bookshelf.Model.extend({ }, virtuals: { + + countCheckIns: function () { + const checkIns = this.get('checkIns'); + if (checkIns) { + return checkIns.count(); + } else { + return 0; + } + }, + createdAt: { get: function () { return moment(this.get('created_at')).format('YYYY-MM-DD HH:mm:ss'); diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index 5a40280..fd607fa 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -165,3 +165,20 @@ input[type="submit"] { .course-index-checkin { display: inline-block; } + +/********************************************/ +/* course display styles */ +/********************************************/ +.course-subscript { + font-size: small; +} + +.course-subscript ul { + display: inline-block; + padding-left: 0; + margin-bottom: 0; +} + +.course-instructor-list { + display: inline-block; +} \ No newline at end of file diff --git a/routes/courses.js b/routes/courses.js index c601d42..1776c54 100644 --- a/routes/courses.js +++ b/routes/courses.js @@ -45,9 +45,20 @@ router.post('/create', ); router.get('/:id', (req, res) => { - courseRepo.getCourse(req.params.id) + courseRepo.getCourseWithFullDetails(req.params.id) .then(course => { - res.render('courses/show', {course: course, authedUser: req.user}); + console.log('course.instructors:', course.instructors()); + course.instructors().fetch() + .then(instructors => { + console.log('after promise'); + console.log(instructors); + res.render('courses/show', {course: course, instructors: instructors, authedUser: req.user}); + }) + .catch(err => { + console.log('err retrieving instructors for course id', req.params.id, '. err:', err); + res.render('courses/show', {course: course, authedUser: req.user}); + }); + }) .catch(err => { console.log(err); diff --git a/src/CourseRepo.js b/src/CourseRepo.js index 2aa2ba0..be2cfb9 100644 --- a/src/CourseRepo.js +++ b/src/CourseRepo.js @@ -17,6 +17,10 @@ module.exports = { return Course.where('id', id).fetch(); }, + getCourseWithFullDetails(id) { + return Course.where('id', id).fetch({withRelated: ['instructors', 'createdBy']}); + }, + updateCourse(id, course) { return Course.where('id', id).save(course, {patch: true}); }, diff --git a/views/courses/show.pug b/views/courses/show.pug index 5e2e4ff..8ac766b 100644 --- a/views/courses/show.pug +++ b/views/courses/show.pug @@ -1,8 +1,20 @@ extends ../layout block content - h1 course page - p= course + h1= course.get('title') + h6.course-subscript Posted by #{course.related('createdBy').get('name')} + if instructors && instructors.length > 0 + h6.course-subscript Instructors: + ul + each instructor, index in instructors.models + if index === 0 + li.course-instructor-list + a(href="/users/" + instructor.get('id'))= instructor.get('name') + else + li.course-instructor-list | + a(href="/users/" + instructor.get('id'))= instructor.get('name') + h6.course-subscript Checkins: #{course.get('countCheckIns')} + p= course.get('description') if authedUser && (authedUser.get('level') === 'instructor' || authedUser.get('level') === 'admin') a(href="/courses/" + course.get('id') + "/edit") edit From e460268fbcedca336346e5b68551c0525419b587 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Wed, 8 Nov 2017 17:16:43 +0900 Subject: [PATCH 50/81] Merged event changes. Updated my code to reflect course -> event --- README.md | 32 +++++--------------- app.js | 2 +- config/bookshelf.js | 8 ++--- models/Event.js | 8 ++--- models/User.js | 8 ++--- models/checkIn.js | 3 +- public/stylesheets/style.css | 12 ++++---- routes/events.js | 58 ++++++++++++++++++------------------ routes/users.js | 4 +-- src/CourseRepo.js | 31 ------------------- src/checkInRepository.js | 10 +++---- src/eventRepository.js | 31 +++++++++++++++++++ views/courses/create.pug | 22 -------------- views/courses/index.pug | 27 ----------------- views/courses/show.pug | 22 -------------- views/events/create.pug | 2 +- views/events/index.pug | 31 ++++++++++--------- views/events/show.pug | 23 ++++++++++---- 18 files changed, 131 insertions(+), 203 deletions(-) delete mode 100644 src/CourseRepo.js create mode 100644 src/eventRepository.js delete mode 100644 views/courses/create.pug delete mode 100644 views/courses/index.pug delete mode 100644 views/courses/show.pug diff --git a/README.md b/README.md index e380df6..7cad51b 100644 --- a/README.md +++ b/README.md @@ -51,39 +51,21 @@ npm run test-watch => runs all tests each time a change is saved * hometown * description * checkIns +* createdAt +* updatedAt #### Event * _id * title * description * tags -* createdAt * instructors +* createdAt +* updatedAt #### CheckIn * _id * user -* course -* date - -### Unknown/Missing Collections - -#### UsersClasses -* _id -* user_id -* course_id -* date - -#### Lecture -* _id -* course_id -* time -* location -* url - -#### Session -* _id -* sessionOpen -* date -* checkIns -* course \ No newline at end of file +* event +* createdAt +* updatedAt diff --git a/app.js b/app.js index 67a6ac0..fe27ba9 100644 --- a/app.js +++ b/app.js @@ -37,7 +37,7 @@ app.use(cookieParser()); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); -app.use(express.static(path.join(__dirname, 'public')));\ +app.use(express.static(path.join(__dirname, 'public'))); // required for passport app.use(session({secret: 'thisneedstobehidden'})); diff --git a/config/bookshelf.js b/config/bookshelf.js index 3cc7dd8..3359c44 100644 --- a/config/bookshelf.js +++ b/config/bookshelf.js @@ -49,7 +49,7 @@ module.exports = { table.string('hometown'); table.string('description'); table.timestamps(); - }).createTableIfNotExists('course', (table) => { + }).createTableIfNotExists('event', (table) => { table.increments(); table.string('title'); table.string('description'); @@ -58,11 +58,11 @@ module.exports = { }).createTableIfNotExists('check_in', (table) => { table.increments(); table.integer('user_id'); - table.integer('course_id'); + table.integer('event_id'); table.timestamps(); - }).createTableIfNotExists('course_instructor', (table) => { + }).createTableIfNotExists('event_instructor', (table) => { table.increments(); - table.integer('course_id'); + table.integer('event_id'); table.integer('user_id'); table.timestamps(); }).then(() => { diff --git a/models/Event.js b/models/Event.js index 0a8cf0a..4e33c69 100644 --- a/models/Event.js +++ b/models/Event.js @@ -1,17 +1,17 @@ const bookshelf = require('../config/bookshelf').bookshelf; const moment = require('moment'); -const Events = bookshelf.Model.extend({ +const Event = bookshelf.Model.extend({ - tableName: 'course', + tableName: 'event', hasTimestamps: true, checkIns: function () { - return this.hasMany('CheckIn', 'course_id'); + return this.hasMany('CheckIn', 'event_id'); }, instructors: function () { - return this.belongsToMany('User', 'course_instructor'); + return this.belongsToMany('User', 'event_instructor'); }, createdBy: function () { diff --git a/models/User.js b/models/User.js index 928431c..8e0464a 100644 --- a/models/User.js +++ b/models/User.js @@ -18,12 +18,12 @@ const User = bookshelf.Model.extend({ return this.hasMany('CheckIn', 'user_id'); }, - instructingCourses: function () { - return this.belongsToMany('Course', 'course_instructor', 'user_id'); + instructingEvents: function () { + return this.belongsToMany('Event', 'event_instructor', 'user_id'); }, - createdCourses: function () { - return this.hasMany('Course', 'created_by'); + createdEvents: function () { + return this.hasMany('Event', 'created_by'); }, virtuals: { diff --git a/models/checkIn.js b/models/checkIn.js index 290efc7..2a00ff9 100644 --- a/models/checkIn.js +++ b/models/checkIn.js @@ -10,7 +10,7 @@ const CheckIn = bookshelf.Model.extend({ }, event: () => { - return this.belongsTo('Course', 'course_id'); + return this.belongsTo('Event', 'event_id'); }, virtuals: { @@ -32,6 +32,7 @@ const CheckIn = bookshelf.Model.extend({ } } } +}); const CheckIns = bookshelf.Collection.extend({ model: CheckIn diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index fd607fa..c7ed068 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -160,25 +160,25 @@ input[type="submit"] { } /********************************************/ -/* course index styles */ +/* event index styles */ /********************************************/ -.course-index-checkin { +.event-index-checkin { display: inline-block; } /********************************************/ -/* course display styles */ +/* event display styles */ /********************************************/ -.course-subscript { +.event-subscript { font-size: small; } -.course-subscript ul { +.event-subscript ul { display: inline-block; padding-left: 0; margin-bottom: 0; } -.course-instructor-list { +.event-instructor-list { display: inline-block; } \ No newline at end of file diff --git a/routes/events.js b/routes/events.js index b1c4cbc..2ff2ccd 100644 --- a/routes/events.js +++ b/routes/events.js @@ -1,7 +1,7 @@ const router = require('express').Router(); const isLoggedIn = require('./loginCheck'); -const eventRepo = require('../src/eventRepo'); const checkInRepo = require('../src/checkInRepository'); +const eventRepo = require('../src/eventRepository'); // TODO: convert to middleware const canEditEvents = (user) => { @@ -12,16 +12,16 @@ const canEditEvents = (user) => { }; router.get('/', function (req, res) { - return courseRepo.getEvents() - .then(courses => { - res.render('courses/index', {courses: courses.models, authedUser: req.user}); + return eventRepo.getEvents() + .then(events => { + res.render('events/index', {events: events.models, authedUser: req.user}); }); }); router.get('/create', isLoggedIn, (req, res) => { - res.render('courses/create', {canEdit: canEditEvents(req.user), authedUser: req.user}); + res.render('events/create', {canEdit: canEditEvents(req.user), authedUser: req.user}); } ); @@ -29,14 +29,14 @@ router.post('/create', isLoggedIn, (req, res) => { if (canEditEvents(req.user)) { - courseRepo.createCourse(req.body, req.user.get('id')) + eventRepo.createEvent(req.body, req.user.get('id')) .then(() => { - console.log('created course successfully'); - res.redirect('/courses'); + console.log('created event successfully'); + res.redirect('/events'); }) .catch(err => { console.log(err); - res.redirect('/courses/create'); + res.redirect('/events/create'); }); } else { res.send(403); @@ -45,18 +45,18 @@ router.post('/create', ); router.get('/:id', (req, res) => { - courseRepo.getCourseWithFullDetails(req.params.id) - .then(course => { - console.log('course.instructors:', course.instructors()); - course.instructors().fetch() + eventRepo.getEventWithFullDetails(req.params.id) + .then(event => { + console.log('event.instructors:', event.instructors()); + event.instructors().fetch() .then(instructors => { console.log('after promise'); console.log(instructors); - res.render('courses/show', {course: course, instructors: instructors, authedUser: req.user}); + res.render('events/show', {event: event, instructors: instructors, authedUser: req.user}); }) .catch(err => { - console.log('err retrieving instructors for course id', req.params.id, '. err:', err); - res.render('courses/show', {course: course, authedUser: req.user}); + console.log('err retrieving instructors for event id', req.params.id, '. err:', err); + res.render('events/show', {event: event, authedUser: req.user}); }); }) @@ -70,9 +70,9 @@ router.get('/:id/edit', isLoggedIn, (req, res) => { if (canEditEvents(req.user)) { - courseRepo.getCourse(req.params.id) - .then(course => { - res.render('courses/edit', {course: course, authedUser: req.user}); + eventRepo.getEvent(req.params.id) + .then(event => { + res.render('events/edit', {event: event, authedUser: req.user}); }) .catch(err => { console.log(err); @@ -88,9 +88,9 @@ router.post('/:id', isLoggedIn, (req, res) => { if (canEditEvents(req.user)) { - courseRepo.updateCourse(req.params.id, req.body) + eventRepo.updateEvent(req.params.id, req.body) .then(() => { - res.redirect('/courses/' + req.params.id); + res.redirect('/events/' + req.params.id); }) .catch(err => { console.log(err); @@ -105,20 +105,20 @@ router.post('/:id', router.post('/:id/checkin', isLoggedIn, (req, res) => { - const course = courseRepo.getCourse(req.params.id) - .then(course => course) + const event = eventRepo.getEvent(req.params.id) + .then(event => event) .catch(err => { console.log(err); - res.render('courses/show', {course: null, errorMessage: err, authedUser: req.user}) + res.render('events/show', {event: null, errorMessage: err, authedUser: req.user}) }); - checkInRepo.createCheckIn(req.user, course) + checkInRepo.createCheckIn(req.user, event) .then(() => { - res.render('courses/show', {course: course, checkedIn: true, authedUser: req.user}); + res.render('events/show', {event: event, checkedIn: true, authedUser: req.user}); }) .catch(err => { console.log(err); - res.render('courses/show', {course: course, errorMessage: err, authedUser: req.user}) + res.render('events/show', {event: event, errorMessage: err, authedUser: req.user}) }); } ); @@ -127,9 +127,9 @@ router.post('/:id/delete', isLoggedIn, (req, res) => { if (canEditEvents(req.user)) { - courseRepo.deleteCourse(req.params.id) + eventRepo.deleteEvent(req.params.id) .then(() => { - res.redirect('/courses'); + res.redirect('/events'); }) .catch(err => { console.log(err); diff --git a/routes/users.js b/routes/users.js index cd0546a..0b4105d 100644 --- a/routes/users.js +++ b/routes/users.js @@ -22,7 +22,7 @@ router.get('/signup', (req, res) => { }); router.post('/signup', passport.authenticate('local-signup', { - successRedirect: '/courses', + successRedirect: '/events', failureRedirect: '/users/signup', failureFlash: true })); @@ -38,7 +38,7 @@ router.get('/logout', (req, res) => { // https://stackoverflow.com/questions/13557256/passport-js-cant-set-headers-after-they-are-sent router.post('/login', passport.authenticate('local-login', { - successRedirect: '/courses', + successRedirect: '/events', failureRedirect: '/users/login', failureFlash: true } diff --git a/src/CourseRepo.js b/src/CourseRepo.js deleted file mode 100644 index be2cfb9..0000000 --- a/src/CourseRepo.js +++ /dev/null @@ -1,31 +0,0 @@ -const Course = require('../models/Course').Course; - -module.exports = { - getCourses() { - return Course.forge().orderBy('created_at', 'DESC').fetchAll({withRelated: ['createdBy']}); - }, - - createCourse(reqBody, creator) { - return new Course().save({ - title: reqBody.title, - description: reqBody.description, - created_by: creator - }); - }, - - getCourse(id) { - return Course.where('id', id).fetch(); - }, - - getCourseWithFullDetails(id) { - return Course.where('id', id).fetch({withRelated: ['instructors', 'createdBy']}); - }, - - updateCourse(id, course) { - return Course.where('id', id).save(course, {patch: true}); - }, - - deleteCourse(id) { - return Course.where('id', id).destroy(); - } -}; diff --git a/src/checkInRepository.js b/src/checkInRepository.js index 723073d..61f77a7 100644 --- a/src/checkInRepository.js +++ b/src/checkInRepository.js @@ -3,8 +3,8 @@ const userRepo = require('./userRepository'); module.exports = { - createCheckIn(user, course, cb) { - CheckIn.findOne({user: user.id, course: course.id}, (err, foundCheckIn) => { + createCheckIn(user, event, cb) { + CheckIn.findOne({user: user.id, event: event.get('id')}, (err, foundCheckIn) => { if (err) { const result = {err: err, res: foundCheckIn}; cb(result); @@ -19,7 +19,7 @@ module.exports = { console.log('has not checked in. checking in'); const newCheckIn = new CheckIn({ user: user, - course: course + event: event }); CheckIn.create(newCheckIn, (err, checkIn) => { if (err) { @@ -43,8 +43,8 @@ module.exports = { }); }, - getCheckInByUserIdAndCourseId(userId, courseId, cb) { - CheckIn.findOne({user: userId, course: courseId}, (err, checkIn) => { + getCheckInByUserIdAndEventId(userId, eventId, cb) { + CheckIn.findOne({user: userId, event: eventId}, (err, checkIn) => { const result = {err: err, res: checkIn}; cb(result); }); diff --git a/src/eventRepository.js b/src/eventRepository.js new file mode 100644 index 0000000..25efc64 --- /dev/null +++ b/src/eventRepository.js @@ -0,0 +1,31 @@ +const Event = require('../models/Event').Event; + +module.exports = { + getEvents() { + return Event.forge().orderBy('created_at', 'DESC').fetchAll({withRelated: ['createdBy']}); + }, + + createEvent(reqBody, creator) { + return new Event().save({ + title: reqBody.title, + description: reqBody.description, + created_by: creator + }); + }, + + getEvent(id) { + return Event.where('id', id).fetch(); + }, + + getEventWithFullDetails(id) { + return Event.where('id', id).fetch({withRelated: ['instructors', 'createdBy']}); + }, + + updateEvent(id, event) { + return Event.where('id', id).save(event, {patch: true}); + }, + + deleteEvent(id) { + return Event.where('id', id).destroy(); + } +}; diff --git a/views/courses/create.pug b/views/courses/create.pug deleted file mode 100644 index 409767d..0000000 --- a/views/courses/create.pug +++ /dev/null @@ -1,22 +0,0 @@ -extends ../layout - -block content - - div(class="container form") - div(class="row") - div(class="col-md-2") - div(class="col-md-8") - h2 Register a new course - - if canEdit - form(method="Post" action="/courses/create") - div(class="form-group") - label(for="title") Name - input(class="form-control" type="text" name="title" id="title") - label(for="description") Description - textarea(class="form-control" name="description" id="description") - input(class="btn btn-success" type="submit") - else - h5 You are not permitted to create courses. - p If this isn't right, please contact the LTC leadership on Slack - diff --git a/views/courses/index.pug b/views/courses/index.pug deleted file mode 100644 index 68ebdf6..0000000 --- a/views/courses/index.pug +++ /dev/null @@ -1,27 +0,0 @@ -extends ../layout - -block content - h2 - i.fa.fa-graduation-cap - | Courses - hr - - if authedUser && (authedUser.get('level') === 'instructor' || authedUser.get('level') === 'admin') - .text-right - a.btn.btn-primary(href='/courses/create') - i.fa.fa-plus - | New Course - - for course in courses - .card.my-3 - .card-block - h4.card-title= course.get('title') - h6.card-subtitle.mb-2.text-muted= `Created by ${course.related('createdBy').get('name') || 'unknown'} at ${course.get('createdAt') || 'unknown'}` - p.card-text= course.get('description') - a.card-link(href="/courses/" + course.get('id')) - button Details - a.card-link(href='#') - button Schedule - if authedUser && !checkedIn - form.course-index-checkin.card-link(method="Post" action="/courses/" + course.get('id') + "/checkin") - button(type="submit") Register diff --git a/views/courses/show.pug b/views/courses/show.pug deleted file mode 100644 index 8ac766b..0000000 --- a/views/courses/show.pug +++ /dev/null @@ -1,22 +0,0 @@ -extends ../layout - -block content - h1= course.get('title') - h6.course-subscript Posted by #{course.related('createdBy').get('name')} - if instructors && instructors.length > 0 - h6.course-subscript Instructors: - ul - each instructor, index in instructors.models - if index === 0 - li.course-instructor-list - a(href="/users/" + instructor.get('id'))= instructor.get('name') - else - li.course-instructor-list | - a(href="/users/" + instructor.get('id'))= instructor.get('name') - h6.course-subscript Checkins: #{course.get('countCheckIns')} - p= course.get('description') - - if authedUser && (authedUser.get('level') === 'instructor' || authedUser.get('level') === 'admin') - a(href="/courses/" + course.get('id') + "/edit") edit - form(method="Post" action="/courses/" + course.get('id') + "/delete") - button(type="submit") delete diff --git a/views/events/create.pug b/views/events/create.pug index 2c3d99e..baed145 100644 --- a/views/events/create.pug +++ b/views/events/create.pug @@ -17,7 +17,7 @@ block content div(class="dropdown") button(class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false") Select div(class="dropdown-menu" aria-labelledby="dropdownMenuButton") - a(class="dropdown-item" href="#") Course + a(class="dropdown-item" href="#") Event a(class="dropdown-item" href="#") Workshop a(class="dropdown-item" href="#") Study Group a(class="dropdown-item" href="#") Hack Night diff --git a/views/events/index.pug b/views/events/index.pug index a239cf7..bd4c642 100644 --- a/views/events/index.pug +++ b/views/events/index.pug @@ -2,22 +2,25 @@ extends ../layout block content h2 - i.fa.fa-graduation-cap - | Events + i.fa.fa-graduation-cap + | Events hr .text-right - a.btn.btn-primary(href='/events/create') - i.fa.fa-plus - | New Event + a.btn.btn-primary(href='/events/create') + i.fa.fa-plus + | New Event for event in events - .card.my-3 - .card-block - h4.card-title= event.title - h6.card-subtitle.mb-2.text-muted= `Created by ${event.createdBy || 'unknown'} at ${event.createdAt || 'unknown'}` - p.card-text= event.type - p.card-text= event.description - a.card-link(href="/events/" + event._id) Details - a.card-link(href='#') Schedule - a.card-link(href="/events/" + event._id + "/checkin") Register + .card.my-3 + .card-block + h4.card-title= event.get('title') + h6.card-subtitle.mb-2.text-muted= `Created by ${event.related('createdBy').get('name') || 'unknown'} at ${event.get('createdAt') || 'unknown'}` + p.card-text= event.get('description') + a.card-link(href = "/events/" + event.get('id')) + button Details + a.card-link(href='#') + button Schedule + if authedUser && !checkedIn + form.event-index-checkin.card-link(method="Post" action="/events/" + event.get('id') + "/checkin") + button(type="submit") Register diff --git a/views/events/show.pug b/views/events/show.pug index 11bdbf8..66c7328 100644 --- a/views/events/show.pug +++ b/views/events/show.pug @@ -1,9 +1,22 @@ extends ../layout block content - h1 Event Page - p= event + h1= event.get('title') + h6.event-subscript Posted by #{event.related('createdBy').get('name')} + if instructors && instructors.length > 0 + h6.event-subscript Instructors: + ul + each instructor, index in instructors.models + if index === 0 + li.event-instructor-list + a(href="/users/" + instructor.get('id'))= instructor.get('name') + else + li.event-instructor-list | + a(href="/users/" + instructor.get('id'))= instructor.get('name') + h6.event-subscript Checkins: #{event.get('countCheckIns')} + p= event.get('description') - a(href="/events/" + event._id + "/edit") edit - form(method="Post" action="/events/" + event._id + "/delete") - button(type="submit") delete + if authedUser && (authedUser.get('level') === 'instructor' || authedUser.get('level') === 'admin') + a(href="/events/" + event.get('id') + "/edit") edit + form(method="Post" action="/events/" + event.get('id') + "/delete") + button(type="submit") delete From 4579fa49c25db6ae0151a22a5dc81747a459e4bb Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Wed, 8 Nov 2017 17:26:57 +0900 Subject: [PATCH 51/81] All rendering seems to work. Now to try checkins --- config/bookshelf.js | 3 ++- src/checkInRepository.js | 54 ++++++++-------------------------------- src/eventRepository.js | 1 + views/events/create.pug | 44 ++++++++++++++++---------------- 4 files changed, 36 insertions(+), 66 deletions(-) diff --git a/config/bookshelf.js b/config/bookshelf.js index 3359c44..4e8199d 100644 --- a/config/bookshelf.js +++ b/config/bookshelf.js @@ -53,7 +53,8 @@ module.exports = { table.increments(); table.string('title'); table.string('description'); - table.string('created_by'); + table.string('type'); + table.integer('created_by'); table.timestamps(); }).createTableIfNotExists('check_in', (table) => { table.increments(); diff --git a/src/checkInRepository.js b/src/checkInRepository.js index 61f77a7..89fe9e8 100644 --- a/src/checkInRepository.js +++ b/src/checkInRepository.js @@ -1,52 +1,20 @@ -const CheckIn = require('../models/checkIn'); +const CheckIn = require('../models/checkIn').CheckIn; const userRepo = require('./userRepository'); module.exports = { - createCheckIn(user, event, cb) { - CheckIn.findOne({user: user.id, event: event.get('id')}, (err, foundCheckIn) => { - if (err) { - const result = {err: err, res: foundCheckIn}; - cb(result); - } else { // not checkin, let's checkin - - if (foundCheckIn !== null) { // checkin exists - console.log('already checked in'); - console.log(foundCheckIn); - const result = {err: 'Already checked in', res: foundCheckIn}; - cb(result); - } else { - console.log('has not checked in. checking in'); - const newCheckIn = new CheckIn({ - user: user, - event: event - }); - CheckIn.create(newCheckIn, (err, checkIn) => { - if (err) { - console.log(err); - const result = {err: err, res: checkIn}; - cb(result); - } else { - user.checkIns.push(checkIn); - userRepo.updateUser(user.id, { $push: {checkIns: checkIn} }, (result) => { - if(result) { - cb(checkIn); - } else { - const output = {err: 'Failed to update user with checkIn', res: result}; - cb(output); - } - }); - } - }); - } - } - }); + createCheckIn(user, event) { + return new CheckIn() + .save({ + user: user, + event: event + }); }, - getCheckInByUserIdAndEventId(userId, eventId, cb) { - CheckIn.findOne({user: userId, event: eventId}, (err, checkIn) => { - const result = {err: err, res: checkIn}; - cb(result); + getCheckInByUserIdAndEventId(user, event) { + return CheckIn.where({ + 'user': user, + 'event': event }); }, diff --git a/src/eventRepository.js b/src/eventRepository.js index 25efc64..369b8b8 100644 --- a/src/eventRepository.js +++ b/src/eventRepository.js @@ -9,6 +9,7 @@ module.exports = { return new Event().save({ title: reqBody.title, description: reqBody.description, + type: reqBody.type, created_by: creator }); }, diff --git a/views/events/create.pug b/views/events/create.pug index baed145..da7238c 100644 --- a/views/events/create.pug +++ b/views/events/create.pug @@ -2,28 +2,28 @@ extends ../layout block content - div(class="container form") - div(class="row") - div(class="col-md-2") - div(class="col-md-8") - h2 Register a new event + div(class="container form") + div(class="row") + div(class="col-md-2") + div(class="col-md-8") + h2 Register a new event - form(method="Post" action="/events/create") - div(class="form-group") - label(for="title") Name - input(class="form-control" type="text" name="title" id="title") - label(for="type") Type - input(type="hidden" name="type" id="type") - div(class="dropdown") - button(class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false") Select - div(class="dropdown-menu" aria-labelledby="dropdownMenuButton") - a(class="dropdown-item" href="#") Event - a(class="dropdown-item" href="#") Workshop - a(class="dropdown-item" href="#") Study Group - a(class="dropdown-item" href="#") Hack Night - a(class="dropdown-item" href="#") Special Event - label(for="description") Description - textarea(class="form-control" name="description" id="description") - input(class="btn btn-success" type="submit") + form(method="Post" action="/events/create") + div(class="form-group") + label(for="title") Name + input(class="form-control" type="text" name="title" id="title") + label(for="type") Type + input(type="hidden" name="type" id="type") + div(class="dropdown") + button(class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false") Select + div(class="dropdown-menu" aria-labelledby="dropdownMenuButton") + a(class="dropdown-item" href="#") Event + a(class="dropdown-item" href="#") Workshop + a(class="dropdown-item" href="#") Study Group + a(class="dropdown-item" href="#") Hack Night + a(class="dropdown-item" href="#") Special Event + label(for="description") Description + textarea(class="form-control" name="description" id="description") + input(class="btn btn-success" type="submit") From 2db82aaa77129254cd435354b32115c493d37112 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Wed, 8 Nov 2017 18:35:42 +0900 Subject: [PATCH 52/81] [BROKEN] I hate async. Trouble getting countCheckIns to work --- models/Event.js | 10 ++++------ models/User.js | 12 ++++-------- models/checkIn.js | 2 +- routes/events.js | 23 ++++++++++++----------- src/checkInRepository.js | 9 +++++---- views/events/show.pug | 39 +++++++++++++++++++++------------------ 6 files changed, 47 insertions(+), 48 deletions(-) diff --git a/models/Event.js b/models/Event.js index 4e33c69..7dcee05 100644 --- a/models/Event.js +++ b/models/Event.js @@ -1,4 +1,5 @@ const bookshelf = require('../config/bookshelf').bookshelf; +const CheckIn = require('./checkIn').CheckIn; const moment = require('moment'); const Event = bookshelf.Model.extend({ @@ -21,12 +22,9 @@ const Event = bookshelf.Model.extend({ virtuals: { countCheckIns: function () { - const checkIns = this.get('checkIns'); - if (checkIns) { - return checkIns.count(); - } else { - return 0; - } + return CheckIn.Model.query() + .where('user_id', this.get('id')) + .count(); }, createdAt: { diff --git a/models/User.js b/models/User.js index 8e0464a..0c30cd1 100644 --- a/models/User.js +++ b/models/User.js @@ -1,7 +1,7 @@ const bookshelf = require('../config/bookshelf').bookshelf; const bcrypt = require('bcrypt'); const SALT_WORK_FACTOR = 10; -const CheckIn = require('./checkIn'); +const CheckIns = require('./checkIn').CheckIns; // TODO: Add validations const User = bookshelf.Model.extend({ @@ -27,13 +27,9 @@ const User = bookshelf.Model.extend({ }, virtuals: { - countCheckIns: function () { - const checkIns = this.get('checkIns'); - if (checkIns) { - return checkIns.count(); - } else { - return 0; - } + countCheckIns: async function () { + return await this.related('checkIns') + .count(); }, createdAt: { get: function () { diff --git a/models/checkIn.js b/models/checkIn.js index 2a00ff9..843d036 100644 --- a/models/checkIn.js +++ b/models/checkIn.js @@ -39,6 +39,6 @@ const CheckIns = bookshelf.Collection.extend({ }); module.exports = { - CheckIn: CheckIn, + CheckIn: bookshelf.model('CheckIn', CheckIn), CheckIns: CheckIns }; diff --git a/routes/events.js b/routes/events.js index 2ff2ccd..cf4de58 100644 --- a/routes/events.js +++ b/routes/events.js @@ -105,20 +105,21 @@ router.post('/:id', router.post('/:id/checkin', isLoggedIn, (req, res) => { - const event = eventRepo.getEvent(req.params.id) - .then(event => event) - .catch(err => { - console.log(err); - res.render('events/show', {event: null, errorMessage: err, authedUser: req.user}) - }); - - checkInRepo.createCheckIn(req.user, event) - .then(() => { - res.render('events/show', {event: event, checkedIn: true, authedUser: req.user}); + eventRepo.getEvent(req.params.id) + .then(event => { + checkInRepo.createCheckIn(req.user, event) + .then(checkIn => { + //console.log('checkIn: ', checkIn); + res.render('events/show', {event: event, checkedIn: true, authedUser: req.user}); + }) + .catch(err => { + console.log(err); + res.render('events/show', {event: event, errorMessage: err, authedUser: req.user}) + }); }) .catch(err => { console.log(err); - res.render('events/show', {event: event, errorMessage: err, authedUser: req.user}) + res.render('events/show', {event: null, errorMessage: err, authedUser: req.user}) }); } ); diff --git a/src/checkInRepository.js b/src/checkInRepository.js index 89fe9e8..ba701d6 100644 --- a/src/checkInRepository.js +++ b/src/checkInRepository.js @@ -1,13 +1,14 @@ const CheckIn = require('../models/checkIn').CheckIn; -const userRepo = require('./userRepository'); module.exports = { createCheckIn(user, event) { + console.log('user:', user); + console.log('event:', event); return new CheckIn() .save({ - user: user, - event: event + user_id: user.get('id'), + event_id: event.get('id') }); }, @@ -15,7 +16,7 @@ module.exports = { return CheckIn.where({ 'user': user, 'event': event - }); + }).fetch(); }, }; \ No newline at end of file diff --git a/views/events/show.pug b/views/events/show.pug index 66c7328..e7b0848 100644 --- a/views/events/show.pug +++ b/views/events/show.pug @@ -1,22 +1,25 @@ extends ../layout block content - h1= event.get('title') - h6.event-subscript Posted by #{event.related('createdBy').get('name')} - if instructors && instructors.length > 0 - h6.event-subscript Instructors: - ul - each instructor, index in instructors.models - if index === 0 - li.event-instructor-list - a(href="/users/" + instructor.get('id'))= instructor.get('name') - else - li.event-instructor-list | - a(href="/users/" + instructor.get('id'))= instructor.get('name') - h6.event-subscript Checkins: #{event.get('countCheckIns')} - p= event.get('description') + if event + h1= event.get('title') + h6.event-subscript Posted by #{event.related('createdBy').get('name')} + if instructors && instructors.length > 0 + h6.event-subscript Instructors: + ul + each instructor, index in instructors.models + if index === 0 + li.event-instructor-list + a(href="/users/" + instructor.get('id'))= instructor.get('name') + else + li.event-instructor-list | + a(href="/users/" + instructor.get('id'))= instructor.get('name') + h6.event-subscript Checkins: #{event.get('countCheckIns')} + p= event.get('description') - if authedUser && (authedUser.get('level') === 'instructor' || authedUser.get('level') === 'admin') - a(href="/events/" + event.get('id') + "/edit") edit - form(method="Post" action="/events/" + event.get('id') + "/delete") - button(type="submit") delete + if authedUser && (authedUser.get('level') === 'instructor' || authedUser.get('level') === 'admin') + a(href="/events/" + event.get('id') + "/edit") edit + form(method="Post" action="/events/" + event.get('id') + "/delete") + button(type="submit") delete + else + h1 Unable to find event From 4de4580461229737534500673513b46824d5c0c5 Mon Sep 17 00:00:00 2001 From: Hazelton Jacob Date: Wed, 8 Nov 2017 19:58:18 +0900 Subject: [PATCH 53/81] Added request badge page on individual user profile --- public/javascripts/shared.js | 6 +++++ routes/users.js | 4 ++++ views/users/badge.pug | 44 ++++++++++++++++++++++++++++++++++++ views/users/show.pug | 2 +- 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 views/users/badge.pug diff --git a/public/javascripts/shared.js b/public/javascripts/shared.js index ada1758..e623089 100644 --- a/public/javascripts/shared.js +++ b/public/javascripts/shared.js @@ -14,4 +14,10 @@ document.addEventListener("DOMContentLoaded", function() { $("#dropdownMenuButton").html(e.target.innerHTML) $("#type").val(e.target.innerHTML) }); + + $(".dropdown-menu").click((e) => { + $("#exampleButton").html(e.target.innerHTML) + $("#type").val(e.target.innerHTML) + }); + }); diff --git a/routes/users.js b/routes/users.js index f7b88cb..5ea1bfc 100644 --- a/routes/users.js +++ b/routes/users.js @@ -20,6 +20,10 @@ router.get('/signup', (req, res) => { res.render('users/signup'); }); +router.get('/badge', (req, res) => { + res.render('users/badge'); +}) + router.post('/signup', (req, res) => { console.log('signup...req.body') console.log(req.body) diff --git a/views/users/badge.pug b/views/users/badge.pug new file mode 100644 index 0000000..5a5649b --- /dev/null +++ b/views/users/badge.pug @@ -0,0 +1,44 @@ +extends ../layout + +block content + + .container + .row + .col-sm-6 + h1 Request a Badge | + .span.badge.badge-pill.badge-default#exampleButton Example + + + form(method="Post" action="users/badge") + div(class="form-group") + label(for="type") Badge Type + input(type="hidden" name="type" id="type") + div(class="dropdown") + button(class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false") Select + div(class="dropdown-menu" aria-labelledby="dropdownMenuButtonUser") + a(class="dropdown-item" href="#") Angular + a(class="dropdown-item" href="#") Back-End + a(class="dropdown-item" href="#") C + a(class="dropdown-item" href="#") C# + a(class="dropdown-item" href="#") C++ + a(class="dropdown-item" href="#") C(Objective) + a(class="dropdown-item" href="#") CSS + a(class="dropdown-item" href="#") Front-End + a(class="dropdown-item" href="#") Full-Stack + a(class="dropdown-item" href="#") Git + a(class="dropdown-item" href="#") Full-Stack + a(class="dropdown-item" href="#") Java + a(class="dropdown-item" href="#") JavaScript + a(class="dropdown-item" href="#") Node.js + a(class="dropdown-item" href="#") React.js + a(class="dropdown-item" href="#") PHP + a(class="dropdown-item" href="#") Python + a(class="dropdown-item" href="#") Ruby + a(class="dropdown-item" href="#") Ruby on Rails + a(class="dropdown-item" href="#") SaSS + a(class="dropdown-item" href="#") Scala + a(class="dropdown-item" href="#") Shell + a(class="dropdown-item" href="#") SQL + a(class="dropdown-item" href="#") Swift + label(for="info") Additional Information + textarea(class="form-control" name="info" id="info") diff --git a/views/users/show.pug b/views/users/show.pug index f783ce8..c55fb98 100644 --- a/views/users/show.pug +++ b/views/users/show.pug @@ -29,5 +29,5 @@ block content td= user.description hr .text-right - a.btn.btn-primary(href='#') + a.btn.btn-primary(href='badge') | Request Badge From e5cd5b7ec265db08309d3dba5ecc6794e3aed7e6 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Thu, 9 Nov 2017 11:02:27 +0900 Subject: [PATCH 54/81] Fixed checkin counts on events and users --- models/Event.js | 4 +--- models/User.js | 10 ++++------ routes/events.js | 5 +---- src/eventRepository.js | 4 ++-- 4 files changed, 8 insertions(+), 15 deletions(-) diff --git a/models/Event.js b/models/Event.js index 7dcee05..738b8ff 100644 --- a/models/Event.js +++ b/models/Event.js @@ -22,9 +22,7 @@ const Event = bookshelf.Model.extend({ virtuals: { countCheckIns: function () { - return CheckIn.Model.query() - .where('user_id', this.get('id')) - .count(); + return this.related('checkIns').length; }, createdAt: { diff --git a/models/User.js b/models/User.js index 0c30cd1..214e7a1 100644 --- a/models/User.js +++ b/models/User.js @@ -1,7 +1,6 @@ const bookshelf = require('../config/bookshelf').bookshelf; const bcrypt = require('bcrypt'); const SALT_WORK_FACTOR = 10; -const CheckIns = require('./checkIn').CheckIns; // TODO: Add validations const User = bookshelf.Model.extend({ @@ -27,9 +26,9 @@ const User = bookshelf.Model.extend({ }, virtuals: { - countCheckIns: async function () { - return await this.related('checkIns') - .count(); + countCheckIns: function () { + // this property exists due our query in userRepository + return this.get('check_in_count'); }, createdAt: { get: function () { @@ -69,8 +68,7 @@ const User = bookshelf.Model.extend({ }, comparePassword: function (candidatePassword) { - const result = bcrypt.compare(candidatePassword, this.get('password')); - return result; + return bcrypt.compare(candidatePassword, this.get('password')); } }); diff --git a/routes/events.js b/routes/events.js index cf4de58..b2688cd 100644 --- a/routes/events.js +++ b/routes/events.js @@ -47,11 +47,8 @@ router.post('/create', router.get('/:id', (req, res) => { eventRepo.getEventWithFullDetails(req.params.id) .then(event => { - console.log('event.instructors:', event.instructors()); event.instructors().fetch() .then(instructors => { - console.log('after promise'); - console.log(instructors); res.render('events/show', {event: event, instructors: instructors, authedUser: req.user}); }) .catch(err => { @@ -108,7 +105,7 @@ router.post('/:id/checkin', eventRepo.getEvent(req.params.id) .then(event => { checkInRepo.createCheckIn(req.user, event) - .then(checkIn => { + .then(() => { //console.log('checkIn: ', checkIn); res.render('events/show', {event: event, checkedIn: true, authedUser: req.user}); }) diff --git a/src/eventRepository.js b/src/eventRepository.js index 369b8b8..1dc7f48 100644 --- a/src/eventRepository.js +++ b/src/eventRepository.js @@ -2,7 +2,7 @@ const Event = require('../models/Event').Event; module.exports = { getEvents() { - return Event.forge().orderBy('created_at', 'DESC').fetchAll({withRelated: ['createdBy']}); + return Event.forge().orderBy('created_at', 'DESC').fetchAll({withRelated: ['createdBy', 'checkIns']}); }, createEvent(reqBody, creator) { @@ -19,7 +19,7 @@ module.exports = { }, getEventWithFullDetails(id) { - return Event.where('id', id).fetch({withRelated: ['instructors', 'createdBy']}); + return Event.where('id', id).fetch({withRelated: ['instructors', 'createdBy', 'checkIns']}); }, updateEvent(id, event) { From 2bca14f05867f176f360d3e3c741155b6f6e8994 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Thu, 9 Nov 2017 13:58:18 +0900 Subject: [PATCH 55/81] Trying to configure bookshelf for testing, but the helper isn't running --- test/event/modelCreate.test.js | 101 ++++++++++++++++----------------- test/test_helper.test.js | 19 ++++++- test/user/modelCreate.test.js | 10 ++-- 3 files changed, 74 insertions(+), 56 deletions(-) diff --git a/test/event/modelCreate.test.js b/test/event/modelCreate.test.js index 21eb002..a79acef 100644 --- a/test/event/modelCreate.test.js +++ b/test/event/modelCreate.test.js @@ -1,62 +1,61 @@ const Event = require('../../models/Event'); const User = require('../../models/User'); -const config = require('../config.test.js'); const assert = require('assert'); -const mongoose = require('mongoose'); describe('Event modelCreate', () => { - let sql; - - beforeEach((done) => { - sql = new Event({title: 'sql'}) - sql.save() - .then(() => done()); - }); - afterEach((done) => { - User.collection.drop(); - Event.collection.drop(); - done(); - }); - - it('Should create a new Event record', (done) => { - assert(!sql.isNew); - done(); - }); - - it('Should be able to set Event Description', (done) => { - sql.description = "beginner sql"; - sql.save() - .then((result) => { - assert(result.description === "beginner sql"); + + let sql; + + beforeEach((done) => { + sql = new Event({title: 'sql'}) + sql.save() + .then(() => done()); + }); + afterEach((done) => { + User.collection.drop(); + Event.collection.drop(); done(); - }) - }); - - it('Should be able to set Event Tags', (done) => { - sql.tags = ['sql', 'beginner'] - sql.save() - .then(() => Event.findOne({title: 'sql'})) - .then((result) => { - assert(result.tags[0] === 'sql'); - assert(result.tags[1] === 'beginner'); + }); + + it('Should create a new Event record', (done) => { + assert(!sql.isNew); done(); - }); - }); - - it('Should set CreatedAt timestamp by default', (done) => { - assert(sql.createdAt instanceof Date); - done(); - }); - - it('Should be able to set CreatedBy', (done) => { - const joe = new User({}); - sql.instructors.push({_id: joe._id}) - sql.save() - .then(() => Event.findOne({title: 'sql'})) - .then((result) => { - assert(String(result.instructors) === String(joe._id)); + }); + + it('Should be able to set Event Description', (done) => { + sql.description = "beginner sql"; + sql.save() + .then((result) => { + assert(result.description === "beginner sql"); + done(); + }) + }); + + it('Should be able to set Event Tags', (done) => { + sql.tags = ['sql', 'beginner'] + sql.save() + .then(() => Event.findOne({title: 'sql'})) + .then((result) => { + assert(result.tags[0] === 'sql'); + assert(result.tags[1] === 'beginner'); + done(); + }); + }); + + it('Should set CreatedAt timestamp by default', (done) => { + assert(sql.createdAt instanceof Date); done(); }); - }); + + it('Should be able to set CreatedBy', (done) => { + const joe = new User({}); + sql.instructors.push({_id: joe._id}) + sql.save() + .then(() => Event.findOne({title: 'sql'})) + .then((result) => { + assert(String(result.instructors) === String(joe._id)); + done(); + }); + }); }); diff --git a/test/test_helper.test.js b/test/test_helper.test.js index 6f8ff6a..1b4604a 100644 --- a/test/test_helper.test.js +++ b/test/test_helper.test.js @@ -1,4 +1,21 @@ const bookshelfSetup = require('../config/bookshelf'); +console.log('before'); bookshelfSetup.configureBookshelf('dev'); -bookshelfSetup.initializeDevDb(); \ No newline at end of file +bookshelfSetup.initializeDevDb(); + +const CheckIns = require('../models/checkIn').CheckIns; +const Users = require('../models/User').Users; +const Events = require('../models/Event').Events; + +beforeEach(done => { + console.log('beforeEach'); + CheckIns.destroy() + .then(() => { + return Users.destroy(); + }) + .then(() => { + Events.destroy(); + done(); + }) +}); \ No newline at end of file diff --git a/test/user/modelCreate.test.js b/test/user/modelCreate.test.js index 2d04869..7303cb9 100644 --- a/test/user/modelCreate.test.js +++ b/test/user/modelCreate.test.js @@ -1,8 +1,10 @@ -const User = require('../../models/User'); -const CheckIn = require('../../models/checkIn'); -const assert = require('assert'); - describe('User modelCreate', () => { + const bookshelf = require('../../config/bookshelf').bookshelf; + console.log('bookshelf:', bookshelf); + const User = require('../../models/User'); + const CheckIn = require('../../models/checkIn'); + const assert = require('assert'); + let joe; beforeEach((done) => { From 6ca9946dfe6a608eba9a7280f0d4a99a1798a626 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Thu, 9 Nov 2017 15:09:35 +0900 Subject: [PATCH 56/81] Required helper manually in each test file. Now to fix tests --- test/event/modelCreate.test.js | 1 + test/event/modelDestroy.test.js | 43 ++++++----- test/event/modelRead.test.js | 21 +++--- test/event/modelUpdate.test.js | 111 ++++++++++++++--------------- test/test_helper.test.js | 18 +++-- test/user/modelCreate.test.js | 3 +- test/user/modelDestroy.test.js | 1 + test/user/modelRead.test.js | 1 + test/user/modelUpdate.test.js | 1 + test/user/modelValidations.test.js | 1 + test/user/repo.test.js | 1 + 11 files changed, 101 insertions(+), 101 deletions(-) diff --git a/test/event/modelCreate.test.js b/test/event/modelCreate.test.js index a79acef..2dd339d 100644 --- a/test/event/modelCreate.test.js +++ b/test/event/modelCreate.test.js @@ -1,3 +1,4 @@ +require('../test_helper.test'); const Event = require('../../models/Event'); const User = require('../../models/User'); const assert = require('assert'); diff --git a/test/event/modelDestroy.test.js b/test/event/modelDestroy.test.js index f13b090..beef2ef 100644 --- a/test/event/modelDestroy.test.js +++ b/test/event/modelDestroy.test.js @@ -1,28 +1,27 @@ +require('../test_helper.test'); const Event = require('../../models/Event'); -const config = require('../config.test.js'); const assert = require('assert'); -const mongoose = require('mongoose'); describe('Event modelDestroy', () => { - beforeEach((done) => { - const sql = new Event({title: 'sql'}) - sql.save() - .then(() => done()); - }); - afterEach((done) => { - Event.collection.drop(); - done(); - }); + beforeEach((done) => { + const sql = new Event({title: 'sql'}) + sql.save() + .then(() => done()); + }); + afterEach((done) => { + Event.collection.drop(); + done(); + }); - it('Should destroy event record', (done) => { - const ruby = new Event({title: 'ruby'}) - ruby.save() - .then(() => Event.remove({title: 'sql'})) - .then(() => Event.find({})) - .then((results) => { - assert(results.length === 1); - assert(results[0].title === 'ruby'); - done() - }); - }); + it('Should destroy event record', (done) => { + const ruby = new Event({title: 'ruby'}) + ruby.save() + .then(() => Event.remove({title: 'sql'})) + .then(() => Event.find({})) + .then((results) => { + assert(results.length === 1); + assert(results[0].title === 'ruby'); + done() + }); + }); }); diff --git a/test/event/modelRead.test.js b/test/event/modelRead.test.js index 693854c..f84bec8 100644 --- a/test/event/modelRead.test.js +++ b/test/event/modelRead.test.js @@ -1,18 +1,17 @@ +require('../test_helper.test'); const Event = require('../../models/Event'); -const config = require('../config.test.js'); const assert = require('assert'); -const mongoose = require('mongoose'); describe('Event modelRead', () => { - it('Should find a Event by _id', (done) => { - const sql = new Event({title: 'sql'}); - sql.save() - .then(() => Event.findOne({_id: sql.id})) - .then((result) => { - assert(String(result._id) === String(sql.id)); - done() - }); - }); + it('Should find a Event by _id', (done) => { + const sql = new Event({title: 'sql'}); + sql.save() + .then(() => Event.findOne({_id: sql.id})) + .then((result) => { + assert(String(result._id) === String(sql.id)); + done() + }); + }); }); diff --git a/test/event/modelUpdate.test.js b/test/event/modelUpdate.test.js index 5024df7..7ea7e53 100644 --- a/test/event/modelUpdate.test.js +++ b/test/event/modelUpdate.test.js @@ -1,69 +1,68 @@ +require('../test_helper.test'); const Event = require('../../models/Event'); const User = require('../../models/User'); -const config = require('../config.test.js'); const assert = require('assert'); -const mongoose = require('mongoose'); describe('Event modelUpdate', () => { - let sql; + let sql; - beforeEach((done) => { - const joe = new User({}); - sql = new Event({ - title: 'sql', - description: 'beginner sql', - tags: ['beginner', 'sql'], - instructors: [{_id: joe._id}] + beforeEach((done) => { + const joe = new User({}); + sql = new Event({ + title: 'sql', + description: 'beginner sql', + tags: ['beginner', 'sql'], + instructors: [{_id: joe._id}] + }); + sql.save() + .then(() => done()); }); - sql.save() - .then(() => done()); - }); - afterEach((done) => { - Event.collection.drop(); - User.collection.drop(); - done(); - }); - - it('Should update Title', (done) => { - sql.title = 'ruby'; - sql.save() - .then(() => Event.findOne({_id: sql._id})) - .then((result) => { - assert(result.title === 'ruby'); + afterEach((done) => { + Event.collection.drop(); + User.collection.drop(); done(); - }); - }); + }); - it('Should update Description', (done) => { - sql.description = 'beginner ruby'; - sql.save() - .then(() => Event.findOne({_id: sql._id})) - .then((result) => { - assert(result.description === 'beginner ruby'); - done(); - }); - }); + it('Should update Title', (done) => { + sql.title = 'ruby'; + sql.save() + .then(() => Event.findOne({_id: sql._id})) + .then((result) => { + assert(result.title === 'ruby'); + done(); + }); + }); - it('Should update Tags', (done) => { - sql.tags = ['beginner', 'ruby'] - sql.save() - .then(() => Event.findOne({_id: sql._id})) - .then((result) => { - assert(result.tags[0] === 'beginner'); - assert(result.tags[1] === 'ruby'); - done(); - }); - }); + it('Should update Description', (done) => { + sql.description = 'beginner ruby'; + sql.save() + .then(() => Event.findOne({_id: sql._id})) + .then((result) => { + assert(result.description === 'beginner ruby'); + done(); + }); + }); - it('Should update Instructors', (done) => { - const jane = new User({}); - sql.instructors = {_id: jane._id}; - sql.save() - .then(() => Event.findOne({_id: sql._id})) - .then((result) => { - assert(String(result.instructors[0]) === String(jane._id)); - done(); - }); - }); + it('Should update Tags', (done) => { + sql.tags = ['beginner', 'ruby'] + sql.save() + .then(() => Event.findOne({_id: sql._id})) + .then((result) => { + assert(result.tags[0] === 'beginner'); + assert(result.tags[1] === 'ruby'); + done(); + }); + }); + + it('Should update Instructors', (done) => { + const jane = new User({}); + sql.instructors = {_id: jane._id}; + sql.save() + .then(() => Event.findOne({_id: sql._id})) + .then((result) => { + assert(String(result.instructors[0]) === String(jane._id)); + done(); + }); + }); }); diff --git a/test/test_helper.test.js b/test/test_helper.test.js index 1b4604a..0ca35d1 100644 --- a/test/test_helper.test.js +++ b/test/test_helper.test.js @@ -1,21 +1,19 @@ const bookshelfSetup = require('../config/bookshelf'); -console.log('before'); bookshelfSetup.configureBookshelf('dev'); bookshelfSetup.initializeDevDb(); -const CheckIns = require('../models/checkIn').CheckIns; -const Users = require('../models/User').Users; -const Events = require('../models/Event').Events; - beforeEach(done => { - console.log('beforeEach'); - CheckIns.destroy() + const knex = bookshelfSetup.knex; + knex('check_in').truncate() .then(() => { - return Users.destroy(); + knex('event_instructor').truncate(); }) .then(() => { - Events.destroy(); - done(); + knex('event').truncate(); }) + .then(() => { + knex('user').truncate(); + done(); + }); }); \ No newline at end of file diff --git a/test/user/modelCreate.test.js b/test/user/modelCreate.test.js index 7303cb9..f22b349 100644 --- a/test/user/modelCreate.test.js +++ b/test/user/modelCreate.test.js @@ -1,6 +1,5 @@ +require('../test_helper.test'); describe('User modelCreate', () => { - const bookshelf = require('../../config/bookshelf').bookshelf; - console.log('bookshelf:', bookshelf); const User = require('../../models/User'); const CheckIn = require('../../models/checkIn'); const assert = require('assert'); diff --git a/test/user/modelDestroy.test.js b/test/user/modelDestroy.test.js index 379063d..68bf09f 100644 --- a/test/user/modelDestroy.test.js +++ b/test/user/modelDestroy.test.js @@ -1,3 +1,4 @@ +require('../test_helper.test'); const User = require('../../models/User'); const Event = require('../../models/Event'); const assert = require('assert'); diff --git a/test/user/modelRead.test.js b/test/user/modelRead.test.js index 342dd7c..b0c2066 100644 --- a/test/user/modelRead.test.js +++ b/test/user/modelRead.test.js @@ -1,3 +1,4 @@ +require('../test_helper.test'); const User = require('../../models/User'); const assert = require('assert'); diff --git a/test/user/modelUpdate.test.js b/test/user/modelUpdate.test.js index 7cb4c59..19bfd76 100644 --- a/test/user/modelUpdate.test.js +++ b/test/user/modelUpdate.test.js @@ -1,3 +1,4 @@ +require('../test_helper.test'); const User = require('../../models/User'); const CheckIn = require('../../models/checkIn'); const assert = require('assert'); diff --git a/test/user/modelValidations.test.js b/test/user/modelValidations.test.js index 5da443c..16f1223 100644 --- a/test/user/modelValidations.test.js +++ b/test/user/modelValidations.test.js @@ -1,3 +1,4 @@ +require('../test_helper.test'); const User = require('../../models/User'); const assert = require('assert'); diff --git a/test/user/repo.test.js b/test/user/repo.test.js index 81e59d9..e6a63f9 100644 --- a/test/user/repo.test.js +++ b/test/user/repo.test.js @@ -1,3 +1,4 @@ +require('../test_helper.test'); const Repo = require('../../src/userRepository'); const User = require('../../models/User'); const chai = require('chai'); From f21862ac87f018a18d484cdabc88a94d7b807e93 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Thu, 9 Nov 2017 16:20:09 +0900 Subject: [PATCH 57/81] Tests run properly but most are failing --- test/event/modelCreate.test.js | 70 ++++++++++++++--------- test/event/modelDestroy.test.js | 24 ++++---- test/event/modelRead.test.js | 15 ++--- test/event/modelUpdate.test.js | 75 +++++++++++------------- test/event/modelValidations.test.js | 88 +++++++++++++++-------------- test/test_helper.test.js | 2 + test/user/modelCreate.test.js | 61 ++++++++++---------- test/user/modelDestroy.test.js | 23 ++++---- test/user/modelRead.test.js | 10 ++-- test/user/modelUpdate.test.js | 82 ++++++++++++++++++--------- test/user/modelValidations.test.js | 3 + test/user/repo.test.js | 31 +++++----- 12 files changed, 269 insertions(+), 215 deletions(-) diff --git a/test/event/modelCreate.test.js b/test/event/modelCreate.test.js index 2dd339d..29d038d 100644 --- a/test/event/modelCreate.test.js +++ b/test/event/modelCreate.test.js @@ -1,61 +1,77 @@ require('../test_helper.test'); -const Event = require('../../models/Event'); -const User = require('../../models/User'); +const knex = require('../../config/bookshelf').knex; +const Event = require('../../models/Event').Event; +const User = require('../../models/User').User; const assert = require('assert'); describe('Event modelCreate', () => { - let sql; + let baseEvent; beforeEach((done) => { - sql = new Event({title: 'sql'}) - sql.save() - .then(() => done()); + baseEvent = new Event({ + title: 'Test Event', + description: 'the best event evar', + type: 'Workshop', + created_by: '1' + }); + + baseEvent.save().then(() => done()).catch(err => done(err)); }); + afterEach((done) => { - User.collection.drop(); - Event.collection.drop(); - done(); + knex('user').truncate() + .then(() => knex('event').truncate()) + .then(() => done()) + .catch(err => done(err)); }); it('Should create a new Event record', (done) => { - assert(!sql.isNew); + assert(!baseEvent.isNew); done(); }); it('Should be able to set Event Description', (done) => { - sql.description = "beginner sql"; - sql.save() - .then((result) => { + baseEvent.description = "beginner sql"; + baseEvent.save() + .then(result => { assert(result.description === "beginner sql"); done(); }) + .catch(err => { + done(err); + }); }); - it('Should be able to set Event Tags', (done) => { - sql.tags = ['sql', 'beginner'] - sql.save() - .then(() => Event.findOne({title: 'sql'})) - .then((result) => { - assert(result.tags[0] === 'sql'); - assert(result.tags[1] === 'beginner'); + it('Should be able to set Event Type', (done) => { + baseEvent.type = 'Workshop'; + baseEvent.save() + .then(() => Event.where({title: 'Test Event'}).fetch()) + .then(result => { + assert(result.type === 'Workshop'); done(); + }) + .catch(err => { + done(err); }); }); it('Should set CreatedAt timestamp by default', (done) => { - assert(sql.createdAt instanceof Date); + assert(baseEvent.createdAt instanceof Date); done(); }); it('Should be able to set CreatedBy', (done) => { - const joe = new User({}); - sql.instructors.push({_id: joe._id}) - sql.save() - .then(() => Event.findOne({title: 'sql'})) - .then((result) => { - assert(String(result.instructors) === String(joe._id)); + const joe = new User(); + baseEvent.instructors.push({id: joe.id}) + baseEvent.save() + .then(() => Event.where({title: 'Test Event'}).fetch()) + .then(result => { + assert(String(result.instructors) === String(joe.id)); done(); + }) + .catch(err => { + done(err); }); }); diff --git a/test/event/modelDestroy.test.js b/test/event/modelDestroy.test.js index beef2ef..fd64ed8 100644 --- a/test/event/modelDestroy.test.js +++ b/test/event/modelDestroy.test.js @@ -1,27 +1,31 @@ require('../test_helper.test'); -const Event = require('../../models/Event'); +const knex = require('../../config/bookshelf').knex; +const Event = require('../../models/Event').Event; const assert = require('assert'); describe('Event modelDestroy', () => { beforeEach((done) => { - const sql = new Event({title: 'sql'}) - sql.save() - .then(() => done()); + const baseEvent = new Event({title: 'Test Event'}); + baseEvent.save() + .then(() => done()) + .catch(err => done(err)); }); afterEach((done) => { - Event.collection.drop(); - done(); + knex('event').truncate() + .then(() => done()) + .catch(err => done(err)); }); it('Should destroy event record', (done) => { - const ruby = new Event({title: 'ruby'}) + const ruby = new Event({title: 'ruby'}); ruby.save() - .then(() => Event.remove({title: 'sql'})) - .then(() => Event.find({})) + .then(Event.remove({title: 'Test Event'})) + .then(Event.forge().fetchAll()) .then((results) => { assert(results.length === 1); assert(results[0].title === 'ruby'); done() - }); + }) + .catch(err => done(err)); }); }); diff --git a/test/event/modelRead.test.js b/test/event/modelRead.test.js index f84bec8..dac6c2d 100644 --- a/test/event/modelRead.test.js +++ b/test/event/modelRead.test.js @@ -1,17 +1,18 @@ require('../test_helper.test'); -const Event = require('../../models/Event'); +const Event = require('../../models/Event').Event; const assert = require('assert'); describe('Event modelRead', () => { it('Should find a Event by _id', (done) => { - const sql = new Event({title: 'sql'}); - sql.save() - .then(() => Event.findOne({_id: sql.id})) - .then((result) => { - assert(String(result._id) === String(sql.id)); + const baseEvent = new Event({title: 'Test Event'}); + baseEvent.save() + .then(() => Event.where({id: baseEvent.id}).fetch()) + .then(result => { + assert(result.id === baseEvent.id); done() - }); + }) + .catch(err => done(err)); }); }); diff --git a/test/event/modelUpdate.test.js b/test/event/modelUpdate.test.js index 7ea7e53..780d5bd 100644 --- a/test/event/modelUpdate.test.js +++ b/test/event/modelUpdate.test.js @@ -1,68 +1,59 @@ require('../test_helper.test'); -const Event = require('../../models/Event'); -const User = require('../../models/User'); +const knex = require('../../config/bookshelf').knex; +const Event = require('../../models/Event').Event; const assert = require('assert'); describe('Event modelUpdate', () => { - let sql; + let baseEvent; beforeEach((done) => { - const joe = new User({}); - sql = new Event({ - title: 'sql', + baseEvent = new Event({ + title: 'Test Event', description: 'beginner sql', - tags: ['beginner', 'sql'], - instructors: [{_id: joe._id}] + type: 'Workshop' }); - sql.save() - .then(() => done()); + baseEvent.save() + .then(() => done()) + .catch(err => done(err)); }); afterEach((done) => { - Event.collection.drop(); - User.collection.drop(); - done(); + knex('event').truncate() + .then(() => knex('user').truncate()) + .then(() => done()) + .catch(err => done(err)); }); it('Should update Title', (done) => { - sql.title = 'ruby'; - sql.save() - .then(() => Event.findOne({_id: sql._id})) - .then((result) => { + baseEvent.title = 'ruby'; + baseEvent.save() + .then(() => Event.where({id: baseEvent.id}).fetch()) + .then(result => { assert(result.title === 'ruby'); done(); - }); + }) + .catch(err => done(err)); }); it('Should update Description', (done) => { - sql.description = 'beginner ruby'; - sql.save() - .then(() => Event.findOne({_id: sql._id})) - .then((result) => { + baseEvent.description = 'beginner ruby'; + baseEvent.save() + .then(() => Event.where({id: baseEvent.id}).fetch()) + .then(result => { assert(result.description === 'beginner ruby'); done(); - }); + }) + .catch(err => done(err)); }); - it('Should update Tags', (done) => { - sql.tags = ['beginner', 'ruby'] - sql.save() - .then(() => Event.findOne({_id: sql._id})) - .then((result) => { - assert(result.tags[0] === 'beginner'); - assert(result.tags[1] === 'ruby'); + it('Should update Type', (done) => { + baseEvent.type = 'Hack Night'; + baseEvent.save() + .then(() => Event.where({id: baseEvent.id}).fetch()) + .then(result => { + assert(result.type === 'Hack Night'); done(); - }); - }); - - it('Should update Instructors', (done) => { - const jane = new User({}); - sql.instructors = {_id: jane._id}; - sql.save() - .then(() => Event.findOne({_id: sql._id})) - .then((result) => { - assert(String(result.instructors[0]) === String(jane._id)); - done(); - }); + }) + .catch(err => done(err)); }); }); diff --git a/test/event/modelValidations.test.js b/test/event/modelValidations.test.js index c3ffcb1..d7878ab 100644 --- a/test/event/modelValidations.test.js +++ b/test/event/modelValidations.test.js @@ -1,54 +1,58 @@ -const Event = require('../../models/Event'); +require('../test_helper.test'); +const Event = require('../../models/Event').Event; const assert = require('assert'); +// TODO: validations +/* describe('Event model validations', () => { - it('Should require title', (done) => { - const ruby = new Event({ username: undefined }); - const validationResult = ruby.validateSync(); - const message = validationResult.errors.title.message; - assert(message === 'Title is required'); - done(); - }); + it('Should require title', (done) => { + const ruby = new Event({username: undefined}); + const validationResult = ruby.validateSync(); + const message = validationResult.errors.title.message; + assert(message === 'Title is required'); + done(); + }); - it('Should require title length more than 1 chars', (done) => { - const ruby = new Event({ - title: 'r', + it('Should require title length more than 1 chars', (done) => { + const ruby = new Event({ + title: 'r', + }); + const validationResult = ruby.validateSync(); + const message = validationResult.errors.title.message; + assert(message === 'Title must be valid length'); + done(); }); - const validationResult = ruby.validateSync(); - const message = validationResult.errors.title.message; - assert(message === 'Title must be valid length'); - done(); - }); - it('Should require title length less than 100 chars', (done) => { - const ruby = new Event({ - title: 'r'.repeat(100), + it('Should require title length less than 100 chars', (done) => { + const ruby = new Event({ + title: 'r'.repeat(100), + }); + const validationResult = ruby.validateSync(); + const message = validationResult.errors.title.message; + assert(message === 'Title must be valid length'); + done(); }); - const validationResult = ruby.validateSync(); - const message = validationResult.errors.title.message; - assert(message === 'Title must be valid length'); - done(); - }); - it('Should require description length more than 2 chars', (done) => { - const ruby = new Event({ - title: 'ruby', - description: 'rr' + it('Should require description length more than 2 chars', (done) => { + const ruby = new Event({ + title: 'ruby', + description: 'rr' + }); + const validationResult = ruby.validateSync(); + const message = validationResult.errors.description.message; + assert(message === 'Description must be valid length'); + done(); }); - const validationResult = ruby.validateSync(); - const message = validationResult.errors.description.message; - assert(message === 'Description must be valid length'); - done(); - }); - it('Should require description length less than 10000 chars', (done) => { - const ruby = new Event({ - title: 'ruby', - description: 'r'.repeat(10000) + it('Should require description length less than 10000 chars', (done) => { + const ruby = new Event({ + title: 'ruby', + description: 'r'.repeat(10000) + }); + const validationResult = ruby.validateSync(); + const message = validationResult.errors.description.message; + assert(message === 'Description must be valid length'); + done(); }); - const validationResult = ruby.validateSync(); - const message = validationResult.errors.description.message; - assert(message === 'Description must be valid length'); - done(); - }); }); +*/ \ No newline at end of file diff --git a/test/test_helper.test.js b/test/test_helper.test.js index 0ca35d1..84a1687 100644 --- a/test/test_helper.test.js +++ b/test/test_helper.test.js @@ -14,6 +14,8 @@ beforeEach(done => { }) .then(() => { knex('user').truncate(); + }) + .then(() => { done(); }); }); \ No newline at end of file diff --git a/test/user/modelCreate.test.js b/test/user/modelCreate.test.js index f22b349..a55753b 100644 --- a/test/user/modelCreate.test.js +++ b/test/user/modelCreate.test.js @@ -1,8 +1,10 @@ require('../test_helper.test'); +const knex = require('../../config/bookshelf').knex; +const User = require('../../models/User').CheckIn; +const CheckIn = require('../../models/checkIn').CheckIn; +const assert = require('assert'); + describe('User modelCreate', () => { - const User = require('../../models/User'); - const CheckIn = require('../../models/checkIn'); - const assert = require('assert'); let joe; @@ -13,13 +15,14 @@ describe('User modelCreate', () => { }); joe.save() .then(() => done()) - .catch(done); + .catch(err => done(err)); }); afterEach((done) => { - User.collection.drop(); - CheckIn.collection.drop(); - done(); + knex('user').truncate() + .then(() => knex('check_in').truncate()) + .then(() => done()) + .catch(err => done(err)); }); it('Should create a new User record', (done) => { @@ -30,67 +33,67 @@ describe('User modelCreate', () => { it('Should be able to set Username', (done) => { joe.username = 'joe'; joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { + .then(() => User.where({id: joe.id}).fetch()) + .then(result => { assert(result.username === 'joe'); done() }) - .catch(done); + .catch(err => done(err)); }); it('Should be able to set Name', (done) => { joe.name = 'joe billy bob'; joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { + .then(() => User.where({id: joe.id}).fetch()) + .then(result => { assert(result.name === 'joe billy bob'); done() }) - .catch(done); + .catch(err => done(err)); }); it('Should be able to set Description', (done) => { joe.description = 'I like to surf'; joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { + .then(() => User.where({id: joe.id}).fetch()) + .then(result => { assert(result.description === 'I like to surf'); done() }) - .catch(done); + .catch(err => done(err)); }); it('Should be able to set Email', (done) => { joe.email = 'mail@mail.com'; joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { + .then(() => User.where({id: joe.id}).fetch()) + .then(result => { assert(result.email === 'mail@mail.com'); done() }) - .catch(done); + .catch(err => done(err)); }); it('Should be able to set Hometown', (done) => { joe.hometown = 'Detroit'; joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { + .then(() => User.where({id: joe.id}).fetch()) + .then(result => { assert(result.hometown === 'Detroit'); done() }) - .catch(done); + .catch(err => done(err)); }); it('Should be able to set Website', (done) => { joe.website = 'mail.com'; joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { + .then(() => User.where({id: joe.id}).fetch()) + .then(result => { assert(result.website === 'mail.com'); done() }) - .catch(done); + .catch(err => done(err)); }); it('Should set Level to student by default', (done) => { @@ -107,11 +110,11 @@ describe('User modelCreate', () => { const firstCheckIn = new CheckIn({}); joe.checkIns.push(firstCheckIn); joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { - assert(String(result.checkIns) === String(firstCheckIn._id)); + .then(() => User.where({id: joe.id}).fetch()) + .then(result => { + assert(String(result.checkIns) === String(firstCheckIn.id)); done() }) - .catch(done); + .catch(err => done(err)); }); }); diff --git a/test/user/modelDestroy.test.js b/test/user/modelDestroy.test.js index 68bf09f..a9db4e7 100644 --- a/test/user/modelDestroy.test.js +++ b/test/user/modelDestroy.test.js @@ -1,6 +1,6 @@ require('../test_helper.test'); -const User = require('../../models/User'); -const Event = require('../../models/Event'); +const knex = require('../../config/bookshelf').knex; +const User = require('../../models/User').User; const assert = require('assert'); describe('User modelDestroy', () => { @@ -13,12 +13,13 @@ describe('User modelDestroy', () => { }); joe.save() .then(() => done()) - .catch(done); + .catch(err => done(err)); }); afterEach((done) => { - User.collection.drop(); - Event.collection.drop(); - done(); + knex('user').truncate() + .then(() => knex('event').truncate()) + .then(() => done()) + .catch(err => done(err)) }); it('Should destroy User record', (done) => { @@ -27,13 +28,13 @@ describe('User modelDestroy', () => { password: 'otherpass' }); jane.save() - .then(() => User.remove({_id: joe._id})) - .then(() => User.find({})) - .then((results) => { + .then(() => new User({id: joe.id}.destroy())) + .then(() => User.fetchAll()) + .then(results => { assert(results.length === 1); - assert(String(results[0]._id) === String(jane._id)); + assert(results[0].id === jane.id); done() }) - .catch(done); + .catch(err => done(err)); }); }); diff --git a/test/user/modelRead.test.js b/test/user/modelRead.test.js index b0c2066..efe0051 100644 --- a/test/user/modelRead.test.js +++ b/test/user/modelRead.test.js @@ -1,5 +1,5 @@ require('../test_helper.test'); -const User = require('../../models/User'); +const User = require('../../models/User').User; const assert = require('assert'); describe('User modelRead', () => { @@ -10,11 +10,11 @@ describe('User modelRead', () => { password: 'mypass' }); joe.save() - .then(() => User.findOne({_id: joe._id})) - .then((result) => { - assert(String(result._id) === String(joe._id)); + .then(() => User.where({id: joe.id}).fetch()) + .then(result => { + assert(String(result.id) === String(joe.id)); done(); }) - .catch(done); + .catch(err => done(err)); }); }); diff --git a/test/user/modelUpdate.test.js b/test/user/modelUpdate.test.js index 19bfd76..9b61f0b 100644 --- a/test/user/modelUpdate.test.js +++ b/test/user/modelUpdate.test.js @@ -1,108 +1,134 @@ require('../test_helper.test'); -const User = require('../../models/User'); -const CheckIn = require('../../models/checkIn'); +const knex = require('../../config/bookshelf').knex; +const User = require('../../models/User').User; +const CheckIn = require('../../models/checkIn').CheckIn; +const Event = require('../../models/checkIn').Event; const assert = require('assert'); describe('User modelUpdate', () => { let joe; beforeEach((done) => { - const firstCheckIn = new CheckIn({}); joe = new User({ username: 'joe', email: 'mail@mail.com', - password: 'mypass', - checkIns: [{_id: firstCheckIn._id}] + password: 'mypass' }); joe.save() - .then(() => done()) - .catch(done); + .then(user => { + new Event({ + title: 'User Test Event', + description: 'roflcopters and lollerskates', + type: 'Workshop' + }).save() + .then(event => { + return new CheckIn().save({ + 'userid': user.id, + 'eventid': event.id + }); + }) + .then(checkIn => { + user.checkIns.add(checkIn) + }) + .catch(err => done(err)); + }) + .then(done()) + .catch(err => done(err)); }); afterEach((done) => { - User.collection.drop(); - CheckIn.collection.drop(); - done(); + knex('check_in').truncate() + .then(knex('user').truncate()) + .then(done()) + .catch(err => done(err)); }); it('Should update Username', (done) => { joe.username = 'jane'; joe.save() - .then(() => User.findOne({_id: joe._id})) + .then(() => User.where({id: joe.id}).fetch()) .then((result) => { assert(result.username === 'jane'); done(); - }); + }) + .catch(err => done(err)); }); it('Should update Name', (done) => { joe.name = 'jane smith'; joe.save() - .then(() => User.findOne({_id: joe._id})) + .then(() => User.where({id: joe.id}).fetch()) .then((result) => { assert(result.name === 'jane smith'); done(); - }); + }) + .catch(err => done(err)); }); it('Should update Email', (done) => { joe.email = 'm@m.com'; joe.save() - .then(() => User.findOne({_id: joe._id})) + .then(() => User.where({id: joe.id}).fetch()) .then((result) => { assert(result.email === 'm@m.com'); done(); - }); + }) + .catch(err => done(err)); }); it('Should update Level', (done) => { joe.level = 'instructor'; joe.save() - .then(() => User.findOne({_id: joe._id})) + .then(() => User.where({id: joe.id}).fetch()) .then((result) => { assert(result.level === 'instructor'); done(); - }); + }) + .catch(err => done(err)); }); it('Should update Website', (done) => { joe.website = 'www.github.com'; joe.save() - .then(() => User.findOne({_id: joe._id})) + .then(() => User.where({id: joe.id}).fetch()) .then((result) => { assert(result.website === 'www.github.com'); done(); - }); + }) + .catch(err => done(err)); }); it('Should update Hometown', (done) => { joe.hometown = 'Capetown, South Africa'; joe.save() - .then(() => User.findOne({_id: joe._id})) + .then(() => User.where({id: joe.id}).fetch()) .then((result) => { assert(result.hometown === 'Capetown, South Africa'); done(); - }); + }) + .catch(err => done(err)); }); it('Should update Description', (done) => { joe.description = 'I like to play guitar'; joe.save() - .then(() => User.findOne({_id: joe._id})) + .then(() => User.where({id: joe.id}).fetch()) .then((result) => { assert(result.description === 'I like to play guitar'); done(); - }); + }) + .catch(err => done(err)); }); it('Should update CheckIns', (done) => { const checkIn2 = new CheckIn({}); - joe.checkIns = [{_id: checkIn2._id}]; + joe.checkIns = [{id: checkIn2.id}]; joe.save() - .then(() => User.findOne({_id: joe._id})) + .then(() => User.where({id: joe.id}).fetch()) .then((result) => { - assert(String(result.checkIns) === String(checkIn2._id)); + assert(String(result.checkIns) === String(checkIn2.id)); done(); - }); + }) + .catch(err => done(err)); }); }); diff --git a/test/user/modelValidations.test.js b/test/user/modelValidations.test.js index 16f1223..91d77a1 100644 --- a/test/user/modelValidations.test.js +++ b/test/user/modelValidations.test.js @@ -2,6 +2,8 @@ require('../test_helper.test'); const User = require('../../models/User'); const assert = require('assert'); +// TODO: validations +/* describe('User modelValidations', () => { beforeEach((done) => { const joe = new User({ @@ -128,3 +130,4 @@ describe('User modelValidations', () => { }); }); +*/ \ No newline at end of file diff --git a/test/user/repo.test.js b/test/user/repo.test.js index e6a63f9..35e1709 100644 --- a/test/user/repo.test.js +++ b/test/user/repo.test.js @@ -1,6 +1,7 @@ require('../test_helper.test'); +const knex = require('../../config/bookshelf').knex; const Repo = require('../../src/userRepository'); -const User = require('../../models/User'); +const User = require('../../models/User').User; const chai = require('chai'); const chaiHttp = require('chai-http'); chai.use(chaiHttp); @@ -28,12 +29,13 @@ describe('User Repo routes', () => { }) .then(() => { done(); - }); + }) + .catch(err => done(err)); }); afterEach((done) => { - User.collection.drop(); - done(); + knex('user').truncate() + .then(() => done()); }); it('should list all users with getUsers()', (done) => { @@ -56,14 +58,11 @@ describe('User Repo routes', () => { expect(isMatch).to.eql(true); done(); }) - .catch(err => { - expect(err).to.eql(null); - done(); - }); + .catch(err => done(err)); }); it('should add new user with createUser()', (done) => { - const jane = new User({username: 'jane', email: 'jane@mail.com', password: 'roflcopter'}); + const jane = {username: 'jane', email: 'jane@mail.com', password: 'roflcopter'}; Repo.createUser(jane) .then(newUser => { expect(newUser.res).to.have.property('username').eql('jane'); @@ -74,7 +73,8 @@ describe('User Repo routes', () => { expect(users).to.be.a('array'); expect(users.length).to.be.eql(3); done(); - }); + }) + .catch(err => done(err)); }); it('should list single user with getUser()', (done) => { @@ -82,11 +82,12 @@ describe('User Repo routes', () => { .then(result => { expect(result).to.have.property('username').eql('joe'); done() - }); + }) + .catch(err => done(err)); }); it('should update existing user with updateUser()', (done) => { - const jane = new User({username: 'jane', email: 'jane@mail.com', password: 'datpass'}); + const jane = {username: 'jane', email: 'jane@mail.com', password: 'datpass'}; let toBeUpdated = new User({email: 'thadious@m.com'}); Repo.createUser(jane) .then(() => { @@ -98,7 +99,8 @@ describe('User Repo routes', () => { .then(user => { expect(user.email).to.eql('thadious@m.com'); done(); - }); + }) + .catch(err => done(err)); }); }); @@ -114,5 +116,6 @@ it('should delete existing user with deleteUser()', (done) => { .then(users => { expect(users.length).to.eql(1); done(); - }); + }) + .catch(err => done(err)); }); From 240e09e569c9b4f72168ae94438da3c7408e8895 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Thu, 9 Nov 2017 16:59:59 +0900 Subject: [PATCH 58/81] All hooks work except for test 28 --- test/event/modelCreate.test.js | 2 +- test/user/modelCreate.test.js | 2 +- test/user/modelUpdate.test.js | 9 +++++---- test/user/repo.test.js | 30 +++++++++++++++--------------- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/test/event/modelCreate.test.js b/test/event/modelCreate.test.js index 29d038d..38c73dd 100644 --- a/test/event/modelCreate.test.js +++ b/test/event/modelCreate.test.js @@ -63,7 +63,7 @@ describe('Event modelCreate', () => { it('Should be able to set CreatedBy', (done) => { const joe = new User(); - baseEvent.instructors.push({id: joe.id}) + baseEvent.instructors().push({id: joe.id}) baseEvent.save() .then(() => Event.where({title: 'Test Event'}).fetch()) .then(result => { diff --git a/test/user/modelCreate.test.js b/test/user/modelCreate.test.js index a55753b..1f891f0 100644 --- a/test/user/modelCreate.test.js +++ b/test/user/modelCreate.test.js @@ -1,6 +1,6 @@ require('../test_helper.test'); const knex = require('../../config/bookshelf').knex; -const User = require('../../models/User').CheckIn; +const User = require('../../models/User').User; const CheckIn = require('../../models/checkIn').CheckIn; const assert = require('assert'); diff --git a/test/user/modelUpdate.test.js b/test/user/modelUpdate.test.js index 9b61f0b..726b2d9 100644 --- a/test/user/modelUpdate.test.js +++ b/test/user/modelUpdate.test.js @@ -2,7 +2,7 @@ require('../test_helper.test'); const knex = require('../../config/bookshelf').knex; const User = require('../../models/User').User; const CheckIn = require('../../models/checkIn').CheckIn; -const Event = require('../../models/checkIn').Event; +const Event = require('../../models/Event').Event; const assert = require('assert'); describe('User modelUpdate', () => { @@ -23,12 +23,13 @@ describe('User modelUpdate', () => { }).save() .then(event => { return new CheckIn().save({ - 'userid': user.id, - 'eventid': event.id + 'user_id': user.id, + 'event_id': event.id }); }) .then(checkIn => { - user.checkIns.add(checkIn) + console.log('user:', user); + user.checkIns().push(checkIn); }) .catch(err => done(err)); }) diff --git a/test/user/repo.test.js b/test/user/repo.test.js index 35e1709..7683d77 100644 --- a/test/user/repo.test.js +++ b/test/user/repo.test.js @@ -102,20 +102,20 @@ describe('User Repo routes', () => { }) .catch(err => done(err)); }); -}); -it('should delete existing user with deleteUser()', (done) => { - Repo.getUsers() - .then(users => { - expect(users.length).to.eql(2); - return Repo.deleteUser(joe._id) - }) - .then(() => { - return Repo.getUsers() - }) - .then(users => { - expect(users.length).to.eql(1); - done(); - }) - .catch(err => done(err)); + it('should delete existing user with deleteUser()', (done) => { + Repo.getUsers() + .then(users => { + expect(users.length).to.eql(2); + return Repo.deleteUser(joe._id) + }) + .then(() => { + return Repo.getUsers() + }) + .then(users => { + expect(users.length).to.eql(1); + done(); + }) + .catch(err => done(err)); + }); }); From c8a0ab46507cfbbbab1b70339f1517de9a1d1320 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Thu, 9 Nov 2017 17:49:41 +0900 Subject: [PATCH 59/81] Event model create tests pass. Removed unnecessary logging elsewhere --- test/event/modelCreate.test.js | 18 ++++++++++-------- test/user/modelUpdate.test.js | 1 - 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/test/event/modelCreate.test.js b/test/event/modelCreate.test.js index 38c73dd..ae7ca96 100644 --- a/test/event/modelCreate.test.js +++ b/test/event/modelCreate.test.js @@ -2,6 +2,7 @@ require('../test_helper.test'); const knex = require('../../config/bookshelf').knex; const Event = require('../../models/Event').Event; const User = require('../../models/User').User; +const moment = require('moment'); const assert = require('assert'); describe('Event modelCreate', () => { @@ -27,7 +28,7 @@ describe('Event modelCreate', () => { }); it('Should create a new Event record', (done) => { - assert(!baseEvent.isNew); + assert(!baseEvent.isNew()); done(); }); @@ -48,7 +49,7 @@ describe('Event modelCreate', () => { baseEvent.save() .then(() => Event.where({title: 'Test Event'}).fetch()) .then(result => { - assert(result.type === 'Workshop'); + assert(result.get('type') === 'Workshop'); done(); }) .catch(err => { @@ -57,22 +58,23 @@ describe('Event modelCreate', () => { }); it('Should set CreatedAt timestamp by default', (done) => { - assert(baseEvent.createdAt instanceof Date); + const createdAt = moment(baseEvent.get('createdAt'), 'YYYY-MM-DD HH:mm:ss'); + assert(createdAt instanceof moment); done(); }); it('Should be able to set CreatedBy', (done) => { const joe = new User(); - baseEvent.instructors().push({id: joe.id}) + baseEvent.instructors().push({id: joe.id}); baseEvent.save() .then(() => Event.where({title: 'Test Event'}).fetch()) .then(result => { - assert(String(result.instructors) === String(joe.id)); + //console.log('result:', result); + //console.log('result.instructors():', result.instructors()); + assert(String(result.instructors().id) === String(joe.id)); done(); }) - .catch(err => { - done(err); - }); + .catch(err => done(err)); }); }); diff --git a/test/user/modelUpdate.test.js b/test/user/modelUpdate.test.js index 726b2d9..44fc2ac 100644 --- a/test/user/modelUpdate.test.js +++ b/test/user/modelUpdate.test.js @@ -28,7 +28,6 @@ describe('User modelUpdate', () => { }); }) .then(checkIn => { - console.log('user:', user); user.checkIns().push(checkIn); }) .catch(err => done(err)); From 6f9baa5f4e616ebe7baf2359e789531ce04f975f Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Thu, 9 Nov 2017 18:07:17 +0900 Subject: [PATCH 60/81] Event model destroy works --- test/event/modelCreate.test.js | 2 -- test/event/modelDestroy.test.js | 13 +++++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/test/event/modelCreate.test.js b/test/event/modelCreate.test.js index ae7ca96..544b33c 100644 --- a/test/event/modelCreate.test.js +++ b/test/event/modelCreate.test.js @@ -69,8 +69,6 @@ describe('Event modelCreate', () => { baseEvent.save() .then(() => Event.where({title: 'Test Event'}).fetch()) .then(result => { - //console.log('result:', result); - //console.log('result.instructors():', result.instructors()); assert(String(result.instructors().id) === String(joe.id)); done(); }) diff --git a/test/event/modelDestroy.test.js b/test/event/modelDestroy.test.js index fd64ed8..079b390 100644 --- a/test/event/modelDestroy.test.js +++ b/test/event/modelDestroy.test.js @@ -19,11 +19,16 @@ describe('Event modelDestroy', () => { it('Should destroy event record', (done) => { const ruby = new Event({title: 'ruby'}); ruby.save() - .then(Event.remove({title: 'Test Event'})) - .then(Event.forge().fetchAll()) - .then((results) => { + .then(() => { + return Event.where({title: 'Test Event'}).fetch() + }) + .then(event => { + return event.destroy() + }) + .then(() => Event.forge().fetchAll()) + .then(results => { assert(results.length === 1); - assert(results[0].title === 'ruby'); + assert(results.at(0).get('title') === 'ruby'); done() }) .catch(err => done(err)); From d0344780b60f89e84849247d521d17cea7fe1a99 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Thu, 9 Nov 2017 18:11:07 +0900 Subject: [PATCH 61/81] Event model update is good --- test/event/modelUpdate.test.js | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/test/event/modelUpdate.test.js b/test/event/modelUpdate.test.js index 780d5bd..d70b0cc 100644 --- a/test/event/modelUpdate.test.js +++ b/test/event/modelUpdate.test.js @@ -25,33 +25,39 @@ describe('Event modelUpdate', () => { }); it('Should update Title', (done) => { - baseEvent.title = 'ruby'; + baseEvent.set('title', 'ruby'); baseEvent.save() - .then(() => Event.where({id: baseEvent.id}).fetch()) + .then(() => { + return Event.where({id: baseEvent.get('id')}).fetch() + }) .then(result => { - assert(result.title === 'ruby'); + assert(result.get('title') === 'ruby'); done(); }) .catch(err => done(err)); }); it('Should update Description', (done) => { - baseEvent.description = 'beginner ruby'; + baseEvent.set('description', 'beginner ruby'); baseEvent.save() - .then(() => Event.where({id: baseEvent.id}).fetch()) + .then(() => { + return Event.where({id: baseEvent.get('id')}).fetch() + }) .then(result => { - assert(result.description === 'beginner ruby'); + assert(result.get('description') === 'beginner ruby'); done(); }) .catch(err => done(err)); }); it('Should update Type', (done) => { - baseEvent.type = 'Hack Night'; + baseEvent.set('type', 'Hack Night'); baseEvent.save() - .then(() => Event.where({id: baseEvent.id}).fetch()) + .then(() => { + return Event.where({id: baseEvent.get('id')}).fetch() + }) .then(result => { - assert(result.type === 'Hack Night'); + assert(result.get('type') === 'Hack Night'); done(); }) .catch(err => done(err)); From d1436673e4257f81fb2c7ab8396c6d67980a2911 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Thu, 9 Nov 2017 18:16:00 +0900 Subject: [PATCH 62/81] Fixes to ensure database cleanup --- test/event/modelCreate.test.js | 4 +++- test/event/modelRead.test.js | 12 ++++++++++++ test/event/modelUpdate.test.js | 4 +++- test/user/modelUpdate.test.js | 7 ++++++- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/test/event/modelCreate.test.js b/test/event/modelCreate.test.js index 544b33c..567dcaf 100644 --- a/test/event/modelCreate.test.js +++ b/test/event/modelCreate.test.js @@ -22,7 +22,9 @@ describe('Event modelCreate', () => { afterEach((done) => { knex('user').truncate() - .then(() => knex('event').truncate()) + .then(() => { + return knex('event').truncate() + }) .then(() => done()) .catch(err => done(err)); }); diff --git a/test/event/modelRead.test.js b/test/event/modelRead.test.js index dac6c2d..29423b9 100644 --- a/test/event/modelRead.test.js +++ b/test/event/modelRead.test.js @@ -1,8 +1,20 @@ require('../test_helper.test'); +const knex = require('../../config/bookshelf').knex; const Event = require('../../models/Event').Event; const assert = require('assert'); describe('Event modelRead', () => { + beforeEach((done) => { + const baseEvent = new Event({title: 'Test Event'}); + baseEvent.save() + .then(() => done()) + .catch(err => done(err)); + }); + afterEach((done) => { + knex('event').truncate() + .then(() => done()) + .catch(err => done(err)); + }); it('Should find a Event by _id', (done) => { const baseEvent = new Event({title: 'Test Event'}); diff --git a/test/event/modelUpdate.test.js b/test/event/modelUpdate.test.js index d70b0cc..a7a4af0 100644 --- a/test/event/modelUpdate.test.js +++ b/test/event/modelUpdate.test.js @@ -19,7 +19,9 @@ describe('Event modelUpdate', () => { afterEach((done) => { knex('event').truncate() - .then(() => knex('user').truncate()) + .then(() => { + return knex('user').truncate() + }) .then(() => done()) .catch(err => done(err)); }); diff --git a/test/user/modelUpdate.test.js b/test/user/modelUpdate.test.js index 44fc2ac..dc1e1b6 100644 --- a/test/user/modelUpdate.test.js +++ b/test/user/modelUpdate.test.js @@ -38,7 +38,12 @@ describe('User modelUpdate', () => { afterEach((done) => { knex('check_in').truncate() - .then(knex('user').truncate()) + .then(() => { + return knex('user').truncate() + }) + .then(() => { + return knex('event').truncate() + }) .then(done()) .catch(err => done(err)); }); From d7558cde88c172a2c89a726bc1e544692807257e Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Fri, 10 Nov 2017 15:19:46 +0900 Subject: [PATCH 63/81] Was fixing tests. Found bug in initialize method of User model. Event name for saving was incorrect, and passwords were not being hashed on save --- models/User.js | 2 +- test/user/repo.test.js | 32 ++++++++++++++++---------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/models/User.js b/models/User.js index 214e7a1..fecec9c 100644 --- a/models/User.js +++ b/models/User.js @@ -10,7 +10,7 @@ const User = bookshelf.Model.extend({ hidden: ['password'], initialize: function () { - this.on('save', this.hashPassword, this); + this.on('saving', this.hashPassword, this); }, checkIns: function () { diff --git a/test/user/repo.test.js b/test/user/repo.test.js index 7683d77..46d4b2e 100644 --- a/test/user/repo.test.js +++ b/test/user/repo.test.js @@ -41,17 +41,17 @@ describe('User Repo routes', () => { it('should list all users with getUsers()', (done) => { Repo.getUsers() .then(users => { - const sortedUsers = users.sort(function (a, b) { - if (a.username.toUpperCase() < b.username.toUpperCase()) return -1; - if (a.username.toUpperCase() > b.username.toUpperCase()) return 1; + const sortedUsers = users.models.sort(function (a, b) { + if (a.get('username').toUpperCase() < b.get('username').toUpperCase()) return -1; + if (a.get('username').toUpperCase() > b.get('username').toUpperCase()) return 1; return 0; }); expect(sortedUsers).to.be.a('array'); expect(sortedUsers.length).to.be.eql(2); - expect(sortedUsers[0]).to.have.property('_id'); - expect(sortedUsers[0]).to.have.property('username').eql('joe'); - expect(sortedUsers[0]).to.have.property('email').eql('joe@mail.com'); - expect(sortedUsers[0]).to.have.property('level').eql('student'); + expect(sortedUsers[0].toJSON()).to.have.property('id'); + expect(sortedUsers[0].toJSON()).to.have.property('username').eql('joe'); + expect(sortedUsers[0].toJSON()).to.have.property('email').eql('joe@mail.com'); + expect(sortedUsers[0].toJSON()).to.have.property('level').eql('student'); return sortedUsers[0].comparePassword('somepass'); }) .then(isMatch => { @@ -65,12 +65,12 @@ describe('User Repo routes', () => { const jane = {username: 'jane', email: 'jane@mail.com', password: 'roflcopter'}; Repo.createUser(jane) .then(newUser => { - expect(newUser.res).to.have.property('username').eql('jane'); - expect(newUser.res).to.have.property('email').eql('jane@mail.com'); + expect(newUser.toJSON()).to.have.property('username').eql('jane'); + expect(newUser.toJSON()).to.have.property('email').eql('jane@mail.com'); return Repo.getUsers(); }) .then(users => { - expect(users).to.be.a('array'); + expect(users.models).to.be.a('array'); expect(users.length).to.be.eql(3); done(); }) @@ -78,9 +78,9 @@ describe('User Repo routes', () => { }); it('should list single user with getUser()', (done) => { - Repo.getUser(joe._id) + Repo.getUser(joe.get('id')) .then(result => { - expect(result).to.have.property('username').eql('joe'); + expect(result.toJSON()).to.have.property('username').eql('joe'); done() }) .catch(err => done(err)); @@ -91,13 +91,13 @@ describe('User Repo routes', () => { let toBeUpdated = new User({email: 'thadious@m.com'}); Repo.createUser(jane) .then(() => { - return Repo.updateUser(tad._id, toBeUpdated); + return Repo.updateUser(tad.get('id'), toBeUpdated); }) .then(() => { - return Repo.getUser(tad._id) + return Repo.getUser(tad.get('id')); }) .then(user => { - expect(user.email).to.eql('thadious@m.com'); + expect(user.toJSON()).to.have.property('email').eql('thadious@m.com'); done(); }) .catch(err => done(err)); @@ -107,7 +107,7 @@ describe('User Repo routes', () => { Repo.getUsers() .then(users => { expect(users.length).to.eql(2); - return Repo.deleteUser(joe._id) + return Repo.deleteUser(joe.get('id')); }) .then(() => { return Repo.getUsers() From f88b71384fe796702b07938f606398c614726d90 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Fri, 10 Nov 2017 17:51:11 +0900 Subject: [PATCH 64/81] Test still failing. Troubleshooting. Made a minor fix on CheckIn model --- models/checkIn.js | 12 +++++----- test/user/modelUpdate.test.js | 42 +++++++++++++++++++++++------------ 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/models/checkIn.js b/models/checkIn.js index 843d036..72a3bba 100644 --- a/models/checkIn.js +++ b/models/checkIn.js @@ -5,29 +5,29 @@ const CheckIn = bookshelf.Model.extend({ tableName: 'check_in', hasTimestamps: true, - user: () => { + user: function () { return this.belongsTo('User', 'user_id'); }, - event: () => { + event: function () { return this.belongsTo('Event', 'event_id'); }, virtuals: { createdAt: { - get: () => { + get: function () { return this.get('created_at'); }, - set: newDate => { + set: function (newDate) { this.set('created_at', newDate); } }, updatedAt: { - get: () => { + get: function () { return this.get('updated_at'); }, - set: newDate => { + set: function (newDate) { this.set('updated_at', newDate) } } diff --git a/test/user/modelUpdate.test.js b/test/user/modelUpdate.test.js index dc1e1b6..f8c8193 100644 --- a/test/user/modelUpdate.test.js +++ b/test/user/modelUpdate.test.js @@ -23,16 +23,15 @@ describe('User modelUpdate', () => { }).save() .then(event => { return new CheckIn().save({ - 'user_id': user.id, - 'event_id': event.id - }); - }) - .then(checkIn => { - user.checkIns().push(checkIn); + 'user_id': user.get('id'), + 'event_id': event.get('id') + }) + .then(() => { + done(); + }); }) .catch(err => done(err)); }) - .then(done()) .catch(err => done(err)); }); @@ -126,13 +125,28 @@ describe('User modelUpdate', () => { }); it('Should update CheckIns', (done) => { - const checkIn2 = new CheckIn({}); - joe.checkIns = [{id: checkIn2.id}]; - joe.save() - .then(() => User.where({id: joe.id}).fetch()) - .then((result) => { - assert(String(result.checkIns) === String(checkIn2.id)); - done(); + //const user = User.forge + + User.where({username: 'joe'}).fetch({withRelated: 'checkIns'}) + .then(user => { + return user.checkIns().create({}) + .then(newCheckIn => { + // const checkInUser = newCheckIn.user(); + // const relatedUser = newCheckIn.related('user'); + // assert(newCheckIn.user().get('id') === user.get('id')); + // return newCheckIn.user(); + return newCheckIn.refresh({withRelated: 'user'}); + }) + .then(updatedCheckIn => { + assert(updatedCheckIn.user().get('id') === user.get('id')); + assert(updatedCheckIn.user().checkIns().length === 2); + return updatedCheckIn.user(); + }) + .then(user => { + assert(user.checkIns().length === 2); + done(); + }) + .catch(err => done(err)); }) .catch(err => done(err)); }); From 6ac1210eafc8d70944d63f65fa517732f045f3c4 Mon Sep 17 00:00:00 2001 From: Hazelton Jacob Date: Sat, 11 Nov 2017 17:49:29 +0900 Subject: [PATCH 65/81] add gulp --- gulpfile.js | 12 + package-lock.json | 1558 +++++++++++++++++++++++++++++++--- package.json | 15 +- public/dist/css/style.css | 1 + public/stylesheets/style.css | 2 +- views/layout.pug | 2 +- 6 files changed, 1465 insertions(+), 125 deletions(-) create mode 100644 gulpfile.js create mode 100644 public/dist/css/style.css diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..2e7bdf4 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,12 @@ +var gulp = require('gulp') +var cleancss = require('gulp-clean-css') + +gulp.task('css', function() { + return gulp.src("public/stylesheets/style.css") + .pipe(cleancss()) + .pipe(gulp.dest('public/dist/css')) +}); + +gulp.task('watch', function() { + gulp.watch('public/stylesheets/style.css', ['css']) +}); diff --git a/package-lock.json b/package-lock.json index db25832..3503027 100644 --- a/package-lock.json +++ b/package-lock.json @@ -88,11 +88,15 @@ "normalize-path": "2.1.1" } }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, "arr-diff": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, "requires": { "arr-flatten": "1.1.0" } @@ -100,19 +104,37 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "array-slice": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.0.0.tgz", + "integrity": "sha1-5zA08A3MH0CHYAj9IP6ud71LfC8=" + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, "asap": { "version": "2.0.6", @@ -142,8 +164,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "basic-auth": { "version": "1.1.0", @@ -155,6 +176,11 @@ "resolved": "https://registry.npmjs.org/bcrypt-nodejs/-/bcrypt-nodejs-0.0.3.tgz", "integrity": "sha1-xgkX8m3CNWYVZsaBBhwwPCsohCs=" }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=" + }, "binary-extensions": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", @@ -193,6 +219,14 @@ } } }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "requires": { + "hoek": "2.16.3" + } + }, "boxen": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.2.tgz", @@ -220,7 +254,6 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -230,7 +263,6 @@ "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, "requires": { "expand-range": "1.8.2", "preserve": "0.2.0", @@ -394,11 +426,20 @@ "wordwrap": "0.0.2" } }, + "clone": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=" + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "color-convert": { "version": "1.9.0", @@ -441,8 +482,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "configstore": { "version": "3.1.1", @@ -507,6 +547,15 @@ "integrity": "sha1-Cr81atANHFohnYjURRgEbdAmrP4=", "dev": true }, + "copy-props": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-1.6.0.tgz", + "integrity": "sha1-8DJLvumXcRAeezraES8xPDk9uO0=", + "requires": { + "each-props": "1.3.1", + "is-plain-object": "2.0.4" + } + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -538,6 +587,19 @@ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", "dev": true }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "requires": { + "es5-ext": "0.10.35" + } + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -566,6 +628,14 @@ "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", "dev": true }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "1.0.3" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -577,11 +647,24 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=" + }, "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "detect-file": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", + "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", + "requires": { + "fs-exists-sync": "0.1.0" + } + }, "diff": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", @@ -608,12 +691,52 @@ "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, + "each-props": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.1.tgz", + "integrity": "sha1-/BOPUeOid0KG1IWOAtbn3kYt4Vg=", + "requires": { + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -624,11 +747,57 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" }, + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "requires": { + "once": "1.3.3" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "requires": { + "wrappy": "1.0.2" + } + } + } + }, + "es5-ext": { + "version": "0.10.35", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", + "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-symbol": "3.1.1" + } + }, "es6-promise": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -637,8 +806,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "etag": { "version": "1.8.1", @@ -679,7 +847,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, "requires": { "is-posix-bracket": "0.1.1" } @@ -688,11 +855,18 @@ "version": "1.8.2", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, "requires": { "fill-range": "2.2.3" } }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "requires": { + "os-homedir": "1.0.2" + } + }, "express": { "version": "4.15.5", "resolved": "https://registry.npmjs.org/express/-/express-4.15.5.tgz", @@ -773,29 +947,71 @@ "extend": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, "requires": { "is-extglob": "1.0.0" } }, + "fancy-log": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "requires": { + "chalk": "1.1.3", + "time-stamp": "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=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.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.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" }, "fill-range": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, "requires": { "is-number": "2.1.0", "isobject": "2.1.0", @@ -825,17 +1041,63 @@ } } }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=" + }, + "findup-sync": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", + "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", + "requires": { + "detect-file": "0.1.0", + "is-glob": "2.0.1", + "micromatch": "2.3.11", + "resolve-dir": "0.1.1" + } + }, + "fined": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", + "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "requires": { + "expand-tilde": "2.0.2", + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0", + "object.pick": "1.3.0", + "parse-filepath": "1.0.1" + }, + "dependencies": { + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "1.0.1" + } + } + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=" + }, + "flagged-respawn": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", + "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=" + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "for-own": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, "requires": { "for-in": "1.0.2" } @@ -881,6 +1143,11 @@ "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", "dev": true }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1791,6 +2058,14 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "requires": { + "globule": "0.1.0" + } + }, "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", @@ -1821,7 +2096,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, "requires": { "glob-parent": "2.0.0", "is-glob": "2.0.1" @@ -1831,11 +2105,90 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, "requires": { "is-glob": "2.0.1" } }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "requires": { + "glob": "4.5.3", + "glob2base": "0.0.12", + "minimatch": "2.0.10", + "ordered-read-streams": "0.1.0", + "through2": "0.6.5", + "unique-stream": "1.0.0" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "2.0.10", + "once": "1.4.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "requires": { + "gaze": "0.5.2" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "requires": { + "find-index": "0.1.1" + } + }, "global-dirs": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.0.tgz", @@ -1845,6 +2198,85 @@ "ini": "1.3.4" } }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "requires": { + "global-prefix": "0.1.5", + "is-windows": "0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "requires": { + "homedir-polyfill": "1.0.1", + "ini": "1.3.4", + "is-windows": "0.2.0", + "which": "1.3.0" + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "requires": { + "glob": "3.1.21", + "lodash": "1.0.2", + "minimatch": "0.2.14" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "requires": { + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=" + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=" + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=" + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + } + } + }, + "glogg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", + "requires": { + "sparkles": "1.0.0" + } + }, "got": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", @@ -1881,36 +2313,359 @@ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", "dev": true }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "requires": { - "function-bind": "1.1.1" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "hooks-fixed": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.2.tgz", - "integrity": "sha512-YurCM4gQSetcrhwEtpQHhQ4M7Zo7poNGqY4kQGeBS6eZtOcT3tnNs01ThFa0jYBByAiYt1MjMjP/YApG0EnAvQ==" - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { + "gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "requires": { + "archy": "1.0.0", + "chalk": "1.1.3", + "deprecated": "0.0.1", + "gulp-util": "3.0.8", + "interpret": "1.0.4", + "liftoff": "2.3.0", + "minimist": "1.2.0", + "orchestrator": "0.3.8", + "pretty-hrtime": "1.0.3", + "semver": "4.3.6", + "tildify": "1.2.0", + "v8flags": "2.1.1", + "vinyl-fs": "0.3.14" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" + }, + "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.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "gulp-clean-css": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-3.9.0.tgz", + "integrity": "sha512-CsqaSO2ZTMQI/WwbWloZWBudhsRMKgxBthzxt4bbcbWrjOY4pRFziyK9IH6YbTpaWAPKEwWpopPkpiAEoDofxw==", + "requires": { + "clean-css": "4.1.9", + "gulp-util": "3.0.8", + "through2": "2.0.3", + "vinyl-sourcemaps-apply": "0.2.1" + }, + "dependencies": { + "clean-css": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", + "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", + "requires": { + "source-map": "0.5.7" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "gulp-cli": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-1.4.0.tgz", + "integrity": "sha1-b1u+LNC9tISdEs+eEkalhh+LT4g=", + "requires": { + "archy": "1.0.0", + "chalk": "1.1.3", + "copy-props": "1.6.0", + "fancy-log": "1.3.0", + "gulplog": "1.0.0", + "interpret": "1.0.4", + "liftoff": "2.3.0", + "lodash.isfunction": "3.0.8", + "lodash.isplainobject": "4.0.6", + "lodash.sortby": "4.7.0", + "matchdep": "1.0.1", + "mute-stdout": "1.0.0", + "pretty-hrtime": "1.0.3", + "semver-greatest-satisfied-range": "1.1.0", + "tildify": "1.2.0", + "v8flags": "2.1.1", + "wreck": "6.3.0", + "yargs": "3.32.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "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.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "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.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "requires": { + "camelcase": "2.1.1", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "os-locale": "1.4.0", + "string-width": "1.0.2", + "window-size": "0.1.4", + "y18n": "3.2.1" + } + } + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.2.0", + "fancy-log": "1.3.0", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.3", + "vinyl": "0.5.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" + }, + "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.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "requires": { + "glogg": "1.0.0" + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "requires": { + "sparkles": "1.0.0" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "requires": { + "parse-passwd": "1.0.0" + } + }, + "hooks-fixed": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.2.tgz", + "integrity": "sha512-YurCM4gQSetcrhwEtpQHhQ4M7Zo7poNGqY4kQGeBS6eZtOcT3tnNs01ThFa0jYBByAiYt1MjMjP/YApG0EnAvQ==" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", @@ -1944,7 +2699,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -1958,8 +2712,17 @@ "ini": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", - "dev": true + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" + }, + "interpret": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", + "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "ip-regex": { "version": "1.0.3", @@ -1972,6 +2735,15 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" }, + "is-absolute": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", + "requires": { + "is-relative": "0.2.1", + "is-windows": "0.2.0" + } + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -1989,14 +2761,12 @@ "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" }, "is-equal-shallow": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, "requires": { "is-primitive": "2.0.0" } @@ -2013,14 +2783,12 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-fullwidth-code-point": { "version": "2.0.0", @@ -2032,7 +2800,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, "requires": { "is-extglob": "1.0.0" } @@ -2066,7 +2833,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, "requires": { "kind-of": "3.2.2" } @@ -2086,17 +2852,30 @@ "path-is-inside": "1.0.2" } }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + } + } + }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" }, "is-primitive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" }, "is-promise": { "version": "2.1.0", @@ -2117,6 +2896,14 @@ "has": "1.0.1" } }, + "is-relative": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", + "requires": { + "is-unc-path": "0.1.2" + } + }, "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", @@ -2129,6 +2916,24 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-unc-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", + "requires": { + "unc-path-regex": "0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -2137,14 +2942,12 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, "requires": { "isarray": "1.0.0" } @@ -2201,6 +3004,30 @@ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "1.0.0" + } + }, + "liftoff": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz", + "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", + "requires": { + "extend": "3.0.1", + "findup-sync": "0.4.3", + "fined": "1.1.0", + "flagged-respawn": "0.3.2", + "lodash.isplainobject": "4.0.6", + "lodash.isstring": "4.0.1", + "lodash.mapvalues": "4.6.0", + "rechoir": "0.6.2", + "resolve": "1.5.0" + } + }, "lodash": { "version": "4.17.4", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", @@ -2219,8 +3046,7 @@ "lodash._basecopy": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" }, "lodash._basecreate": { "version": "3.0.3", @@ -2228,6 +3054,16 @@ "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", "dev": true }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=" + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" + }, "lodash._bindcallback": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", @@ -2248,14 +3084,32 @@ "lodash._getnative": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" }, "lodash._isiterateecall": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=" + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" }, "lodash.assign": { "version": "3.2.0", @@ -2289,6 +3143,14 @@ "lodash.restparam": "3.6.1" } }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "requires": { + "lodash._root": "3.0.1" + } + }, "lodash.foreach": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", @@ -2302,31 +3164,77 @@ "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" }, "lodash.isarray": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.isfunction": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.8.tgz", + "integrity": "sha1-TbcJ/IG8So/XEnpFilNGxc3OLGs=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, "lodash.keys": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, "requires": { "lodash._getnative": "3.9.1", "lodash.isarguments": "3.1.0", "lodash.isarray": "3.0.4" } }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=" + }, "lodash.restparam": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } }, "longest": { "version": "1.0.1", @@ -2358,12 +3266,55 @@ "pify": "3.0.0" } }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, "map-stream": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, + "matchdep": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-1.0.1.tgz", + "integrity": "sha1-pXozgESR+64girqPaDgEN6vC3KU=", + "requires": { + "findup-sync": "0.3.0", + "micromatch": "2.3.11", + "resolve": "1.1.7", + "stack-trace": "0.0.9" + }, + "dependencies": { + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "requires": { + "glob": "5.0.15" + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + } + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -2398,7 +3349,6 @@ "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, "requires": { "arr-diff": "2.0.0", "array-unique": "0.2.1", @@ -2437,7 +3387,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "1.1.8" } @@ -2445,14 +3394,12 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } @@ -2599,11 +3546,24 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "requires": { + "duplexer2": "0.0.2" + } + }, "muri": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/muri/-/muri-1.3.0.tgz", "integrity": "sha512-FiaFwKl864onHFFUV/a2szAl7X0fxVlSKNdhTf+BM8i8goEgYut8u5P9MqQqIYwvaMxjzVESsoEm/2kfkFH1rg==" }, + "mute-stdout": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.0.tgz", + "integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=" + }, "nan": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", @@ -2611,6 +3571,11 @@ "dev": true, "optional": true }, + "natives": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", + "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=" + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -2655,7 +3620,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, "requires": { "remove-trailing-separator": "1.1.0" } @@ -2672,24 +3636,63 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "requires": { + "array-each": "1.0.1", + "array-slice": "1.0.0", + "for-own": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + } + } + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, "requires": { "for-own": "0.1.5", "is-extendable": "0.1.1" } }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + } + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -2707,11 +3710,38 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1.0.2" } }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "requires": { + "end-of-stream": "0.1.5", + "sequencify": "0.0.7", + "stream-consume": "0.1.0" + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "1.0.0" + } + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -2730,11 +3760,20 @@ "semver": "5.4.1" } }, + "parse-filepath": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", + "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", + "requires": { + "is-absolute": "0.2.6", + "map-cache": "0.2.2", + "path-root": "0.1.1" + } + }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, "requires": { "glob-base": "0.3.0", "is-dotfile": "1.0.3", @@ -2742,6 +3781,11 @@ "is-glob": "2.0.1" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", @@ -2768,8 +3812,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -2788,6 +3831,19 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "requires": { + "path-root-regex": "0.1.2" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -2833,8 +3889,12 @@ "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" }, "process-nextick-args": { "version": "1.0.7", @@ -3012,7 +4072,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, "requires": { "is-number": "3.0.0", "kind-of": "4.0.0" @@ -3022,7 +4081,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3031,7 +4089,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3042,7 +4099,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3110,11 +4166,18 @@ "set-immediate-shim": "1.0.1" } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "1.5.0" + } + }, "regex-cache": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, "requires": { "is-equal-shallow": "0.1.3" } @@ -3146,20 +4209,23 @@ "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "repeat-element": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" + }, "require_optional": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", @@ -3177,6 +4243,15 @@ "path-parse": "1.0.5" } }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "requires": { + "expand-tilde": "1.2.2", + "global-modules": "0.2.3" + } + }, "resolve-from": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", @@ -3209,6 +4284,14 @@ "semver": "5.4.1" } }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "requires": { + "sver-compat": "1.5.0" + } + }, "send": { "version": "0.15.6", "resolved": "https://registry.npmjs.org/send/-/send-0.15.6.tgz", @@ -3236,6 +4319,11 @@ } } }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=" + }, "serve-favicon": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.5.tgz", @@ -3285,6 +4373,11 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -3304,6 +4397,11 @@ "amdefine": "1.0.1" } }, + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=" + }, "split": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", @@ -3313,6 +4411,11 @@ "through": "2.3.8" } }, + "stack-trace": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" + }, "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", @@ -3327,6 +4430,11 @@ "duplexer": "0.1.1" } }, + "stream-consume": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", + "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -3354,6 +4462,15 @@ "ansi-regex": "3.0.0" } }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "requires": { + "first-chunk-stream": "1.0.0", + "is-utf8": "0.2.1" + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -3393,6 +4510,15 @@ "has-flag": "1.0.0" } }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, "term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", @@ -3408,6 +4534,28 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "2.2.7", + "xtend": "4.0.1" + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "requires": { + "os-homedir": "1.0.2" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -3471,12 +4619,22 @@ "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, "undefsafe": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz", "integrity": "sha1-7Mo6A+VrmvFzhbqsgSrIO5lKli8=", "dev": true }, + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=" + }, "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", @@ -3523,6 +4681,11 @@ "prepend-http": "1.0.4" } }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=" + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -3533,6 +4696,14 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "requires": { + "user-home": "1.1.1" + } + }, "validator": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz", @@ -3543,6 +4714,100 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "requires": { + "defaults": "1.0.3", + "glob-stream": "3.1.18", + "glob-watcher": "0.0.6", + "graceful-fs": "3.0.11", + "mkdirp": "0.5.1", + "strip-bom": "1.0.0", + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "requires": { + "natives": "1.1.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "requires": { + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, "void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -3552,7 +4817,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, "requires": { "isexe": "2.0.0" } @@ -3622,11 +4886,61 @@ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "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.1" + } + }, + "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.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "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.1.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "wreck": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/wreck/-/wreck-6.3.0.tgz", + "integrity": "sha1-oTaXafB7u2LWo3gzanhx/Hc8dAs=", + "requires": { + "boom": "2.10.1", + "hoek": "2.16.3" + } }, "write-file-atomic": { "version": "2.3.0", @@ -3645,6 +4959,16 @@ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", "dev": true }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", diff --git a/package.json b/package.json index 0c01df0..2258151 100644 --- a/package.json +++ b/package.json @@ -9,23 +9,26 @@ "test-watch": "nodemon --exec 'npm test'" }, "dependencies": { + "bcrypt-nodejs": "latest", "body-parser": "~1.17.1", "connect-flash": "^0.1.1", "cookie-parser": "~1.4.3", "debug": "~2.6.3", "express": "~4.15.2", + "express-session": "~1.0.0", + "gulp": "^3.9.1", + "gulp-clean-css": "^3.9.0", + "gulp-cli": "^1.4.0", "jquery": "^3.2.1", + "method-override": "~1.0.0", "mongoose": "^4.7.2", "mongoose-unique-validator": "^1.0.5", "morgan": "~1.8.1", - "pug": "~2.0.0-beta11", - "serve-favicon": "~2.4.2", - "validator": "^8.0.0", "passport": "~0.1.17", "passport-local": "~0.1.6", - "bcrypt-nodejs": "latest", - "method-override": "~1.0.0", - "express-session": "~1.0.0" + "pug": "~2.0.0-beta11", + "serve-favicon": "~2.4.2", + "validator": "^8.0.0" }, "devDependencies": { "chai": "^4.0.2", diff --git a/public/dist/css/style.css b/public/dist/css/style.css new file mode 100644 index 0000000..a28d470 --- /dev/null +++ b/public/dist/css/style.css @@ -0,0 +1 @@ +body{font-family:Arial,sans-serif;color:#333}.form{margin-top:80px}label{margin-top:15px}input[type=submit]{margin-top:20px;cursor:pointer}.leaderboard{margin:60px 0;max-width:600px}.leaderboard a{text-decoration:none;color:inherit}.leader{border:2px solid #eee;margin-bottom:10px;padding:6px;border-radius:8px}.leader img{border-radius:50%}.leader h2,.leader h3,.leader h4,.leader p{display:inline-block}.leader p{background-color:#2674f2;font-size:10px;letter-spacing:1.5px;vertical-align:8px;color:#fff;border-radius:4px;padding:2px 5px;position:absolute;top:46px;right:10px}.leader h2{font-size:20px;padding:0 10px}.leader h4{position:absolute;top:46px;left:78px;font-size:12px;letter-spacing:2px;color:#aaa}.leader h3{margin:6px 4px;font-size:16px;float:right}.leader .counter{background:#dc143c;color:#ddd;font-size:11px;text-align:center;font-weight:700;padding:3px;border-radius:50%;width:18px}.leader .teacher{background:#32cd32}.user-profile{margin:40px auto;padding:0 40px}.user-profile img{width:180px;height:180px;border-radius:50%}.user-profile .center-column{margin:auto}.user-profile h1{margin-top:20px}.user-profile hr{border:0;height:1px;margin:20px 0 40px -80px;background-image:linear-gradient(to right,rgba(0,0,0,.05),rgba(0,0,0,.5),rgba(0,0,0,.05));width:120%;position:absolute;top:50px;z-index:-1}.user-profile a{display:inline-block;background-image:url(../images/edit.png);background-color:#fff;background-size:104px 84px;background-position:20px -10px;background-repeat:no-repeat;height:34px;width:54px}.user-profile a:hover{text-decoration:none}.user-profile-edit #delete-user{background-image:url(../images/trash.png);border:none;background-color:#fff;background-size:24px 24px;background-repeat:no-repeat;height:24px;width:24px;position:relative;top:20px;left:20px} \ No newline at end of file diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index 2eabb19..3a44e21 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -1,5 +1,5 @@ body { - font-family: 'Source Sans Pro', sans-serif; + font-family: 'Arial', sans-serif; color: #333; } /********************************************/ diff --git a/views/layout.pug b/views/layout.pug index cf0b759..14cb3fa 100644 --- a/views/layout.pug +++ b/views/layout.pug @@ -4,7 +4,7 @@ html title= title link(href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css", rel="stylesheet", integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous") link(href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css", rel="stylesheet", integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN", crossorigin="anonymous") - link(rel='stylesheet', href='/stylesheets/style.css') + link(rel='stylesheet', href='/dist/css/style.css') link(href="https://fonts.googleapis.com/css?family=Source+Sans+Pro" rel="stylesheet") script(src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js") script(src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous") From 288047aebae1091fd73c253d1004d06230ae260f Mon Sep 17 00:00:00 2001 From: Hazelton Jacob Date: Sat, 11 Nov 2017 18:53:57 +0900 Subject: [PATCH 66/81] add parsley validation --- package-lock.json | 3787 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 13 +- views/layout.pug | 2 + 3 files changed, 3796 insertions(+), 6 deletions(-) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ecc5379 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3787 @@ +{ + "name": "ltc-attendance", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" + }, + "acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "2.1.1" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "assertion-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", + "dev": true + }, + "async": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", + "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", + "requires": { + "lodash": "4.17.4" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "basic-auth": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz", + "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=" + }, + "bcrypt-nodejs": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/bcrypt-nodejs/-/bcrypt-nodejs-0.0.3.tgz", + "integrity": "sha1-xgkX8m3CNWYVZsaBBhwwPCsohCs=" + }, + "binary-extensions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", + "dev": true + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "body-parser": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", + "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=", + "requires": { + "bytes": "2.4.0", + "content-type": "1.0.4", + "debug": "2.6.7", + "depd": "1.1.1", + "http-errors": "1.6.2", + "iconv-lite": "0.4.15", + "on-finished": "2.3.0", + "qs": "6.4.0", + "raw-body": "2.2.0", + "type-is": "1.6.15" + }, + "dependencies": { + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "boxen": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.2.tgz", + "integrity": "sha1-Px1AMsMP/qnUsCwyLq8up0HcvOU=", + "dev": true, + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.3.0", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "bson": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", + "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" + }, + "buffer-crc32": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz", + "integrity": "sha1-vj5TgvwCttYySVasGvmKqYsIU0w=" + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "bytes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "1.0.2", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.3" + } + }, + "chai-http": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-3.0.0.tgz", + "integrity": "sha1-VGDYA24fGhKwtbXL1Snm3B0x60s=", + "dev": true, + "requires": { + "cookiejar": "2.0.6", + "is-ip": "1.0.0", + "methods": "1.1.2", + "qs": "6.4.0", + "superagent": "2.3.0" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", + "requires": { + "is-regex": "1.0.4" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.2", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", + "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", + "requires": { + "commander": "2.8.1", + "source-map": "0.4.4" + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "configstore": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", + "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.1.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, + "connect-flash": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/connect-flash/-/connect-flash-0.1.1.tgz", + "integrity": "sha1-2GMPJtlaf4UfmVax6MxnMvO2qjA=" + }, + "constantinople": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.0.tgz", + "integrity": "sha1-dWnKqKo/jVk11i4fqW+fcCzYHHk=", + "requires": { + "acorn": "3.3.0", + "is-expression": "2.1.0" + } + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.0.6.tgz", + "integrity": "sha1-Cr81atANHFohnYjURRgEbdAmrP4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "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" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "4.0.3" + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + }, + "es6-promise": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", + "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" + }, + "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=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "requires": { + "duplexer": "0.1.1", + "from": "0.1.7", + "map-stream": "0.1.0", + "pause-stream": "0.0.11", + "split": "0.3.3", + "stream-combiner": "0.0.4", + "through": "2.3.8" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "express": { + "version": "4.15.5", + "resolved": "https://registry.npmjs.org/express/-/express-4.15.5.tgz", + "integrity": "sha1-ZwI1ypWYiQpa6BcLg9tyK4Qu2Sc=", + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.1", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.0.6", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "1.1.5", + "qs": "6.5.0", + "range-parser": "1.2.0", + "send": "0.15.6", + "serve-static": "1.12.6", + "setprototypeof": "1.0.3", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.0", + "vary": "1.1.2" + }, + "dependencies": { + "qs": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", + "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==" + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "express-session": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.0.4.tgz", + "integrity": "sha1-oQBFrz8kaTycGbGRShHQyrj3sps=", + "requires": { + "buffer-crc32": "0.2.1", + "cookie": "0.1.2", + "cookie-signature": "1.0.3", + "debug": "0.8.1", + "uid2": "0.0.3", + "utils-merge": "1.0.0" + }, + "dependencies": { + "cookie": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", + "integrity": "sha1-cv7D0k5Io0Mgc9kMEmQgBQYQBLE=" + }, + "cookie-signature": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.3.tgz", + "integrity": "sha1-kc2ZfMUftkFZVzjGnNoCAyj1D/k=" + }, + "debug": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz", + "integrity": "sha1-IP9NJvXkIstoobrLu2EDmtjBwTA=" + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "finalhandler": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", + "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "form-data": { + "version": "1.0.0-rc4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", + "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=", + "dev": true, + "requires": { + "async": "1.5.2", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "formidable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", + "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=", + "dev": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.7.0", + "node-pre-gyp": "0.6.36" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "aproba": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "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=", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.36", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz", + "integrity": "sha1-22BBEst04NR3VU6bUFsXq936t4Y=", + "dev": true, + "optional": true, + "requires": { + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", + "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", + "dev": true + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "optional": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "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=", + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", + "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "global-dirs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.0.tgz", + "integrity": "sha1-ENNAOeDfBCcuJizyQiT3IJQ0308=", + "dev": true, + "requires": { + "ini": "1.3.4" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "requires": { + "function-bind": "1.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hooks-fixed": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.2.tgz", + "integrity": "sha512-YurCM4gQSetcrhwEtpQHhQ4M7Zo7poNGqY4kQGeBS6eZtOcT3tnNs01ThFa0jYBByAiYt1MjMjP/YApG0EnAvQ==" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + } + }, + "iconv-lite": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=" + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true + }, + "ip-regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", + "dev": true + }, + "ipaddr.js": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", + "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.10.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-expression": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-2.1.0.tgz", + "integrity": "sha1-kb6dR968/vB3l36XIr5tz7RGXvA=", + "requires": { + "acorn": "3.3.0", + "object-assign": "4.1.1" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "0.1.0", + "is-path-inside": "1.0.0" + } + }, + "is-ip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-1.0.0.tgz", + "integrity": "sha1-K7aVn3l8zW+f3IEnWLy8h8TFkHQ=", + "dev": true, + "requires": { + "ip-regex": "1.0.3" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "1.0.1" + } + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "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=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "jquery": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", + "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" + }, + "js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", + "requires": { + "is-promise": "2.1.0", + "promise": "7.3.1" + } + }, + "kareem": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-1.5.0.tgz", + "integrity": "sha1-4+QQHZ3P3imXadr0tNtk2JXRdEg=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "4.0.1" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, + "lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "dev": true, + "requires": { + "lodash._bindcallback": "3.0.1", + "lodash._isiterateecall": "3.0.9", + "lodash.restparam": "3.6.1" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._createassigner": "3.1.1", + "lodash.keys": "3.1.2" + } + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.defaults": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", + "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", + "dev": true, + "requires": { + "lodash.assign": "3.2.0", + "lodash.restparam": "3.6.1" + } + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", + "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, + "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=" + }, + "method-override": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-1.0.2.tgz", + "integrity": "sha1-1vgCddsjojOAAoySFbl0cL4B1ok=", + "requires": { + "methods": "1.0.0" + }, + "dependencies": { + "methods": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.0.0.tgz", + "integrity": "sha1-mnPYY3XfzvJu9hyj5Lii4lOKgOM=" + } + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "mongodb": { + "version": "2.2.33", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.33.tgz", + "integrity": "sha1-tTfEcdNKZlG0jzb9vyl1A0Dgi1A=", + "requires": { + "es6-promise": "3.2.1", + "mongodb-core": "2.1.17", + "readable-stream": "2.2.7" + } + }, + "mongodb-core": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.17.tgz", + "integrity": "sha1-pBizN6FKFJkPtRC5I97mqBMXPfg=", + "requires": { + "bson": "1.0.4", + "require_optional": "1.0.1" + } + }, + "mongoose": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.12.5.tgz", + "integrity": "sha512-dhCcCfYJjZv95nn4mAIAzj/+o2iR8rIBPOFlWps/STe+wJD53B2sKOpS+UH2bp7CqBHcLnwdRJL6aGJUcWS7kg==", + "requires": { + "async": "2.1.4", + "bson": "1.0.4", + "hooks-fixed": "2.0.2", + "kareem": "1.5.0", + "mongodb": "2.2.33", + "mpath": "0.3.0", + "mpromise": "0.5.5", + "mquery": "2.3.2", + "ms": "2.0.0", + "muri": "1.3.0", + "regexp-clone": "0.0.1", + "sliced": "1.0.1" + } + }, + "mongoose-unique-validator": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-1.0.6.tgz", + "integrity": "sha512-hJf1eiWPw9O5ed7HUtFHtHhqnWDpm42Q5iC3xs6p99kr1qrVMq8WR2x+yobx6rY5F26Ki2NqGvJTe8v/Fax0kw==", + "requires": { + "lodash.foreach": "4.5.0", + "lodash.get": "4.4.2" + } + }, + "morgan": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.8.2.tgz", + "integrity": "sha1-eErHc05KRTqcbm6GgKkyknXItoc=", + "requires": { + "basic-auth": "1.1.0", + "debug": "2.6.8", + "depd": "1.1.1", + "on-finished": "2.3.0", + "on-headers": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "mpath": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.3.0.tgz", + "integrity": "sha1-elj3iem1/TyUUgY0FXlg8mvV70Q=" + }, + "mpromise": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mpromise/-/mpromise-0.5.5.tgz", + "integrity": "sha1-9bJCWddjrMIlewoMjG2Gb9UXMuY=" + }, + "mquery": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-2.3.2.tgz", + "integrity": "sha512-KXWMypZSvhCuqRtza+HMQZdYw7PfFBjBTFvP31NNAq0OX0/NTIgpcDpkWQ2uTxk6vGQtwQ2elhwhs+ZvCA8OaA==", + "requires": { + "bluebird": "3.5.1", + "debug": "2.6.9", + "regexp-clone": "0.0.1", + "sliced": "0.0.5" + }, + "dependencies": { + "sliced": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz", + "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8=" + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "muri": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/muri/-/muri-1.3.0.tgz", + "integrity": "sha512-FiaFwKl864onHFFUV/a2szAl7X0fxVlSKNdhTf+BM8i8goEgYut8u5P9MqQqIYwvaMxjzVESsoEm/2kfkFH1rg==" + }, + "nan": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", + "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", + "dev": true, + "optional": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "nodemon": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.12.1.tgz", + "integrity": "sha1-mWpW3EnZ8Wu/G3ik3gjxNjSzh40=", + "dev": true, + "requires": { + "chokidar": "1.7.0", + "debug": "2.6.9", + "es6-promise": "3.3.1", + "ignore-by-default": "1.0.1", + "lodash.defaults": "3.1.2", + "minimatch": "3.0.4", + "ps-tree": "1.1.0", + "touch": "3.1.0", + "undefsafe": "0.0.3", + "update-notifier": "2.3.0" + }, + "dependencies": { + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", + "dev": true + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.1", + "registry-url": "3.1.0", + "semver": "5.4.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "parsleyjs": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/parsleyjs/-/parsleyjs-2.8.0.tgz", + "integrity": "sha1-pVEfw0Z9IrwYolpuLXMESS3WW/0=", + "requires": { + "jquery": "3.2.1" + } + }, + "passport": { + "version": "0.1.18", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.1.18.tgz", + "integrity": "sha1-yCZEedy2QUytu2Z1LRKzfgtlJaE=", + "requires": { + "pause": "0.0.1", + "pkginfo": "0.2.3" + } + }, + "passport-local": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-0.1.6.tgz", + "integrity": "sha1-+wz4KASNuTG2fRmYXHqgbdN3qds=", + "requires": { + "passport": "0.1.18", + "pkginfo": "0.2.3" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "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=" + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkginfo": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.2.3.tgz", + "integrity": "sha1-cjnEKl72wwuPMoQ52bn/cQQkkPg=" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "2.0.6" + } + }, + "proxy-addr": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", + "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.4.0" + } + }, + "ps-tree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", + "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", + "dev": true, + "requires": { + "event-stream": "3.3.4" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "pug": { + "version": "2.0.0-rc.4", + "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.0-rc.4.tgz", + "integrity": "sha512-SL7xovj6E2Loq9N0UgV6ynjMLW4urTFY/L/Fprhvz13Xc5vjzkjZjI1QHKq31200+6PSD8PyU6MqrtCTJj6/XA==", + "requires": { + "pug-code-gen": "2.0.0", + "pug-filters": "2.1.5", + "pug-lexer": "3.1.0", + "pug-linker": "3.0.3", + "pug-load": "2.0.9", + "pug-parser": "4.0.0", + "pug-runtime": "2.0.3", + "pug-strip-comments": "1.0.2" + } + }, + "pug-attrs": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.2.tgz", + "integrity": "sha1-i+KyIlVo/6ddG4Zpgr/59BEa/8s=", + "requires": { + "constantinople": "3.1.0", + "js-stringify": "1.0.2", + "pug-runtime": "2.0.3" + } + }, + "pug-code-gen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.0.tgz", + "integrity": "sha512-E4oiJT+Jn5tyEIloj8dIJQognbiNNp0i0cAJmYtQTFS0soJ917nlIuFtqVss3IXMEyQKUew3F4gIkBpn18KbVg==", + "requires": { + "constantinople": "3.1.0", + "doctypes": "1.1.0", + "js-stringify": "1.0.2", + "pug-attrs": "2.0.2", + "pug-error": "1.3.2", + "pug-runtime": "2.0.3", + "void-elements": "2.0.1", + "with": "5.1.1" + } + }, + "pug-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.2.tgz", + "integrity": "sha1-U659nSm7A89WRJOgJhCfVMR/XyY=" + }, + "pug-filters": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-2.1.5.tgz", + "integrity": "sha512-xkw71KtrC4sxleKiq+cUlQzsiLn8pM5+vCgkChW2E6oNOzaqTSIBKIQ5cl4oheuDzvJYCTSYzRaVinMUrV4YLQ==", + "requires": { + "clean-css": "3.4.28", + "constantinople": "3.1.0", + "jstransformer": "1.0.0", + "pug-error": "1.3.2", + "pug-walk": "1.1.5", + "resolve": "1.5.0", + "uglify-js": "2.8.29" + } + }, + "pug-lexer": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-3.1.0.tgz", + "integrity": "sha1-/QhzdtSmdbT1n4/vQiiDQ06VgaI=", + "requires": { + "character-parser": "2.2.0", + "is-expression": "3.0.0", + "pug-error": "1.3.2" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + }, + "is-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", + "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=", + "requires": { + "acorn": "4.0.13", + "object-assign": "4.1.1" + } + } + } + }, + "pug-linker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.3.tgz", + "integrity": "sha512-DCKczglCXOzJ1lr4xUj/lVHYvS+lGmR2+KTCjZjtIpdwaN7lNOoX2SW6KFX5X4ElvW+6ThwB+acSUg08UJFN5A==", + "requires": { + "pug-error": "1.3.2", + "pug-walk": "1.1.5" + } + }, + "pug-load": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.9.tgz", + "integrity": "sha512-BDdZOCru4mg+1MiZwRQZh25+NTRo/R6/qArrdWIf308rHtWA5N9kpoUskRe4H6FslaQujC+DigH9LqlBA4gf6Q==", + "requires": { + "object-assign": "4.1.1", + "pug-walk": "1.1.5" + } + }, + "pug-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-4.0.0.tgz", + "integrity": "sha512-ocEUFPdLG9awwFj0sqi1uiZLNvfoodCMULZzkRqILryIWc/UUlDlxqrKhKjAIIGPX/1SNsvxy63+ayEGocGhQg==", + "requires": { + "pug-error": "1.3.2", + "token-stream": "0.0.1" + } + }, + "pug-runtime": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.3.tgz", + "integrity": "sha1-mBYmB7D86eJU1CfzOYelrucWi9o=" + }, + "pug-strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.2.tgz", + "integrity": "sha1-0xOvoBvMN0mA4TmeI+vy65vchRM=", + "requires": { + "pug-error": "1.3.2" + } + }, + "pug-walk": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.5.tgz", + "integrity": "sha512-rJlH1lXerCIAtImXBze3dtKq/ykZMA4rpO9FnPcIgsWcxZLOvd8zltaoeOVFyBSSqCkhhJWbEbTMga8UxWUUSA==" + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", + "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=", + "requires": { + "bytes": "2.4.0", + "iconv-lite": "0.4.15", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz", + "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=", + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", + "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.2.7", + "set-immediate-shim": "1.0.1" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regexp-clone": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", + "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" + }, + "registry-auth-token": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", + "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "dev": true, + "requires": { + "rc": "1.2.2", + "safe-buffer": "5.1.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "1.2.2" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "2.0.0", + "semver": "5.4.1" + } + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "0.1.4" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "5.4.1" + } + }, + "send": { + "version": "0.15.6", + "resolved": "https://registry.npmjs.org/send/-/send-0.15.6.tgz", + "integrity": "sha1-IPI6nJJbdiq4JwX+L52yUqzkfjQ=", + "requires": { + "debug": "2.6.9", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.3.4", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "serve-favicon": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.5.tgz", + "integrity": "sha512-s7F8h2NrslMkG50KxvlGdj+ApSwaLex0vexuJ9iFf3GLTIp1ph/l1qZvRe9T9TJEYZgmq72ZwJ2VYiAEtChknw==", + "requires": { + "etag": "1.8.1", + "fresh": "0.5.2", + "ms": "2.0.0", + "parseurl": "1.3.2", + "safe-buffer": "5.1.1" + } + }, + "serve-static": { + "version": "1.12.6", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.6.tgz", + "integrity": "sha1-uXN3P2NEmTTaVOW+ul4x2fQhFXc=", + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.15.6" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "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=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "1.0.1" + } + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "0.1.1" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "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=", + "dev": true + }, + "superagent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-2.3.0.tgz", + "integrity": "sha1-cDUpoHFOV+EjlZ3e+84ZOy5Q0RU=", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "cookiejar": "2.0.6", + "debug": "2.6.9", + "extend": "3.0.1", + "form-data": "1.0.0-rc4", + "formidable": "1.1.1", + "methods": "1.1.2", + "mime": "1.3.4", + "qs": "6.4.0", + "readable-stream": "2.2.7" + } + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "0.7.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "token-stream": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", + "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "1.0.10" + } + }, + "type-detect": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", + "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", + "dev": true + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "uid2": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", + "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" + }, + "undefsafe": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz", + "integrity": "sha1-7Mo6A+VrmvFzhbqsgSrIO5lKli8=", + "dev": true + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "update-notifier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", + "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", + "dev": true, + "requires": { + "boxen": "1.2.2", + "chalk": "2.3.0", + "configstore": "3.1.1", + "import-lazy": "2.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "1.0.4" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + }, + "validator": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz", + "integrity": "sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "widest-line": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", + "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "dev": true, + "requires": { + "string-width": "1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "with": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", + "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=", + "requires": { + "acorn": "3.3.0", + "acorn-globals": "3.1.0" + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } +} diff --git a/package.json b/package.json index 90d129a..dcdfe04 100644 --- a/package.json +++ b/package.json @@ -9,23 +9,24 @@ "test-watch": "nodemon --exec 'npm test'" }, "dependencies": { + "bcrypt-nodejs": "latest", "body-parser": "~1.17.1", "connect-flash": "^0.1.1", "cookie-parser": "~1.4.3", "debug": "~2.6.3", "express": "~4.15.2", + "express-session": "~1.0.0", "jquery": "^3.2.1", + "method-override": "~1.0.0", "mongoose": "^4.7.2", "mongoose-unique-validator": "^1.0.5", "morgan": "~1.8.1", + "parsleyjs": "^2.8.0", + "passport": "~0.1.17", + "passport-local": "~0.1.6", "pug": "~2.0.0-beta11", "serve-favicon": "~2.4.2", - "validator": "^8.0.0", - "passport" : "~0.1.17", - "passport-local" : "~0.1.6", - "bcrypt-nodejs" : "latest", - "method-override": "~1.0.0", - "express-session": "~1.0.0" + "validator": "^8.0.0" }, "devDependencies": { "chai": "^4.0.2", diff --git a/views/layout.pug b/views/layout.pug index 15ca27e..e785e69 100644 --- a/views/layout.pug +++ b/views/layout.pug @@ -7,6 +7,8 @@ html link(rel='stylesheet', href='/stylesheets/style.css') link(href="https://fonts.googleapis.com/css?family=Source+Sans+Pro" rel="stylesheet") script(type='text/javascript' src='../javascripts/shared.js') + script(src='node_modules/jquery/dist/jquery.js') + script(src='node_modules/parsleyjs/dist/parsley.min.js') body .container.mt-5 include includes/header From 4d95b81bcd48c57eda631703175781a19063d282 Mon Sep 17 00:00:00 2001 From: Hazelton Jacob Date: Sat, 11 Nov 2017 19:52:57 +0900 Subject: [PATCH 67/81] add parsley field validation on course create --- package-lock.json | 5 +++++ package.json | 1 + views/courses/create.pug | 6 +++--- views/layout.pug | 5 +++-- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index ecc5379..31ef3bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3290,6 +3290,11 @@ "semver": "5.4.1" } }, + "requirejs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.5.tgz", + "integrity": "sha512-svnO+aNcR/an9Dpi44C7KSAy5fFGLtmPbaaCeQaklUz8BQhS64tWWIIlvEA5jrWICzlO/X9KSzSeXFnZdBu8nw==" + }, "resolve": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", diff --git a/package.json b/package.json index dcdfe04..147e9ea 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "passport": "~0.1.17", "passport-local": "~0.1.6", "pug": "~2.0.0-beta11", + "requirejs": "^2.3.5", "serve-favicon": "~2.4.2", "validator": "^8.0.0" }, diff --git a/views/courses/create.pug b/views/courses/create.pug index e84ba1d..7c420f1 100644 --- a/views/courses/create.pug +++ b/views/courses/create.pug @@ -8,10 +8,10 @@ block content div(class="col-md-8") h2 Register a new course - form(method="Post" action="/courses/create") + form(method="Post" action="/courses/create" data-parsley-validate="") div(class="form-group") label(for="title") Name - input(class="form-control" type="text" name="title" id="title") + input(class="form-control" type="text" name="title" id="title" required="" data-parsley-minlength="10" data-parsley-maxlength="40") label(for="description") Description - textarea(class="form-control" name="description" id="description") + textarea(class="form-control" name="description" id="description" data-parsley-trigger="keyup" data-parsley-minlength="20" data-parsley-maxlength="100" data-parsley-minlength-message="Come on! You need to enter at least a 20 character comment.." data-parsley-validation-threshold="10") input(class="btn btn-success" type="submit") diff --git a/views/layout.pug b/views/layout.pug index e785e69..2669350 100644 --- a/views/layout.pug +++ b/views/layout.pug @@ -7,8 +7,9 @@ html link(rel='stylesheet', href='/stylesheets/style.css') link(href="https://fonts.googleapis.com/css?family=Source+Sans+Pro" rel="stylesheet") script(type='text/javascript' src='../javascripts/shared.js') - script(src='node_modules/jquery/dist/jquery.js') - script(src='node_modules/parsleyjs/dist/parsley.min.js') + script(src="https://code.jquery.com/jquery-3.2.1.js") + script(src="https://cdnjs.cloudflare.com/ajax/libs/parsley.js/2.8.0/parsley.js") + body .container.mt-5 include includes/header From 71bbf3b71658db393e9e40fa1a41fe09cd148676 Mon Sep 17 00:00:00 2001 From: Hazelton Jacob Date: Sat, 11 Nov 2017 19:57:17 +0900 Subject: [PATCH 68/81] update field validations on course create --- views/courses/create.pug | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/courses/create.pug b/views/courses/create.pug index 7c420f1..8aaf1c1 100644 --- a/views/courses/create.pug +++ b/views/courses/create.pug @@ -11,7 +11,7 @@ block content form(method="Post" action="/courses/create" data-parsley-validate="") div(class="form-group") label(for="title") Name - input(class="form-control" type="text" name="title" id="title" required="" data-parsley-minlength="10" data-parsley-maxlength="40") + input(class="form-control" type="text" name="title" id="title" required="" data-parsley-minlength="5" data-parsley-maxlength="40" data-parsley-minlength-message="Name must be longer than 5 characters.") label(for="description") Description - textarea(class="form-control" name="description" id="description" data-parsley-trigger="keyup" data-parsley-minlength="20" data-parsley-maxlength="100" data-parsley-minlength-message="Come on! You need to enter at least a 20 character comment.." data-parsley-validation-threshold="10") + textarea(class="form-control" name="description" id="description" data-parsley-trigger="keyup" data-parsley-minlength="20" data-parsley-maxlength="100" data-parsley-minlength-message="Description must be longer than 20 characters." data-parsley-validation-threshold="10") input(class="btn btn-success" type="submit") From 44b66b752f90e95956c5512aa507af367b69ad18 Mon Sep 17 00:00:00 2001 From: Hazelton Jacob Date: Sat, 11 Nov 2017 20:09:45 +0900 Subject: [PATCH 69/81] add field validation on users signup --- views/users/signup.pug | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/views/users/signup.pug b/views/users/signup.pug index 5b9b53f..fc959ed 100644 --- a/views/users/signup.pug +++ b/views/users/signup.pug @@ -17,12 +17,12 @@ block content strong Error! #{error} - } - form(method="Post" action="/users/signup") + form(method="Post" action="/users/signup" data-parsley-validate="") div(class="form-group") label(for="name") Username - input(class="form-control" type="text" name="name" id="name") + input(class="form-control" type="text" name="name" data-parsley-minlength="5" data-parsley-maxlength="40" data-parsley-minlength-message="Username must be longer than 5 characters." required="") label(for="email") Email - input(class="form-control" type="email" name="email" id="email") + input(class="form-control" type="email" name="email" id="email" required="" data-parsley-trigger="change") input(type="text" name="courseId" value=course._id hidden) input(type="text" name="courseTitle" value=course.title hidden) input(class="btn btn-success" type="submit") From 6b380b86878fb4fc4751e8961777d3095ace4c4c Mon Sep 17 00:00:00 2001 From: Hazelton Jacob Date: Sun, 12 Nov 2017 11:45:42 +0900 Subject: [PATCH 70/81] remove parsleyjs validation to use bootstrap built-in validation --- package-lock.json | 8 -------- package.json | 1 - views/courses/create.pug | 6 +++--- views/layout.pug | 2 -- views/users/signup.pug | 6 +++--- 5 files changed, 6 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 31ef3bc..cacba38 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2860,14 +2860,6 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, - "parsleyjs": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/parsleyjs/-/parsleyjs-2.8.0.tgz", - "integrity": "sha1-pVEfw0Z9IrwYolpuLXMESS3WW/0=", - "requires": { - "jquery": "3.2.1" - } - }, "passport": { "version": "0.1.18", "resolved": "https://registry.npmjs.org/passport/-/passport-0.1.18.tgz", diff --git a/package.json b/package.json index 147e9ea..a7ebebc 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ "mongoose": "^4.7.2", "mongoose-unique-validator": "^1.0.5", "morgan": "~1.8.1", - "parsleyjs": "^2.8.0", "passport": "~0.1.17", "passport-local": "~0.1.6", "pug": "~2.0.0-beta11", diff --git a/views/courses/create.pug b/views/courses/create.pug index 8aaf1c1..e84ba1d 100644 --- a/views/courses/create.pug +++ b/views/courses/create.pug @@ -8,10 +8,10 @@ block content div(class="col-md-8") h2 Register a new course - form(method="Post" action="/courses/create" data-parsley-validate="") + form(method="Post" action="/courses/create") div(class="form-group") label(for="title") Name - input(class="form-control" type="text" name="title" id="title" required="" data-parsley-minlength="5" data-parsley-maxlength="40" data-parsley-minlength-message="Name must be longer than 5 characters.") + input(class="form-control" type="text" name="title" id="title") label(for="description") Description - textarea(class="form-control" name="description" id="description" data-parsley-trigger="keyup" data-parsley-minlength="20" data-parsley-maxlength="100" data-parsley-minlength-message="Description must be longer than 20 characters." data-parsley-validation-threshold="10") + textarea(class="form-control" name="description" id="description") input(class="btn btn-success" type="submit") diff --git a/views/layout.pug b/views/layout.pug index 2669350..eceacf7 100644 --- a/views/layout.pug +++ b/views/layout.pug @@ -7,8 +7,6 @@ html link(rel='stylesheet', href='/stylesheets/style.css') link(href="https://fonts.googleapis.com/css?family=Source+Sans+Pro" rel="stylesheet") script(type='text/javascript' src='../javascripts/shared.js') - script(src="https://code.jquery.com/jquery-3.2.1.js") - script(src="https://cdnjs.cloudflare.com/ajax/libs/parsley.js/2.8.0/parsley.js") body .container.mt-5 diff --git a/views/users/signup.pug b/views/users/signup.pug index fc959ed..300fd5b 100644 --- a/views/users/signup.pug +++ b/views/users/signup.pug @@ -17,12 +17,12 @@ block content strong Error! #{error} - } - form(method="Post" action="/users/signup" data-parsley-validate="") + form(method="Post" action="/users/signup") div(class="form-group") label(for="name") Username - input(class="form-control" type="text" name="name" data-parsley-minlength="5" data-parsley-maxlength="40" data-parsley-minlength-message="Username must be longer than 5 characters." required="") + input(class="form-control" type="text" name="name") label(for="email") Email - input(class="form-control" type="email" name="email" id="email" required="" data-parsley-trigger="change") + input(class="form-control" type="email" name="email" id="email") input(type="text" name="courseId" value=course._id hidden) input(type="text" name="courseTitle" value=course.title hidden) input(class="btn btn-success" type="submit") From ad5fb04b3127347c80b383b7f36296440831ba3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?TTS=EA=B8=B0=EC=88=A0=EB=8B=B4=EB=8B=B9=20=EC=A1=B0?= =?UTF-8?q?=ED=98=84=EC=84=9D?= Date: Mon, 13 Nov 2017 14:09:18 +0900 Subject: [PATCH 71/81] Fixed update checkIns test --- test/user/modelUpdate.test.js | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/test/user/modelUpdate.test.js b/test/user/modelUpdate.test.js index f8c8193..a25dc02 100644 --- a/test/user/modelUpdate.test.js +++ b/test/user/modelUpdate.test.js @@ -130,20 +130,12 @@ describe('User modelUpdate', () => { User.where({username: 'joe'}).fetch({withRelated: 'checkIns'}) .then(user => { return user.checkIns().create({}) - .then(newCheckIn => { - // const checkInUser = newCheckIn.user(); - // const relatedUser = newCheckIn.related('user'); - // assert(newCheckIn.user().get('id') === user.get('id')); - // return newCheckIn.user(); - return newCheckIn.refresh({withRelated: 'user'}); + .then(checkIn => { + return checkIn.related('user').fetch({withRelated: 'checkIns'}); }) - .then(updatedCheckIn => { - assert(updatedCheckIn.user().get('id') === user.get('id')); - assert(updatedCheckIn.user().checkIns().length === 2); - return updatedCheckIn.user(); - }) - .then(user => { - assert(user.checkIns().length === 2); + .then(checkedInUser => { + assert(checkedInUser.get('id') === user.get('id')); + assert(checkedInUser.related('checkIns').length === 2); done(); }) .catch(err => done(err)); From e47388fb2d00c6263abda79272c2dbe493706950 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 13 Nov 2017 14:22:43 +0900 Subject: [PATCH 72/81] Fixed user model update --- test/user/modelUpdate.test.js | 84 ++++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 35 deletions(-) diff --git a/test/user/modelUpdate.test.js b/test/user/modelUpdate.test.js index a25dc02..d736331 100644 --- a/test/user/modelUpdate.test.js +++ b/test/user/modelUpdate.test.js @@ -48,77 +48,91 @@ describe('User modelUpdate', () => { }); it('Should update Username', (done) => { - joe.username = 'jane'; - joe.save() - .then(() => User.where({id: joe.id}).fetch()) - .then((result) => { - assert(result.username === 'jane'); + + User.where({username: 'joe'}).fetch() + .then(user => { + return user.save({username: 'jane'}); + }) + .then(user => { + assert(user.get('username') === 'jane'); done(); }) .catch(err => done(err)); }); it('Should update Name', (done) => { - joe.name = 'jane smith'; - joe.save() - .then(() => User.where({id: joe.id}).fetch()) - .then((result) => { - assert(result.name === 'jane smith'); + + User.where({username: 'joe'}).fetch() + .then(user => { + return user.save({name: 'jane smith'}); + }) + .then(user => { + assert(user.get('name') === 'jane smith'); done(); }) .catch(err => done(err)); }); it('Should update Email', (done) => { - joe.email = 'm@m.com'; - joe.save() - .then(() => User.where({id: joe.id}).fetch()) - .then((result) => { - assert(result.email === 'm@m.com'); + + User.where({username: 'joe'}).fetch() + .then(user => { + return user.save({email: 'm@m.com'}); + }) + .then(user => { + assert(user.get('email') === 'm@m.com'); done(); }) .catch(err => done(err)); }); it('Should update Level', (done) => { - joe.level = 'instructor'; - joe.save() - .then(() => User.where({id: joe.id}).fetch()) - .then((result) => { - assert(result.level === 'instructor'); + + User.where({username: 'joe'}).fetch() + .then(user => { + return user.save({level: 'instructor'}); + }) + .then(user => { + assert(user.get('level') === 'instructor'); done(); }) .catch(err => done(err)); }); it('Should update Website', (done) => { - joe.website = 'www.github.com'; - joe.save() - .then(() => User.where({id: joe.id}).fetch()) - .then((result) => { - assert(result.website === 'www.github.com'); + + User.where({username: 'joe'}).fetch() + .then(user => { + return user.save({website: 'www.github.com'}); + }) + .then(user => { + assert(user.get('website') === 'www.github.com'); done(); }) .catch(err => done(err)); }); it('Should update Hometown', (done) => { - joe.hometown = 'Capetown, South Africa'; - joe.save() - .then(() => User.where({id: joe.id}).fetch()) - .then((result) => { - assert(result.hometown === 'Capetown, South Africa'); + + User.where({username: 'joe'}).fetch() + .then(user => { + return user.save({hometown: 'Capetown, South Africa'}); + }) + .then(user => { + assert(user.get('hometown') === 'Capetown, South Africa'); done(); }) .catch(err => done(err)); }); it('Should update Description', (done) => { - joe.description = 'I like to play guitar'; - joe.save() - .then(() => User.where({id: joe.id}).fetch()) - .then((result) => { - assert(result.description === 'I like to play guitar'); + + User.where({username: 'joe'}).fetch() + .then(user => { + return user.save({description: 'I like to play guitar'}); + }) + .then(user => { + assert(user.get('description') === 'I like to play guitar'); done(); }) .catch(err => done(err)); From c1cfc125aafe92c5712a5ccc55eda06b62afb3ab Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 13 Nov 2017 14:45:55 +0900 Subject: [PATCH 73/81] Progress on passing tests --- test/user/modelCreate.test.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/test/user/modelCreate.test.js b/test/user/modelCreate.test.js index 1f891f0..904faec 100644 --- a/test/user/modelCreate.test.js +++ b/test/user/modelCreate.test.js @@ -20,20 +20,21 @@ describe('User modelCreate', () => { afterEach((done) => { knex('user').truncate() - .then(() => knex('check_in').truncate()) + .then(() => { + return knex('check_in').truncate(); + }) .then(() => done()) .catch(err => done(err)); }); it('Should create a new User record', (done) => { - assert(!joe.isNew); + assert(!joe.isNew()); done() }); it('Should be able to set Username', (done) => { joe.username = 'joe'; joe.save() - .then(() => User.where({id: joe.id}).fetch()) .then(result => { assert(result.username === 'joe'); done() @@ -44,7 +45,6 @@ describe('User modelCreate', () => { it('Should be able to set Name', (done) => { joe.name = 'joe billy bob'; joe.save() - .then(() => User.where({id: joe.id}).fetch()) .then(result => { assert(result.name === 'joe billy bob'); done() @@ -55,7 +55,6 @@ describe('User modelCreate', () => { it('Should be able to set Description', (done) => { joe.description = 'I like to surf'; joe.save() - .then(() => User.where({id: joe.id}).fetch()) .then(result => { assert(result.description === 'I like to surf'); done() @@ -66,7 +65,6 @@ describe('User modelCreate', () => { it('Should be able to set Email', (done) => { joe.email = 'mail@mail.com'; joe.save() - .then(() => User.where({id: joe.id}).fetch()) .then(result => { assert(result.email === 'mail@mail.com'); done() @@ -77,7 +75,6 @@ describe('User modelCreate', () => { it('Should be able to set Hometown', (done) => { joe.hometown = 'Detroit'; joe.save() - .then(() => User.where({id: joe.id}).fetch()) .then(result => { assert(result.hometown === 'Detroit'); done() @@ -88,7 +85,6 @@ describe('User modelCreate', () => { it('Should be able to set Website', (done) => { joe.website = 'mail.com'; joe.save() - .then(() => User.where({id: joe.id}).fetch()) .then(result => { assert(result.website === 'mail.com'); done() From c427ad15f325d6eccf6c55cac5d4106418a0761b Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 13 Nov 2017 17:46:12 +0900 Subject: [PATCH 74/81] Fixed test and attribute-setting styles. Added default value handler to User model --- models/User.js | 7 +++++ test/event/modelCreate.test.js | 8 ++---- test/user/modelCreate.test.js | 50 ++++++++++++++++++---------------- 3 files changed, 36 insertions(+), 29 deletions(-) diff --git a/models/User.js b/models/User.js index fecec9c..dcccf2a 100644 --- a/models/User.js +++ b/models/User.js @@ -11,6 +11,7 @@ const User = bookshelf.Model.extend({ initialize: function () { this.on('saving', this.hashPassword, this); + this.on('saving', this.setDefaults, this); }, checkIns: function () { @@ -69,6 +70,12 @@ const User = bookshelf.Model.extend({ comparePassword: function (candidatePassword) { return bcrypt.compare(candidatePassword, this.get('password')); + }, + + setDefaults: function (model, attrs, options) { + if (!attrs.level && !model.level) { + model.set('level', 'student'); + } } }); diff --git a/test/event/modelCreate.test.js b/test/event/modelCreate.test.js index 567dcaf..46c01c9 100644 --- a/test/event/modelCreate.test.js +++ b/test/event/modelCreate.test.js @@ -35,10 +35,9 @@ describe('Event modelCreate', () => { }); it('Should be able to set Event Description', (done) => { - baseEvent.description = "beginner sql"; - baseEvent.save() + baseEvent.save({description: 'beginner sql'}) .then(result => { - assert(result.description === "beginner sql"); + assert(result.get('description') === 'beginner sql'); done(); }) .catch(err => { @@ -47,8 +46,7 @@ describe('Event modelCreate', () => { }); it('Should be able to set Event Type', (done) => { - baseEvent.type = 'Workshop'; - baseEvent.save() + baseEvent.save({type: 'Workshop'}) .then(() => Event.where({title: 'Test Event'}).fetch()) .then(result => { assert(result.get('type') === 'Workshop'); diff --git a/test/user/modelCreate.test.js b/test/user/modelCreate.test.js index 904faec..1776c09 100644 --- a/test/user/modelCreate.test.js +++ b/test/user/modelCreate.test.js @@ -33,72 +33,74 @@ describe('User modelCreate', () => { }); it('Should be able to set Username', (done) => { - joe.username = 'joe'; - joe.save() + joe.save({username: 'joe'}) + .then(result => { + assert(result.get('username') === 'joe'); + done() + }) + .catch(err => done(err)); + }); + + it('Should hash password', (done) => { + joe.save({password: 'newpass'}) + .then(result => { + assert(result.get('password') !== 'newpass'); + return result.comparePassword('newpass'); + }) .then(result => { - assert(result.username === 'joe'); + assert(result); done() }) .catch(err => done(err)); }); it('Should be able to set Name', (done) => { - joe.name = 'joe billy bob'; - joe.save() + joe.save({name: 'joe billy bob'}) .then(result => { - assert(result.name === 'joe billy bob'); + assert(result.get('name') === 'joe billy bob'); done() }) .catch(err => done(err)); }); it('Should be able to set Description', (done) => { - joe.description = 'I like to surf'; - joe.save() + joe.save({description: 'I like to surf'}) .then(result => { - assert(result.description === 'I like to surf'); + assert(result.get('description') === 'I like to surf'); done() }) .catch(err => done(err)); }); it('Should be able to set Email', (done) => { - joe.email = 'mail@mail.com'; - joe.save() + joe.save({email: 'mail@mail.com'}) .then(result => { - assert(result.email === 'mail@mail.com'); + assert(result.get('email') === 'mail@mail.com'); done() }) .catch(err => done(err)); }); it('Should be able to set Hometown', (done) => { - joe.hometown = 'Detroit'; - joe.save() + joe.save({hometown: 'Detroit'}) .then(result => { - assert(result.hometown === 'Detroit'); + assert(result.get('hometown') === 'Detroit'); done() }) .catch(err => done(err)); }); it('Should be able to set Website', (done) => { - joe.website = 'mail.com'; - joe.save() + joe.save({website: 'mail.com'}) .then(result => { - assert(result.website === 'mail.com'); + assert(result.get('website') === 'mail.com'); done() }) .catch(err => done(err)); }); it('Should set Level to student by default', (done) => { - assert(joe.level === 'student'); - done() - }); - - it('Should set Hometown to hometown by default', (done) => { - assert(joe.hometown === 'hometown'); + assert(joe.get('level') === 'student'); done() }); From 4faa8076a7df6e952f0e03b9c7e6bba68d9dd226 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 13 Nov 2017 17:51:31 +0900 Subject: [PATCH 75/81] Fixed user destroy model test --- test/user/modelDestroy.test.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/test/user/modelDestroy.test.js b/test/user/modelDestroy.test.js index a9db4e7..5f0c371 100644 --- a/test/user/modelDestroy.test.js +++ b/test/user/modelDestroy.test.js @@ -28,12 +28,17 @@ describe('User modelDestroy', () => { password: 'otherpass' }); jane.save() - .then(() => new User({id: joe.id}.destroy())) - .then(() => User.fetchAll()) + .then(() => { + return User.where({username: 'joe'}).fetch(); + }) + .then(user => { + user.destroy(); + }) + .then(() => User.forge().fetchAll()) .then(results => { assert(results.length === 1); - assert(results[0].id === jane.id); - done() + assert(results.at(0).get('username') === 'jane'); + done(); }) .catch(err => done(err)); }); From da4ad009f1372b4f4ea543056c37caa9402a6e20 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 13 Nov 2017 19:08:51 +0900 Subject: [PATCH 76/81] Fixed user checkin test --- test/event/modelCreate.test.js | 3 ++- test/user/modelCreate.test.js | 13 ++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/test/event/modelCreate.test.js b/test/event/modelCreate.test.js index 46c01c9..b453205 100644 --- a/test/event/modelCreate.test.js +++ b/test/event/modelCreate.test.js @@ -63,9 +63,10 @@ describe('Event modelCreate', () => { done(); }); + // TODO: verify test is valid. I think maybe it should be failing it('Should be able to set CreatedBy', (done) => { const joe = new User(); - baseEvent.instructors().push({id: joe.id}); + baseEvent.instructors().push({id: joe.get('id')}); baseEvent.save() .then(() => Event.where({title: 'Test Event'}).fetch()) .then(result => { diff --git a/test/user/modelCreate.test.js b/test/user/modelCreate.test.js index 1776c09..60c556d 100644 --- a/test/user/modelCreate.test.js +++ b/test/user/modelCreate.test.js @@ -105,12 +105,15 @@ describe('User modelCreate', () => { }); it('Should be able to set CheckIns', (done) => { - const firstCheckIn = new CheckIn({}); - joe.checkIns.push(firstCheckIn); - joe.save() - .then(() => User.where({id: joe.id}).fetch()) + const firstCheckIn = new CheckIn(); + firstCheckIn.save() + .then(savedCheckIn => { + return joe.checkIns().create(savedCheckIn); + }) + .then(updatedUser => User.where({id: joe.get('id')}).fetch({withRelated: 'checkIns'})) .then(result => { - assert(String(result.checkIns) === String(firstCheckIn.id)); + assert(result.related('checkIns').length === 1); + assert(result.related('checkIns').at(0).get('id') === firstCheckIn.get('id')); done() }) .catch(err => done(err)); From c791099332f1116826782a83ec94c438f3d968a9 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Mon, 13 Nov 2017 19:19:22 +0900 Subject: [PATCH 77/81] Fixed last broken test. Updated repositories appropriately --- src/eventRepository.js | 4 ++-- src/userRepository.js | 4 ++-- test/user/repo.test.js | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/eventRepository.js b/src/eventRepository.js index 1dc7f48..0503fad 100644 --- a/src/eventRepository.js +++ b/src/eventRepository.js @@ -22,8 +22,8 @@ module.exports = { return Event.where('id', id).fetch({withRelated: ['instructors', 'createdBy', 'checkIns']}); }, - updateEvent(id, event) { - return Event.where('id', id).save(event, {patch: true}); + updateEvent(id, attributesToUpdate) { + return new Event({'id': id}).save(attributesToUpdate, {patch: true}); }, deleteEvent(id) { diff --git a/src/userRepository.js b/src/userRepository.js index 32a4a75..f482d73 100644 --- a/src/userRepository.js +++ b/src/userRepository.js @@ -33,8 +33,8 @@ module.exports = { return User.where('username', username).fetch(); }, - updateUser(id, user) { - return User.where('id', id).save(user, {patch: true}); + updateUser(id, attributesToUpdate) { + return new User({id: id}).save(attributesToUpdate, {patch: true}); }, deleteUser(id) { diff --git a/test/user/repo.test.js b/test/user/repo.test.js index 46d4b2e..728e361 100644 --- a/test/user/repo.test.js +++ b/test/user/repo.test.js @@ -88,7 +88,8 @@ describe('User Repo routes', () => { it('should update existing user with updateUser()', (done) => { const jane = {username: 'jane', email: 'jane@mail.com', password: 'datpass'}; - let toBeUpdated = new User({email: 'thadious@m.com'}); + //let toBeUpdated = new User({email: 'thadious@m.com'}); + let toBeUpdated = {email: 'thadious@m.com'}; Repo.createUser(jane) .then(() => { return Repo.updateUser(tad.get('id'), toBeUpdated); From efdb2e1a3f3f137683043727ec35581df22f01ca Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Tue, 14 Nov 2017 11:29:36 +0900 Subject: [PATCH 78/81] Updated README for sqlite-based system. Updated package-lock.json. Fixed database config template --- README.md | 22 +- config/database.template.js | 4 +- package-lock.json | 1684 +++++++++++++++++++++++++++++++---- 3 files changed, 1532 insertions(+), 178 deletions(-) diff --git a/README.md b/README.md index 7cad51b..a1d4e07 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This is a tool to help Learn Teach Code track and manage attendance to meetup ev See Issues for the features we're working on. -Currently, the application has no authentication, and anyone can create events or register. The application is not yet ready for production, but the core features of event creation and attendance marking are there. +The application is not yet ready for production, but the core features of event creation and attendance marking are there. ## Setup instructions @@ -16,14 +16,13 @@ We'll assume you have no experience with NodeJS or the ecosystem. * `/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"` 2. [Install NodeJS](https://nodejs.org/en/download/package-manager/#macos) * `brew install node` -3. [Install MongoDB](https://treehouse.github.io/installation-guides/mac/mongo-mac.html) - 1. `brew install mongodb` - 2. `sudo mkdir -p /data/db` - 3. `sudo chown -R $(id -un) /data/db` +3. Update SQLite3 + * `brew install sqlite3` 4. Install dependencies * In the project directory, `npm install` -5. Run MongoDB - * `mongod` +5. Setup config files + 1. Copy config/database.template.js to config/database.dev.js + 2. Remove HOST, USER, PASSWORD, DATABASE (Optional, but cleaner) 6. Run in dev mode * `npm run dev` @@ -31,8 +30,6 @@ The server runs on port 3000, so you can visit it at [`http://localhost:3000`](h ## Testing -The testing database is set to `mongodb://localhost/test-database`, so MongoDB should be for your tests - npm test => runs all tests once npm run test-watch => runs all tests each time a change is saved @@ -41,7 +38,7 @@ npm run test-watch => runs all tests each time a change is saved ## Application Design ### Collections #### Users -* _id +* id * username * password * email @@ -55,16 +52,15 @@ npm run test-watch => runs all tests each time a change is saved * updatedAt #### Event -* _id +* id * title * description -* tags * instructors * createdAt * updatedAt #### CheckIn -* _id +* id * user * event * createdAt diff --git a/config/database.template.js b/config/database.template.js index 6a11b8d..b72f6e0 100644 --- a/config/database.template.js +++ b/config/database.template.js @@ -1,7 +1,9 @@ module.exports = { + DB_TYPE: 'sqlite3', HOST: '127.0.0.1', USER: 'user', PASSWORD: 'password', DATABASE: 'database', - CHATSET: 'utf8' + CHARSET: 'utf8', + FILENAME: './db.sqlite' }; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ef2bea9..a9bcf37 100644 --- a/package-lock.json +++ b/package-lock.json @@ -103,6 +103,11 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, "are-we-there-yet": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", @@ -125,11 +130,31 @@ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "array-slice": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.0.0.tgz", + "integrity": "sha1-5zA08A3MH0CHYAj9IP6ud71LfC8=" + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", @@ -226,6 +251,11 @@ "tweetnacl": "0.14.5" } }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=" + }, "binary-extensions": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", @@ -544,6 +574,16 @@ "wordwrap": "0.0.2" } }, + "clone": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=" + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -664,6 +704,15 @@ "integrity": "sha1-Cr81atANHFohnYjURRgEbdAmrP4=", "dev": true }, + "copy-props": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-1.6.0.tgz", + "integrity": "sha1-8DJLvumXcRAeezraES8xPDk9uO0=", + "requires": { + "each-props": "1.3.1", + "is-plain-object": "2.0.4" + } + }, "core-js": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", @@ -723,6 +772,14 @@ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", "dev": true }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "requires": { + "es5-ext": "0.10.35" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -731,6 +788,11 @@ "assert-plus": "1.0.0" } }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -758,6 +820,14 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "1.0.3" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -773,6 +843,11 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=" + }, "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", @@ -812,12 +887,52 @@ "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, + "each-props": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.1.tgz", + "integrity": "sha1-/BOPUeOid0KG1IWOAtbn3kYt4Vg=", + "requires": { + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0" + } + }, "ecc-jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", @@ -837,6 +952,52 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" }, + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "requires": { + "once": "1.3.3" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "requires": { + "wrappy": "1.0.2" + } + } + } + }, + "es5-ext": { + "version": "0.10.35", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", + "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-symbol": "3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1001,6 +1162,52 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, + "fancy-log": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "requires": { + "chalk": "1.1.3", + "time-stamp": "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=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.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.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, "fast-deep-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", @@ -1049,6 +1256,11 @@ } } }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=" + }, "findup-sync": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", @@ -1060,6 +1272,33 @@ "resolve-dir": "0.1.1" } }, + "fined": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", + "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "requires": { + "expand-tilde": "2.0.2", + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0", + "object.pick": "1.3.0", + "parse-filepath": "1.0.1" + }, + "dependencies": { + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "1.0.1" + } + } + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=" + }, "flagged-respawn": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", @@ -2220,6 +2459,14 @@ } } }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "requires": { + "globule": "0.1.0" + } + }, "generic-pool": { "version": "2.5.4", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.5.4.tgz", @@ -2275,6 +2522,86 @@ "is-glob": "2.0.1" } }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "requires": { + "glob": "4.5.3", + "glob2base": "0.0.12", + "minimatch": "2.0.10", + "ordered-read-streams": "0.1.0", + "through2": "0.6.5", + "unique-stream": "1.0.0" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "2.0.10", + "once": "1.4.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "requires": { + "gaze": "0.5.2" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "requires": { + "find-index": "0.1.1" + } + }, "global-dirs": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.0.tgz", @@ -2304,6 +2631,65 @@ "which": "1.3.0" } }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "requires": { + "glob": "3.1.21", + "lodash": "1.0.2", + "minimatch": "0.2.14" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "requires": { + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=" + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=" + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=" + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + } + } + }, + "glogg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", + "requires": { + "sparkles": "1.0.0" + } + }, "got": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", @@ -2339,52 +2725,373 @@ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", "dev": true }, - "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.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "requires": { - "ajv": "5.3.0", - "har-schema": "2.0.0" - } - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "requires": { - "function-bind": "1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", "requires": { - "ansi-regex": "2.1.1" + "archy": "1.0.0", + "chalk": "1.1.3", + "deprecated": "0.0.1", + "gulp-util": "3.0.8", + "interpret": "1.0.4", + "liftoff": "2.2.5", + "minimist": "1.2.0", + "orchestrator": "0.3.8", + "pretty-hrtime": "1.0.3", + "semver": "4.3.6", + "tildify": "1.0.0", + "v8flags": "2.1.1", + "vinyl-fs": "0.3.14" }, "dependencies": { "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - } - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "interpret": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", + "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=" + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" + }, + "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.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "gulp-clean-css": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-3.9.0.tgz", + "integrity": "sha512-CsqaSO2ZTMQI/WwbWloZWBudhsRMKgxBthzxt4bbcbWrjOY4pRFziyK9IH6YbTpaWAPKEwWpopPkpiAEoDofxw==", + "requires": { + "clean-css": "4.1.9", + "gulp-util": "3.0.8", + "through2": "2.0.3", + "vinyl-sourcemaps-apply": "0.2.1" + }, + "dependencies": { + "clean-css": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", + "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", + "requires": { + "source-map": "0.5.7" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "gulp-cli": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-1.4.0.tgz", + "integrity": "sha1-b1u+LNC9tISdEs+eEkalhh+LT4g=", + "requires": { + "archy": "1.0.0", + "chalk": "1.1.3", + "copy-props": "1.6.0", + "fancy-log": "1.3.0", + "gulplog": "1.0.0", + "interpret": "1.0.4", + "liftoff": "2.3.0", + "lodash.isfunction": "3.0.8", + "lodash.isplainobject": "4.0.6", + "lodash.sortby": "4.7.0", + "matchdep": "1.0.1", + "mute-stdout": "1.0.0", + "pretty-hrtime": "1.0.3", + "semver-greatest-satisfied-range": "1.1.0", + "tildify": "1.0.0", + "v8flags": "2.1.1", + "wreck": "6.3.0", + "yargs": "3.32.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "interpret": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", + "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=" + }, + "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.1" + } + }, + "liftoff": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz", + "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", + "requires": { + "extend": "3.0.1", + "findup-sync": "0.4.3", + "fined": "1.1.0", + "flagged-respawn": "0.3.2", + "lodash.isplainobject": "4.0.6", + "lodash.isstring": "4.0.1", + "lodash.mapvalues": "4.6.0", + "rechoir": "0.6.2", + "resolve": "1.5.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.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "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.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "requires": { + "camelcase": "2.1.1", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "os-locale": "1.4.0", + "string-width": "1.0.2", + "window-size": "0.1.4", + "y18n": "3.2.1" + } + } + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.2.0", + "fancy-log": "1.3.0", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.3", + "vinyl": "0.5.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" + }, + "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.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "requires": { + "glogg": "1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "5.3.0", + "har-schema": "2.0.0" + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "requires": { + "sparkles": "1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "hawk": { @@ -2490,6 +3197,11 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls=" }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, "ip-regex": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", @@ -2501,6 +3213,15 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" }, + "is-absolute": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", + "requires": { + "is-relative": "0.2.1", + "is-windows": "0.2.0" + } + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -2609,6 +3330,21 @@ "path-is-inside": "1.0.2" } }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + } + } + }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", @@ -2638,6 +3374,14 @@ "has": "1.0.1" } }, + "is-relative": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", + "requires": { + "is-unc-path": "0.1.2" + } + }, "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", @@ -2655,6 +3399,19 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-unc-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", + "requires": { + "unc-path-regex": "0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, "is-windows": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", @@ -2855,6 +3612,14 @@ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "1.0.0" + } + }, "liftoff": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.2.5.tgz", @@ -2885,8 +3650,7 @@ "lodash._basecopy": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" }, "lodash._basecreate": { "version": "3.0.3", @@ -2894,6 +3658,16 @@ "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", "dev": true }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=" + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" + }, "lodash._bindcallback": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", @@ -2914,14 +3688,32 @@ "lodash._getnative": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" }, "lodash._isiterateecall": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=" + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" }, "lodash.assign": { "version": "3.2.0", @@ -2955,34 +3747,88 @@ "lodash.restparam": "3.6.1" } }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "requires": { + "lodash._root": "3.0.1" + } + }, "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" }, "lodash.isarray": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.isfunction": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.8.tgz", + "integrity": "sha1-TbcJ/IG8So/XEnpFilNGxc3OLGs=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, "lodash.keys": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, "requires": { "lodash._getnative": "3.9.1", "lodash.isarguments": "3.1.0", "lodash.isarray": "3.0.4" } }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=" + }, "lodash.restparam": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } }, "longest": { "version": "1.0.1", @@ -3014,12 +3860,55 @@ "pify": "3.0.0" } }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, "map-stream": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, + "matchdep": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-1.0.1.tgz", + "integrity": "sha1-pXozgESR+64girqPaDgEN6vC3KU=", + "requires": { + "findup-sync": "0.3.0", + "micromatch": "2.3.11", + "resolve": "1.1.7", + "stack-trace": "0.0.9" + }, + "dependencies": { + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "requires": { + "glob": "5.0.15" + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + } + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -3181,12 +4070,30 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "requires": { + "duplexer2": "0.0.2" + } + }, + "mute-stdout": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.0.tgz", + "integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=" + }, "nan": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", "dev": true }, + "natives": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", + "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=" + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -3297,6 +4204,32 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "requires": { + "array-each": "1.0.1", + "array-slice": "1.0.0", + "for-own": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + } + } + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -3306,6 +4239,21 @@ "is-extendable": "0.1.1" } }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + } + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -3327,11 +4275,34 @@ "wrappy": "1.0.2" } }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "requires": { + "end-of-stream": "0.1.5", + "sequencify": "0.0.7", + "stream-consume": "0.1.0" + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=" + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "1.0.0" + } + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -3369,6 +4340,16 @@ "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-0.3.1.tgz", "integrity": "sha1-zWLmCvjX/qinBexP+ZCHHEaHHyc=" }, + "parse-filepath": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", + "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", + "requires": { + "is-absolute": "0.2.6", + "map-cache": "0.2.2", + "path-root": "0.1.1" + } + }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", @@ -3430,6 +4411,19 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "requires": { + "path-root-regex": "0.1.2" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -3566,6 +4560,11 @@ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + }, "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", @@ -3894,6 +4893,11 @@ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" + }, "request": { "version": "2.83.0", "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", @@ -3992,6 +4996,14 @@ "semver": "5.4.1" } }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "requires": { + "sver-compat": "1.5.0" + } + }, "send": { "version": "0.15.6", "resolved": "https://registry.npmjs.org/send/-/send-0.15.6.tgz", @@ -4019,6 +5031,11 @@ } } }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=" + }, "serve-favicon": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.5.tgz", @@ -4073,6 +5090,11 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -4094,6 +5116,11 @@ "amdefine": "1.0.1" } }, + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=" + }, "split": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", @@ -4115,12 +5142,14 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, "ajv": { "version": "4.11.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, "requires": { "co": "4.6.0", @@ -4129,17 +5158,20 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, "are-we-there-yet": { "version": "1.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "dev": true, "requires": { "delegates": "1.0.0", @@ -4148,37 +5180,44 @@ }, "asn1": { "version": "0.2.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", "dev": true }, "assert-plus": { "version": "0.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", "dev": true }, "asynckit": { "version": "0.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, "aws-sign2": { "version": "0.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", "dev": true }, "aws4": { "version": "1.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", "dev": true }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "bcrypt-pbkdf": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "dev": true, "optional": true, "requires": { @@ -4187,7 +5226,8 @@ }, "block-stream": { "version": "0.0.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "dev": true, "requires": { "inherits": "2.0.3" @@ -4195,7 +5235,8 @@ }, "boom": { "version": "2.10.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "dev": true, "requires": { "hoek": "2.16.3" @@ -4203,7 +5244,8 @@ }, "brace-expansion": { "version": "1.1.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "dev": true, "requires": { "balanced-match": "1.0.0", @@ -4212,22 +5254,26 @@ }, "caseless": { "version": "0.12.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, "co": { "version": "4.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "combined-stream": { "version": "1.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "dev": true, "requires": { "delayed-stream": "1.0.0" @@ -4235,22 +5281,26 @@ }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "cryptiles": { "version": "2.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "dev": true, "requires": { "boom": "2.10.1" @@ -4258,7 +5308,8 @@ }, "dashdash": { "version": "1.14.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { "assert-plus": "1.0.0" @@ -4266,14 +5317,16 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true } } }, "debug": { "version": "2.6.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -4281,22 +5334,26 @@ }, "deep-extend": { "version": "0.4.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", "dev": true }, "delayed-stream": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, "ecc-jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "dev": true, "optional": true, "requires": { @@ -4305,22 +5362,26 @@ }, "extend": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", "dev": true }, "extsprintf": { "version": "1.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, "forever-agent": { "version": "0.6.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true }, "form-data": { "version": "2.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "dev": true, "requires": { "asynckit": "0.4.0", @@ -4330,12 +5391,14 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "fstream": { "version": "1.0.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "dev": true, "requires": { "graceful-fs": "4.1.11", @@ -4346,7 +5409,8 @@ }, "fstream-ignore": { "version": "1.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", "dev": true, "requires": { "fstream": "1.0.11", @@ -4356,7 +5420,8 @@ }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "requires": { "aproba": "1.2.0", @@ -4371,7 +5436,8 @@ }, "getpass": { "version": "0.1.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { "assert-plus": "1.0.0" @@ -4379,14 +5445,16 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true } } }, "glob": { "version": "7.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { "fs.realpath": "1.0.0", @@ -4399,17 +5467,20 @@ }, "graceful-fs": { "version": "4.1.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, "har-schema": { "version": "1.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", "dev": true }, "har-validator": { "version": "4.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "dev": true, "requires": { "ajv": "4.11.8", @@ -4418,12 +5489,14 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true }, "hawk": { "version": "3.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "dev": true, "requires": { "boom": "2.10.1", @@ -4434,12 +5507,14 @@ }, "hoek": { "version": "2.16.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", "dev": true }, "http-signature": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "dev": true, "requires": { "assert-plus": "0.2.0", @@ -4449,7 +5524,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "1.4.0", @@ -4458,17 +5534,20 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "ini": { "version": "1.3.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { "number-is-nan": "1.0.1" @@ -4476,33 +5555,39 @@ }, "is-typedarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isstream": { "version": "0.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, "jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true, "optional": true }, "json-schema": { "version": "0.2.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, "json-stable-stringify": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, "requires": { "jsonify": "0.0.0" @@ -4510,17 +5595,20 @@ }, "json-stringify-safe": { "version": "5.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, "jsonify": { "version": "0.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, "jsprim": { "version": "1.4.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { "assert-plus": "1.0.0", @@ -4531,19 +5619,22 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true } } }, "mime-db": { "version": "1.30.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", "dev": true }, "mime-types": { "version": "2.1.17", - "bundled": true, + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", "dev": true, "requires": { "mime-db": "1.30.0" @@ -4551,7 +5642,8 @@ }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "1.1.8" @@ -4559,12 +5651,14 @@ }, "minimist": { "version": "0.0.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { "minimist": "0.0.8" @@ -4572,12 +5666,14 @@ }, "ms": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "node-pre-gyp": { "version": "0.6.38", - "bundled": true, + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.38.tgz", + "integrity": "sha1-6Sog+DQWQVu0CG9tH7eLPac9ET0=", "dev": true, "requires": { "hawk": "3.1.3", @@ -4594,7 +5690,8 @@ }, "nopt": { "version": "4.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "dev": true, "requires": { "abbrev": "1.1.1", @@ -4603,7 +5700,8 @@ }, "npmlog": { "version": "4.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "requires": { "are-we-there-yet": "1.1.4", @@ -4614,22 +5712,26 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "oauth-sign": { "version": "0.8.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", "dev": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1.0.2" @@ -4637,17 +5739,20 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, "osenv": { "version": "0.1.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", "dev": true, "requires": { "os-homedir": "1.0.2", @@ -4656,32 +5761,38 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "performance-now": { "version": "0.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", "dev": true }, "process-nextick-args": { "version": "1.0.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true }, "punycode": { "version": "1.4.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, "qs": { "version": "6.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", "dev": true }, "rc": { "version": "1.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", "dev": true, "requires": { "deep-extend": "0.4.2", @@ -4692,14 +5803,16 @@ "dependencies": { "minimist": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } } }, "readable-stream": { "version": "2.3.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { "core-util-is": "1.0.2", @@ -4713,7 +5826,8 @@ }, "request": { "version": "2.81.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "dev": true, "requires": { "aws-sign2": "0.6.0", @@ -4742,7 +5856,8 @@ }, "rimraf": { "version": "2.6.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { "glob": "7.1.2" @@ -4750,27 +5865,32 @@ }, "safe-buffer": { "version": "5.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, "semver": { "version": "5.4.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", "dev": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "sntp": { "version": "1.0.9", - "bundled": true, + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "dev": true, "requires": { "hoek": "2.16.3" @@ -4778,7 +5898,8 @@ }, "sshpk": { "version": "1.13.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", "dev": true, "requires": { "asn1": "0.2.3", @@ -4793,14 +5914,16 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true } } }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { "code-point-at": "1.1.0", @@ -4810,7 +5933,8 @@ }, "string_decoder": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { "safe-buffer": "5.1.1" @@ -4818,12 +5942,14 @@ }, "stringstream": { "version": "0.0.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", "dev": true }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "2.1.1" @@ -4831,12 +5957,14 @@ }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, "tar": { "version": "2.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "dev": true, "requires": { "block-stream": "0.0.9", @@ -4846,7 +5974,8 @@ }, "tar-pack": { "version": "3.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", + "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", "dev": true, "requires": { "debug": "2.6.9", @@ -4861,7 +5990,8 @@ }, "tough-cookie": { "version": "2.3.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", "dev": true, "requires": { "punycode": "1.4.1" @@ -4869,7 +5999,8 @@ }, "tunnel-agent": { "version": "0.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { "safe-buffer": "5.1.1" @@ -4877,28 +6008,33 @@ }, "tweetnacl": { "version": "0.14.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true, "optional": true }, "uid-number": { "version": "0.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", "dev": true }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "uuid": { "version": "3.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", "dev": true }, "verror": { "version": "1.10.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { "assert-plus": "1.0.0", @@ -4908,14 +6044,16 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true } } }, "wide-align": { "version": "1.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "dev": true, "requires": { "string-width": "1.0.2" @@ -4923,7 +6061,8 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true } } @@ -4943,6 +6082,11 @@ "tweetnacl": "0.14.5" } }, + "stack-trace": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" + }, "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", @@ -4957,6 +6101,11 @@ "duplexer": "0.1.1" } }, + "stream-consume": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", + "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -4989,6 +6138,15 @@ "ansi-regex": "3.0.0" } }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "requires": { + "first-chunk-stream": "1.0.0", + "is-utf8": "0.2.1" + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -5027,6 +6185,15 @@ "has-flag": "1.0.0" } }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, "tar": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", @@ -5066,6 +6233,15 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "2.2.7", + "xtend": "4.0.1" + } + }, "tildify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.0.0.tgz", @@ -5074,6 +6250,11 @@ "user-home": "1.1.1" } }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -5164,12 +6345,22 @@ "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, "undefsafe": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz", "integrity": "sha1-7Mo6A+VrmvFzhbqsgSrIO5lKli8=", "dev": true }, + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=" + }, "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", @@ -5264,6 +6455,100 @@ "extsprintf": "1.3.0" } }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "requires": { + "defaults": "1.0.3", + "glob-stream": "3.1.18", + "glob-watcher": "0.0.6", + "graceful-fs": "3.0.11", + "mkdirp": "0.5.1", + "strip-bom": "1.0.0", + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "requires": { + "natives": "1.1.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "requires": { + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, "void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -5383,11 +6668,77 @@ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "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.1" + } + }, + "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.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "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.1.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "wreck": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/wreck/-/wreck-6.3.0.tgz", + "integrity": "sha1-oTaXafB7u2LWo3gzanhx/Hc8dAs=", + "requires": { + "boom": "2.10.1", + "hoek": "2.16.3" + }, + "dependencies": { + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "requires": { + "hoek": "2.16.3" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + } + } + }, "write-file-atomic": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", @@ -5410,6 +6761,11 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", From 656a5069928bf687ea9f21de5d91ece9754f45f7 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Tue, 14 Nov 2017 11:55:34 +0900 Subject: [PATCH 79/81] Updated config for Travis --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0a99e9d..b2c193b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,4 @@ language: node_js node_js: '7' -services: - - mongodb +before_script: + - cp config/database.template.js config/database.dev.js \ No newline at end of file From c007f399b9864d0d43494ad657c0c755d87a652c Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Tue, 14 Nov 2017 12:56:34 +0900 Subject: [PATCH 80/81] Updated package lock file --- package-lock.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/package-lock.json b/package-lock.json index a9bcf37..8a37493 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4944,6 +4944,11 @@ } } }, + "requirejs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.5.tgz", + "integrity": "sha512-svnO+aNcR/an9Dpi44C7KSAy5fFGLtmPbaaCeQaklUz8BQhS64tWWIIlvEA5jrWICzlO/X9KSzSeXFnZdBu8nw==" + }, "resolve": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", From b30cb2eb508d6808349012abff7b3e4558684f06 Mon Sep 17 00:00:00 2001 From: "Bryan \"Beege\" Berry" Date: Thu, 7 Dec 2017 08:09:48 -0800 Subject: [PATCH 81/81] Renamed files. Minor fixes Renamed model files to use camel case. Converted vars to const/let. Added missing semicolons. Removed extra semicolons. Did other formatting and clean-up work --- bin/www | 4 +- config/passport.js | 5 +- gulpfile.js | 4 +- models/{Event.js => event.js} | 0 models/{User.js => user.js} | 0 package-lock.json | 1373 +++------------------------ public/javascripts/shared.js | 30 +- routes/users.js | 2 +- src/eventRepository.js | 2 +- src/userRepository.js | 8 +- test/event/modelCreate.test.js | 4 +- test/event/modelDestroy.test.js | 2 +- test/event/modelRead.test.js | 2 +- test/event/modelUpdate.test.js | 2 +- test/event/modelValidations.test.js | 2 +- test/user/modelCreate.test.js | 2 +- test/user/modelDestroy.test.js | 2 +- test/user/modelRead.test.js | 2 +- test/user/modelUpdate.test.js | 4 +- test/user/modelValidations.test.js | 2 +- test/user/repo.test.js | 2 +- views/events/create.pug | 2 - views/events/edit.pug | 2 +- 23 files changed, 161 insertions(+), 1297 deletions(-) rename models/{Event.js => event.js} (100%) rename models/{User.js => user.js} (100%) diff --git a/bin/www b/bin/www index 401352b..489128c 100755 --- a/bin/www +++ b/bin/www @@ -10,7 +10,7 @@ const http = require('http'); /** * Get port from environment and store in Express. */ -let port = normalizePort(process.env.PORT || '3000'); +const port = normalizePort(process.env.PORT || '3000'); app.set('port', port); /** @@ -79,7 +79,7 @@ function onError(error) { */ function onListening() { - let addr = server.address(); + const addr = server.address(); const bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; diff --git a/config/passport.js b/config/passport.js index e9c9831..f9813d3 100644 --- a/config/passport.js +++ b/config/passport.js @@ -1,5 +1,5 @@ const LocalStrategy = require('passport-local').Strategy; -const User = require('../models/User').User; +const User = require('../models/user').User; const userRepo = require('../src/userRepository'); module.exports = (passport) => { @@ -9,7 +9,7 @@ module.exports = (passport) => { }, (req, username, password, done) => { console.log('local strategy call invoked'); - const user = userRepo.getUserByUsername(username) + const user = userRepo.getUserByUsername(username); const passwordCompare = user.then(u => { console.log('password compare user then promise'); @@ -63,7 +63,6 @@ module.exports = (passport) => { if (newUser instanceof User) { return done(null, newUser); } else { - ; return newUser; } }) diff --git a/gulpfile.js b/gulpfile.js index 2e7bdf4..9840805 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,5 +1,5 @@ -var gulp = require('gulp') -var cleancss = require('gulp-clean-css') +const gulp = require('gulp'); +const cleancss = require('gulp-clean-css'); gulp.task('css', function() { return gulp.src("public/stylesheets/style.css") diff --git a/models/Event.js b/models/event.js similarity index 100% rename from models/Event.js rename to models/event.js diff --git a/models/User.js b/models/user.js similarity index 100% rename from models/User.js rename to models/user.js diff --git a/package-lock.json b/package-lock.json index 8a37493..c506c20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,9 +39,9 @@ } }, "ajv": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", - "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.4.0.tgz", + "integrity": "sha1-MtHPCNvIDEMvQm8S4QslEfa0ZHQ=", "requires": { "co": "4.6.0", "fast-deep-equal": "1.0.0", @@ -540,7 +540,6 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", - "fsevents": "1.1.2", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -796,7 +795,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", "requires": { "ms": "2.0.0" } @@ -1105,7 +1104,7 @@ "qs": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", - "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==" + "integrity": "sha1-jQSVTTZN7z78VbWgeT4eLIsebkk=" }, "statuses": { "version": "1.3.1", @@ -1373,1018 +1372,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fsevents": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.7.0", - "node-pre-gyp": "0.6.36" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", - "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "aproba": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", - "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", - "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "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=", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", - "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", - "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", - "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", - "dev": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.36", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz", - "integrity": "sha1-22BBEst04NR3VU6bUFsXq936t4Y=", - "dev": true, - "optional": true, - "requires": { - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", - "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", - "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", - "dev": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", - "dev": true - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", - "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", - "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", - "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", - "dev": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "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=", - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", - "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", - "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, "fstream": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", @@ -2800,7 +1787,7 @@ "gulp-clean-css": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-3.9.0.tgz", - "integrity": "sha512-CsqaSO2ZTMQI/WwbWloZWBudhsRMKgxBthzxt4bbcbWrjOY4pRFziyK9IH6YbTpaWAPKEwWpopPkpiAEoDofxw==", + "integrity": "sha1-5D5MjWlQYPa6CKFU2OdtDYexyCI=", "requires": { "clean-css": "4.1.9", "gulp-util": "3.0.8", @@ -3048,7 +2035,7 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "5.3.0", + "ajv": "5.4.0", "har-schema": "2.0.0" } }, @@ -4001,7 +2988,7 @@ "mocha": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "integrity": "sha1-HgSA/jbS2lhY0etqzDhBiybqog0=", "dev": true, "requires": { "browser-stdout": "1.3.0", @@ -4605,7 +3592,7 @@ "pug": { "version": "2.0.0-rc.4", "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.0-rc.4.tgz", - "integrity": "sha512-SL7xovj6E2Loq9N0UgV6ynjMLW4urTFY/L/Fprhvz13Xc5vjzkjZjI1QHKq31200+6PSD8PyU6MqrtCTJj6/XA==", + "integrity": "sha1-t7CPZZm9UwJWgEK3Q2mE+yjIChM=", "requires": { "pug-code-gen": "2.0.0", "pug-filters": "2.1.5", @@ -4947,7 +3934,7 @@ "requirejs": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.5.tgz", - "integrity": "sha512-svnO+aNcR/an9Dpi44C7KSAy5fFGLtmPbaaCeQaklUz8BQhS64tWWIIlvEA5jrWICzlO/X9KSzSeXFnZdBu8nw==" + "integrity": "sha1-YXuay7yzNlQO9JFNeQMjqNS4YbA=" }, "resolve": { "version": "1.5.0", @@ -5044,7 +4031,7 @@ "serve-favicon": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.5.tgz", - "integrity": "sha512-s7F8h2NrslMkG50KxvlGdj+ApSwaLex0vexuJ9iFf3GLTIp1ph/l1qZvRe9T9TJEYZgmq72ZwJ2VYiAEtChknw==", + "integrity": "sha1-SdmkaGMVOpJAaRyJPSsOfYXW1DY=", "requires": { "etag": "1.8.1", "fresh": "0.5.2", @@ -5147,14 +4134,12 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "bundled": true, "dev": true }, "ajv": { "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "bundled": true, "dev": true, "requires": { "co": "4.6.0", @@ -5163,20 +4148,17 @@ }, "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "bundled": true, "dev": true }, "aproba": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "bundled": true, "dev": true }, "are-we-there-yet": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "bundled": true, "dev": true, "requires": { "delegates": "1.0.0", @@ -5185,44 +4167,37 @@ }, "asn1": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "bundled": true, "dev": true }, "assert-plus": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "bundled": true, "dev": true }, "asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "bundled": true, "dev": true }, "aws-sign2": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "bundled": true, "dev": true }, "aws4": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "bundled": true, "dev": true }, "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "bundled": true, "dev": true }, "bcrypt-pbkdf": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -5231,8 +4206,7 @@ }, "block-stream": { "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "bundled": true, "dev": true, "requires": { "inherits": "2.0.3" @@ -5240,8 +4214,7 @@ }, "boom": { "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "bundled": true, "dev": true, "requires": { "hoek": "2.16.3" @@ -5249,8 +4222,7 @@ }, "brace-expansion": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "bundled": true, "dev": true, "requires": { "balanced-match": "1.0.0", @@ -5259,26 +4231,22 @@ }, "caseless": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "bundled": true, "dev": true }, "co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "bundled": true, "dev": true }, "code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "bundled": true, "dev": true }, "combined-stream": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "bundled": true, "dev": true, "requires": { "delayed-stream": "1.0.0" @@ -5286,26 +4254,22 @@ }, "concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "bundled": true, "dev": true }, "console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "bundled": true, "dev": true }, "core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "bundled": true, "dev": true }, "cryptiles": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "bundled": true, "dev": true, "requires": { "boom": "2.10.1" @@ -5313,8 +4277,7 @@ }, "dashdash": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "bundled": true, "dev": true, "requires": { "assert-plus": "1.0.0" @@ -5322,16 +4285,14 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "bundled": true, "dev": true } } }, "debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "bundled": true, "dev": true, "requires": { "ms": "2.0.0" @@ -5339,26 +4300,22 @@ }, "deep-extend": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "bundled": true, "dev": true }, "delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "bundled": true, "dev": true }, "delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "bundled": true, "dev": true }, "ecc-jsbn": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "bundled": true, "dev": true, "optional": true, "requires": { @@ -5367,26 +4324,22 @@ }, "extend": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "bundled": true, "dev": true }, "extsprintf": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "bundled": true, "dev": true }, "forever-agent": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "bundled": true, "dev": true }, "form-data": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "bundled": true, "dev": true, "requires": { "asynckit": "0.4.0", @@ -5396,14 +4349,12 @@ }, "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "bundled": true, "dev": true }, "fstream": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "bundled": true, "dev": true, "requires": { "graceful-fs": "4.1.11", @@ -5414,8 +4365,7 @@ }, "fstream-ignore": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", - "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "bundled": true, "dev": true, "requires": { "fstream": "1.0.11", @@ -5425,8 +4375,7 @@ }, "gauge": { "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "bundled": true, "dev": true, "requires": { "aproba": "1.2.0", @@ -5441,8 +4390,7 @@ }, "getpass": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "bundled": true, "dev": true, "requires": { "assert-plus": "1.0.0" @@ -5450,16 +4398,14 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "bundled": true, "dev": true } } }, "glob": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "bundled": true, "dev": true, "requires": { "fs.realpath": "1.0.0", @@ -5472,20 +4418,17 @@ }, "graceful-fs": { "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "bundled": true, "dev": true }, "har-schema": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "bundled": true, "dev": true }, "har-validator": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "bundled": true, "dev": true, "requires": { "ajv": "4.11.8", @@ -5494,14 +4437,12 @@ }, "has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "bundled": true, "dev": true }, "hawk": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "bundled": true, "dev": true, "requires": { "boom": "2.10.1", @@ -5512,14 +4453,12 @@ }, "hoek": { "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "bundled": true, "dev": true }, "http-signature": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "bundled": true, "dev": true, "requires": { "assert-plus": "0.2.0", @@ -5529,8 +4468,7 @@ }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "bundled": true, "dev": true, "requires": { "once": "1.4.0", @@ -5539,20 +4477,17 @@ }, "inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "bundled": true, "dev": true }, "ini": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "bundled": true, "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "bundled": true, "dev": true, "requires": { "number-is-nan": "1.0.1" @@ -5560,39 +4495,33 @@ }, "is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "bundled": true, "dev": true }, "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "bundled": true, "dev": true }, "isstream": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "bundled": true, "dev": true }, "jsbn": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "bundled": true, "dev": true, "optional": true }, "json-schema": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "bundled": true, "dev": true }, "json-stable-stringify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "bundled": true, "dev": true, "requires": { "jsonify": "0.0.0" @@ -5600,20 +4529,17 @@ }, "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=", + "bundled": true, "dev": true }, "jsonify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "bundled": true, "dev": true }, "jsprim": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "bundled": true, "dev": true, "requires": { "assert-plus": "1.0.0", @@ -5624,22 +4550,19 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "bundled": true, "dev": true } } }, "mime-db": { "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "bundled": true, "dev": true }, "mime-types": { "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "bundled": true, "dev": true, "requires": { "mime-db": "1.30.0" @@ -5647,8 +4570,7 @@ }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "bundled": true, "dev": true, "requires": { "brace-expansion": "1.1.8" @@ -5656,14 +4578,12 @@ }, "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "bundled": true, "dev": true }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "bundled": true, "dev": true, "requires": { "minimist": "0.0.8" @@ -5671,14 +4591,12 @@ }, "ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "bundled": true, "dev": true }, "node-pre-gyp": { "version": "0.6.38", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.38.tgz", - "integrity": "sha1-6Sog+DQWQVu0CG9tH7eLPac9ET0=", + "bundled": true, "dev": true, "requires": { "hawk": "3.1.3", @@ -5695,8 +4613,7 @@ }, "nopt": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "bundled": true, "dev": true, "requires": { "abbrev": "1.1.1", @@ -5705,8 +4622,7 @@ }, "npmlog": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "bundled": true, "dev": true, "requires": { "are-we-there-yet": "1.1.4", @@ -5717,26 +4633,22 @@ }, "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=", + "bundled": true, "dev": true }, "oauth-sign": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "bundled": true, "dev": true }, "object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "bundled": true, "dev": true }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "bundled": true, "dev": true, "requires": { "wrappy": "1.0.2" @@ -5744,20 +4656,17 @@ }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "bundled": true, "dev": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "bundled": true, "dev": true }, "osenv": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "bundled": true, "dev": true, "requires": { "os-homedir": "1.0.2", @@ -5766,38 +4675,32 @@ }, "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=", + "bundled": true, "dev": true }, "performance-now": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "bundled": true, "dev": true }, "process-nextick-args": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "bundled": true, "dev": true }, "punycode": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "bundled": true, "dev": true }, "qs": { "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "bundled": true, "dev": true }, "rc": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "bundled": true, "dev": true, "requires": { "deep-extend": "0.4.2", @@ -5808,16 +4711,14 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "bundled": true, "dev": true } } }, "readable-stream": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "bundled": true, "dev": true, "requires": { "core-util-is": "1.0.2", @@ -5831,8 +4732,7 @@ }, "request": { "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "bundled": true, "dev": true, "requires": { "aws-sign2": "0.6.0", @@ -5861,8 +4761,7 @@ }, "rimraf": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "bundled": true, "dev": true, "requires": { "glob": "7.1.2" @@ -5870,32 +4769,27 @@ }, "safe-buffer": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "bundled": true, "dev": true }, "semver": { "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "bundled": true, "dev": true }, "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "bundled": true, "dev": true }, "signal-exit": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "bundled": true, "dev": true }, "sntp": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "bundled": true, "dev": true, "requires": { "hoek": "2.16.3" @@ -5903,8 +4797,7 @@ }, "sshpk": { "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "bundled": true, "dev": true, "requires": { "asn1": "0.2.3", @@ -5919,16 +4812,14 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "bundled": true, "dev": true } } }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "bundled": true, "dev": true, "requires": { "code-point-at": "1.1.0", @@ -5938,8 +4829,7 @@ }, "string_decoder": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "bundled": true, "dev": true, "requires": { "safe-buffer": "5.1.1" @@ -5947,14 +4837,12 @@ }, "stringstream": { "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "bundled": true, "dev": true }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "bundled": true, "dev": true, "requires": { "ansi-regex": "2.1.1" @@ -5962,14 +4850,12 @@ }, "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=", + "bundled": true, "dev": true }, "tar": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "bundled": true, "dev": true, "requires": { "block-stream": "0.0.9", @@ -5979,8 +4865,7 @@ }, "tar-pack": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", - "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", + "bundled": true, "dev": true, "requires": { "debug": "2.6.9", @@ -5995,8 +4880,7 @@ }, "tough-cookie": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "bundled": true, "dev": true, "requires": { "punycode": "1.4.1" @@ -6004,8 +4888,7 @@ }, "tunnel-agent": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "bundled": true, "dev": true, "requires": { "safe-buffer": "5.1.1" @@ -6013,33 +4896,28 @@ }, "tweetnacl": { "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "bundled": true, "dev": true, "optional": true }, "uid-number": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "bundled": true, "dev": true }, "util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "bundled": true, "dev": true }, "uuid": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "bundled": true, "dev": true }, "verror": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "bundled": true, "dev": true, "requires": { "assert-plus": "1.0.0", @@ -6049,16 +4927,14 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "bundled": true, "dev": true } } }, "wide-align": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "bundled": true, "dev": true, "requires": { "string-width": "1.0.2" @@ -6066,8 +4942,7 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "bundled": true, "dev": true } } @@ -6443,7 +5318,7 @@ "validator": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz", - "integrity": "sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA==" + "integrity": "sha1-PBI3KQ43CSNVNE/veMIxJJ2rd7k=" }, "vary": { "version": "1.1.2", diff --git a/public/javascripts/shared.js b/public/javascripts/shared.js index e623089..7d5224c 100644 --- a/public/javascripts/shared.js +++ b/public/javascripts/shared.js @@ -2,22 +2,18 @@ console.log('shared js loaded'); // const userRepo = require("../../src/userRepository") -document.addEventListener("DOMContentLoaded", function() { - let alertMsg = document.querySelector('.alert'); - let alertWrapper = document.querySelector('.alert-wrap'); - if(alertMsg) { - setTimeout( () => { - alertWrapper.removeChild(alertMsg); - }, 2600); - } - $(".dropdown-menu").click((e) => { - $("#dropdownMenuButton").html(e.target.innerHTML) - $("#type").val(e.target.innerHTML) - }); - - $(".dropdown-menu").click((e) => { - $("#exampleButton").html(e.target.innerHTML) - $("#type").val(e.target.innerHTML) - }); +document.addEventListener("DOMContentLoaded", function () { + let alertMsg = document.querySelector('.alert'); + let alertWrapper = document.querySelector('.alert-wrap'); + if (alertMsg) { + setTimeout(() => { + alertWrapper.removeChild(alertMsg); + }, 2600); + } + $(".dropdown-menu").click((e) => { + $("#dropdownMenuButton").html(e.target.innerHTML); + $("#exampleButton").html(e.target.innerHTML); + $("#type").val(e.target.innerHTML) + }); }); diff --git a/routes/users.js b/routes/users.js index 087e4e6..3d0a4b0 100644 --- a/routes/users.js +++ b/routes/users.js @@ -23,7 +23,7 @@ router.get('/signup', (req, res) => { router.get('/badge', (req, res) => { res.render('users/badge'); -}) +}); router.post('/signup', passport.authenticate('local-signup', { successRedirect: '/events', diff --git a/src/eventRepository.js b/src/eventRepository.js index 0503fad..004109e 100644 --- a/src/eventRepository.js +++ b/src/eventRepository.js @@ -1,4 +1,4 @@ -const Event = require('../models/Event').Event; +const Event = require('../models/event').Event; module.exports = { getEvents() { diff --git a/src/userRepository.js b/src/userRepository.js index f482d73..0e2ca2c 100644 --- a/src/userRepository.js +++ b/src/userRepository.js @@ -1,5 +1,5 @@ -const User = require('../models/User').User; -const Users = require('../models/User').Users; +const User = require('../models/user').User; +const Users = require('../models/user').Users; module.exports = { getUsers() { @@ -24,10 +24,6 @@ module.exports = { return User.where('id', id).fetch(); }, - getUserByEmail(email) { - return User.where('email', email).fetch(); - }, - getUserByUsername(username) { console.log('getting user by username'); return User.where('username', username).fetch(); diff --git a/test/event/modelCreate.test.js b/test/event/modelCreate.test.js index b453205..2eb4a1f 100644 --- a/test/event/modelCreate.test.js +++ b/test/event/modelCreate.test.js @@ -1,7 +1,7 @@ require('../test_helper.test'); const knex = require('../../config/bookshelf').knex; -const Event = require('../../models/Event').Event; -const User = require('../../models/User').User; +const Event = require('../../models/event').Event; +const User = require('../../models/user').User; const moment = require('moment'); const assert = require('assert'); diff --git a/test/event/modelDestroy.test.js b/test/event/modelDestroy.test.js index 079b390..98f6ef8 100644 --- a/test/event/modelDestroy.test.js +++ b/test/event/modelDestroy.test.js @@ -1,6 +1,6 @@ require('../test_helper.test'); const knex = require('../../config/bookshelf').knex; -const Event = require('../../models/Event').Event; +const Event = require('../../models/event').Event; const assert = require('assert'); describe('Event modelDestroy', () => { diff --git a/test/event/modelRead.test.js b/test/event/modelRead.test.js index 29423b9..e4f8d15 100644 --- a/test/event/modelRead.test.js +++ b/test/event/modelRead.test.js @@ -1,6 +1,6 @@ require('../test_helper.test'); const knex = require('../../config/bookshelf').knex; -const Event = require('../../models/Event').Event; +const Event = require('../../models/event').Event; const assert = require('assert'); describe('Event modelRead', () => { diff --git a/test/event/modelUpdate.test.js b/test/event/modelUpdate.test.js index a7a4af0..8fed2d8 100644 --- a/test/event/modelUpdate.test.js +++ b/test/event/modelUpdate.test.js @@ -1,6 +1,6 @@ require('../test_helper.test'); const knex = require('../../config/bookshelf').knex; -const Event = require('../../models/Event').Event; +const Event = require('../../models/event').Event; const assert = require('assert'); describe('Event modelUpdate', () => { diff --git a/test/event/modelValidations.test.js b/test/event/modelValidations.test.js index d7878ab..a679be4 100644 --- a/test/event/modelValidations.test.js +++ b/test/event/modelValidations.test.js @@ -1,5 +1,5 @@ require('../test_helper.test'); -const Event = require('../../models/Event').Event; +const Event = require('../../models/event').Event; const assert = require('assert'); // TODO: validations diff --git a/test/user/modelCreate.test.js b/test/user/modelCreate.test.js index 60c556d..7bc85c0 100644 --- a/test/user/modelCreate.test.js +++ b/test/user/modelCreate.test.js @@ -1,6 +1,6 @@ require('../test_helper.test'); const knex = require('../../config/bookshelf').knex; -const User = require('../../models/User').User; +const User = require('../../models/user').User; const CheckIn = require('../../models/checkIn').CheckIn; const assert = require('assert'); diff --git a/test/user/modelDestroy.test.js b/test/user/modelDestroy.test.js index 5f0c371..841cd48 100644 --- a/test/user/modelDestroy.test.js +++ b/test/user/modelDestroy.test.js @@ -1,6 +1,6 @@ require('../test_helper.test'); const knex = require('../../config/bookshelf').knex; -const User = require('../../models/User').User; +const User = require('../../models/user').User; const assert = require('assert'); describe('User modelDestroy', () => { diff --git a/test/user/modelRead.test.js b/test/user/modelRead.test.js index efe0051..80de628 100644 --- a/test/user/modelRead.test.js +++ b/test/user/modelRead.test.js @@ -1,5 +1,5 @@ require('../test_helper.test'); -const User = require('../../models/User').User; +const User = require('../../models/user').User; const assert = require('assert'); describe('User modelRead', () => { diff --git a/test/user/modelUpdate.test.js b/test/user/modelUpdate.test.js index d736331..bda9f3a 100644 --- a/test/user/modelUpdate.test.js +++ b/test/user/modelUpdate.test.js @@ -1,8 +1,8 @@ require('../test_helper.test'); const knex = require('../../config/bookshelf').knex; -const User = require('../../models/User').User; +const User = require('../../models/user').User; const CheckIn = require('../../models/checkIn').CheckIn; -const Event = require('../../models/Event').Event; +const Event = require('../../models/event').Event; const assert = require('assert'); describe('User modelUpdate', () => { diff --git a/test/user/modelValidations.test.js b/test/user/modelValidations.test.js index 91d77a1..cc7c992 100644 --- a/test/user/modelValidations.test.js +++ b/test/user/modelValidations.test.js @@ -1,5 +1,5 @@ require('../test_helper.test'); -const User = require('../../models/User'); +const User = require('../../models/user'); const assert = require('assert'); // TODO: validations diff --git a/test/user/repo.test.js b/test/user/repo.test.js index 728e361..31a2291 100644 --- a/test/user/repo.test.js +++ b/test/user/repo.test.js @@ -1,7 +1,7 @@ require('../test_helper.test'); const knex = require('../../config/bookshelf').knex; const Repo = require('../../src/userRepository'); -const User = require('../../models/User').User; +const User = require('../../models/user').User; const chai = require('chai'); const chaiHttp = require('chai-http'); chai.use(chaiHttp); diff --git a/views/events/create.pug b/views/events/create.pug index da7238c..309666a 100644 --- a/views/events/create.pug +++ b/views/events/create.pug @@ -25,5 +25,3 @@ block content label(for="description") Description textarea(class="form-control" name="description" id="description") input(class="btn btn-success" type="submit") - - diff --git a/views/events/edit.pug b/views/events/edit.pug index 75b7826..7e59df7 100644 --- a/views/events/edit.pug +++ b/views/events/edit.pug @@ -6,5 +6,5 @@ block content label(for="title") Title input(type="text" name="title" id="title" value=events.get('title')) label(for="description") Description - textarea(type="text" name="description" id="description") #{events.get('description')} + textarea(name="description" id="description") #{events.get('description')} input(type="submit")