diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..f2539bf --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + "extends": "semistandard", + "parser": "babel-eslint", + "plugins": [ + "standard", + "promise" + ] +}; \ No newline at end of file diff --git a/.gitignore b/.gitignore index 2c1edb7..b03aab6 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,6 @@ bower_components/ build prod_temp public -.firebaserc \ No newline at end of file +.firebaserc +eventbrite.json +firebase-config.json \ No newline at end of file diff --git a/archive/core/modules/app-network-status/mixins/app-network-status-mixin.html b/archive/core/modules/app-network-status/mixins/app-network-status-mixin.html deleted file mode 100644 index 2f28c07..0000000 --- a/archive/core/modules/app-network-status/mixins/app-network-status-mixin.html +++ /dev/null @@ -1,56 +0,0 @@ - diff --git a/archive/core/modules/firebase-property-mixin/.bowerrc b/archive/core/modules/firebase-property-mixin/.bowerrc deleted file mode 100644 index 2969b9b..0000000 --- a/archive/core/modules/firebase-property-mixin/.bowerrc +++ /dev/null @@ -1 +0,0 @@ -{"directory":"../../../bower_components/","timeout":120000} \ No newline at end of file diff --git a/archive/core/modules/firebase-property-mixin/bower.json b/archive/core/modules/firebase-property-mixin/bower.json deleted file mode 100644 index 8507911..0000000 --- a/archive/core/modules/firebase-property-mixin/bower.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "firebase-property-mixin", - "description": "Firebase Property Mixin for TJ's Projects", - "main": "mixins/firebase-property-mixin.html", - "authors": [ - "TJ Monserrat" - ], - "license": "MIT", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "src/bower_components/", - "test", - "tests" - ], - "dependencies": { - "polymer": "Polymer/polymer#^2.0.1", - "pouchdb": "^6.3.4", - "pouchdb-upsert": "^2.2.0" - } -} diff --git a/archive/core/modules/firebase-property-mixin/mixins/firebase-property-mixin.html b/archive/core/modules/firebase-property-mixin/mixins/firebase-property-mixin.html deleted file mode 100644 index ff687a2..0000000 --- a/archive/core/modules/firebase-property-mixin/mixins/firebase-property-mixin.html +++ /dev/null @@ -1,815 +0,0 @@ - - - diff --git a/archive/core/modules/firebase-property-mixin/scripts/pouchdb.html b/archive/core/modules/firebase-property-mixin/scripts/pouchdb.html deleted file mode 100644 index 53ec753..0000000 --- a/archive/core/modules/firebase-property-mixin/scripts/pouchdb.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/archive/core/modules/permission-data/.bowerrc b/archive/core/modules/permission-data/.bowerrc deleted file mode 100644 index 2969b9b..0000000 --- a/archive/core/modules/permission-data/.bowerrc +++ /dev/null @@ -1 +0,0 @@ -{"directory":"../../../bower_components/","timeout":120000} \ No newline at end of file diff --git a/archive/core/modules/permission-data/bower.json b/archive/core/modules/permission-data/bower.json deleted file mode 100644 index f3f0fce..0000000 --- a/archive/core/modules/permission-data/bower.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "permission-data", - "license": "MIT", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "src/bower_components/", - "test", - "tests" - ], - "dependencies": { - "polymer": "Polymer/polymer#^2.0.1" - } -} diff --git a/archive/core/modules/permission-data/models/permission-data.html b/archive/core/modules/permission-data/models/permission-data.html deleted file mode 100644 index 15b995b..0000000 --- a/archive/core/modules/permission-data/models/permission-data.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - diff --git a/archive/core/modules/permission-data/reducers/reducers.html b/archive/core/modules/permission-data/reducers/reducers.html deleted file mode 100644 index 707a4b6..0000000 --- a/archive/core/modules/permission-data/reducers/reducers.html +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/archive/core/modules/polyapp-location/.bowerrc b/archive/core/modules/polyapp-location/.bowerrc deleted file mode 100644 index 2969b9b..0000000 --- a/archive/core/modules/polyapp-location/.bowerrc +++ /dev/null @@ -1 +0,0 @@ -{"directory":"../../../bower_components/","timeout":120000} \ No newline at end of file diff --git a/archive/core/modules/polyapp-location/bower.json b/archive/core/modules/polyapp-location/bower.json deleted file mode 100644 index ab1e629..0000000 --- a/archive/core/modules/polyapp-location/bower.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "polyapp-location", - "description": "Polyapp Router for TJ's Projects", - "main": "polyapp-router.html", - "authors": [ - "TJ Monserrat" - ], - "license": "MIT", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "src/bower_components/", - "test", - "tests" - ], - "dependencies": { - "polymer": "Polymer/polymer#^2.0.1" - } -} diff --git a/archive/core/modules/polyapp-location/components/polyapp-location.html b/archive/core/modules/polyapp-location/components/polyapp-location.html deleted file mode 100644 index 8988852..0000000 --- a/archive/core/modules/polyapp-location/components/polyapp-location.html +++ /dev/null @@ -1,387 +0,0 @@ - - - - diff --git a/archive/core/modules/polyapp-location/components/polyapp-query-params.html b/archive/core/modules/polyapp-location/components/polyapp-query-params.html deleted file mode 100644 index b4b01bc..0000000 --- a/archive/core/modules/polyapp-location/components/polyapp-query-params.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - diff --git a/archive/core/modules/polyapp-router/.bowerrc b/archive/core/modules/polyapp-router/.bowerrc deleted file mode 100644 index 2969b9b..0000000 --- a/archive/core/modules/polyapp-router/.bowerrc +++ /dev/null @@ -1 +0,0 @@ -{"directory":"../../../bower_components/","timeout":120000} \ No newline at end of file diff --git a/archive/core/modules/polyapp-router/bower.json b/archive/core/modules/polyapp-router/bower.json deleted file mode 100644 index 8c0fc59..0000000 --- a/archive/core/modules/polyapp-router/bower.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "app-router", - "description": "App Router for TJ's Projects", - "main": "app-router.html", - "authors": [ - "TJ Monserrat" - ], - "license": "MIT", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "src/bower_components/", - "test", - "tests" - ], - "dependencies": { - "polymer": "Polymer/polymer#^2.0.1" - } -} diff --git a/archive/core/modules/polyapp-router/components/polyapp-router.html b/archive/core/modules/polyapp-router/components/polyapp-router.html deleted file mode 100644 index d9e70d5..0000000 --- a/archive/core/modules/polyapp-router/components/polyapp-router.html +++ /dev/null @@ -1,499 +0,0 @@ - - - - - - - - - - diff --git a/archive/core/modules/polyapp-toast/.bowerrc b/archive/core/modules/polyapp-toast/.bowerrc deleted file mode 100644 index 2969b9b..0000000 --- a/archive/core/modules/polyapp-toast/.bowerrc +++ /dev/null @@ -1 +0,0 @@ -{"directory":"../../../bower_components/","timeout":120000} \ No newline at end of file diff --git a/archive/core/modules/polyapp-toast/bower.json b/archive/core/modules/polyapp-toast/bower.json deleted file mode 100644 index bcd3eec..0000000 --- a/archive/core/modules/polyapp-toast/bower.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "polyapp-toast", - "license": "MIT", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "src/bower_components/", - "test", - "tests" - ], - "dependencies": { - "polymer": "Polymer/polymer#^2.0.1", - "paper-toast": "PolymerElements/paper-toast#^2.0.0" - } -} diff --git a/archive/core/modules/polyapp-toast/components/polyapp-toast.html b/archive/core/modules/polyapp-toast/components/polyapp-toast.html deleted file mode 100644 index b5e1e2f..0000000 --- a/archive/core/modules/polyapp-toast/components/polyapp-toast.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - - - diff --git a/archive/core/modules/user-data/.bowerrc b/archive/core/modules/user-data/.bowerrc deleted file mode 100644 index 2969b9b..0000000 --- a/archive/core/modules/user-data/.bowerrc +++ /dev/null @@ -1 +0,0 @@ -{"directory":"../../../bower_components/","timeout":120000} \ No newline at end of file diff --git a/archive/core/modules/user-data/bower.json b/archive/core/modules/user-data/bower.json deleted file mode 100644 index 5f491a9..0000000 --- a/archive/core/modules/user-data/bower.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "user-data", - "license": "MIT", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "src/bower_components/", - "test", - "tests" - ], - "dependencies": { - "polymer": "Polymer/polymer#^2.0.1" - } -} diff --git a/archive/core/modules/user-data/models/user-data.html b/archive/core/modules/user-data/models/user-data.html deleted file mode 100644 index ab92681..0000000 --- a/archive/core/modules/user-data/models/user-data.html +++ /dev/null @@ -1,322 +0,0 @@ - - - - diff --git a/archive/core/modules/user-data/reducers/reducers.html b/archive/core/modules/user-data/reducers/reducers.html deleted file mode 100644 index 5938c74..0000000 --- a/archive/core/modules/user-data/reducers/reducers.html +++ /dev/null @@ -1,44 +0,0 @@ - diff --git a/archive/core/opts/state-manager.html b/archive/core/opts/state-manager.html deleted file mode 100644 index 2f406ad..0000000 --- a/archive/core/opts/state-manager.html +++ /dev/null @@ -1,21 +0,0 @@ - - diff --git a/archive/core/root/index.hbs b/archive/core/root/index.hbs deleted file mode 100644 index f3a34e7..0000000 --- a/archive/core/root/index.hbs +++ /dev/null @@ -1,302 +0,0 @@ - - - - - - - - {{app.title}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {{#each theme.icons}} - - {{/each}} - - - {{#each theme.icons}} - {{#if tileImage}} - - {{/if}} - {{/each}} - - - - - - - - - {{#if app.sentryUrl}} - - - - {{/if}} - - - - - - - - - - - - {{#each fragments}} - - - {{/each}} - - - {{#if analytics}} - - {{/if}} - - - - - - - - - diff --git a/archive/core/root/script.hbs b/archive/core/root/script.hbs deleted file mode 100644 index 27e4db3..0000000 --- a/archive/core/root/script.hbs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/archive/core/scripts/index.js b/archive/core/scripts/index.js deleted file mode 100644 index d644e7b..0000000 --- a/archive/core/scripts/index.js +++ /dev/null @@ -1,2 +0,0 @@ -Object.defineProperty(window, 'pathToRegexp', { value: window.pathToRegexp || require('path-to-regexp') }) -Object.defineProperty(window, 'Redux', { value: window.Redux || require('redux') }) diff --git a/archive/core/service-worker/routing.js b/archive/core/service-worker/routing.js deleted file mode 100644 index 0541873..0000000 --- a/archive/core/service-worker/routing.js +++ /dev/null @@ -1,21 +0,0 @@ -for (var i in app.firebaseConfig) { - router.registerRoute({route: new workbox.routing.ExpressRoute({ - path: 'https://' + app.firebaseConfig[i].projectId + '.firebaseio.com/:json+', - handler: function (obj) { - var event = obj.event - var url = obj.url - - return fetch(url.href) - .then(function (response) { - caches.open(app.shortTitle).then(function (cache) { - cache.put(event.request, response) - }) - return response.clone() - }) - .catch(function (err) { - console.log(err, url.href, caches.match(url.href)) - return caches.match(url.href) - }) - } - })}) -} diff --git a/archive/core/shell/app-shell.html b/archive/core/shell/app-shell.html deleted file mode 100644 index fec9c4a..0000000 --- a/archive/core/shell/app-shell.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - - - - - - - diff --git a/archive/core/shell/test/app-shell.test.html b/archive/core/shell/test/app-shell.test.html deleted file mode 100644 index 1c19002..0000000 --- a/archive/core/shell/test/app-shell.test.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - app-shell test - - - - - - - - - - - - - - - - - diff --git a/archive/core/test/core.test.html b/archive/core/test/core.test.html deleted file mode 100644 index 8b4f3a4..0000000 --- a/archive/core/test/core.test.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - diff --git a/archive/core/test/essentials.js b/archive/core/test/essentials.js deleted file mode 100644 index bd7268e..0000000 --- a/archive/core/test/essentials.js +++ /dev/null @@ -1,85 +0,0 @@ -// set project namespace -Object.defineProperty(window, 'App', { value: window.App || {} }) -Object.defineProperty(App, 'Mixins', { value: App.Mixins || {} }) -Object.defineProperty(App, 'utils', { value: App.utils || {} }) -Object.defineProperty(App.utils, 'extends', { value: App.utils.extends || Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key] } } } return target } }) -/** - * Merges a property's object value using the defaults way. - * - * @private - * @param {Object} what Initial prototype - * @param {String} which Property to collect. - * @return {Object} the collected values - */ -Object.defineProperty(App.utils, 'collect', { value: App.utils.collect || function (what, which) { - var res = {} - while (what) { - res = App.utils.extends({}, what[which], res) // Respect prototype priority - what = Object.getPrototypeOf(what) - } - return res -}}) -Object.defineProperty(App.utils, 'isEmpty', { value: App.utils.isEmpty || function (obj) { - for (var key in obj) { - if (obj.hasOwnProperty(key)) return false - } - return true -}}); -(() => { - var __currentUsed = 0 - Object.defineProperty(App.utils, 'checkStorage', { value: App.utils.checkStorage || function () { - if (window.navigator && navigator.storage && navigator.storage.estimate) { - return navigator.storage.estimate() - } else if (window.navigator && - navigator.webkitTemporaryStorage && - navigator.webkitTemporaryStorage.queryUsageAndQuota && - typeof navigator.webkitTemporaryStorage.queryUsageAndQuota === 'function') { - return new Promise((resolve, reject) => { - navigator.webkitTemporaryStorage.queryUsageAndQuota( - (usedBytes, grantedBytes) => { - if (__currentUsed && App.__build !== 'prod') { - console.log('added data:', ((usedBytes - __currentUsed) / 1024) / 1024, 'MB. Current used:', (usedBytes / 1024) / 1024, 'MB') - } - __currentUsed = usedBytes - return resolve({ - usage: usedBytes - }) - }, reject) - }) - } else { - Promise.resolve({ - type: 'no_navigator_storage' - }) - } - }}); - App.utils.checkStorage() -})() - -Object.defineProperty(App, '__dataRestStaleTime', { value: 60 }) -Object.defineProperty(App, '__firebaseFetch', { value: App.__firebaseFetch || {} }) -Object.defineProperty(App, '__firebaseVersion', { value: App.__firebaseVersion || '4.2.0' }) - -// set project build -Object.defineProperty(App, '__build', { value: App.__build || '0.0.1' }) -Object.defineProperty(App, '__version', { value: App.__version || '0.0.1' }) -Object.defineProperty(App, '__database', { value: App.__database || 'dev' }) -Object.defineProperty(App, '__analytics', { value: App.__analytics || '' }) - -// set config variables -Object.defineProperty(App, '__routes', { value: App.__routes || '{}' }) -Object.defineProperty(App, '__shellComponents', { value: App.__shellComponents || '{}' }) -Object.defineProperty(App, 'Reducers', { value: App.Reducers || {} }) -Object.defineProperty(App, 'Actions', { value: App.Actions || {} }) - -if (window.performance) { - window.globalStart = window.globalStart || performance.now() -} - -// Register the base URL -window.App.baseUrl = window.App.baseUrl || '/' - -// loading more essential files - -var script = document.createElement('script') -script.src = 'index.js' -document.head.appendChild(script) diff --git a/archive/src/config/dev.json b/archive/src/config/dev.json deleted file mode 100644 index 31f4dd5..0000000 --- a/archive/src/config/dev.json +++ /dev/null @@ -1,139 +0,0 @@ -{ - "app": { - "title": "GDG DevFest Philippines 2017", - "shortTitle": "DevFestPh", - "description": "In celebration of GDG Philippines 10th Anniversary, we bring to you the Grandest Technology event of the year - GDG DevFest Philippines 2017! GDG DevFest Philippines brings together experts in Mobile, Web and Cloud technologies to Manila for sessions, workshops and showcases. In this conference our goal is to equip you with new knowledge & skills that you can immediately apply and bring back to your respective companies.", - "baseHref": "/", - "twitter": "@gdgphilippines", - "image": "https://devfestph.firebaseapp.com/images/header.png", - "analytics": "UA-78413383-2", - "firebaseVersion": "4.2.0", - "database": "dev", - "waitBeforeFetchingSameURLInRest": 60, - "sentryUrl": "https://85d1091a410948caa823a5230bd0dbcf@sentry.io/204253", - "appVersion": "0.0.1", - "firebaseConfig": [] - }, - "theme": { - "src": "modules/devfest-theme", - "ignoreComponents": [] - }, - "fragments": { - "devfest-landing-page": "modules/devfest-module/pages/devfest-landing-page.html", - "devfest-call-for-speakers-page": "modules/devfest-module/pages/devfest-call-for-speakers-page.html", - "devfest-not-found-page": "modules/devfest-module/pages/devfest-not-found-page.html", - "devfest-not-authorized-page": "modules/devfest-module/pages/devfest-not-authorized-page.html", - "example-app-header": "modules/example-module/components/example-app-header.html", - "example-app-drawer": "modules/example-module/components/example-app-drawer.html" - }, - "routing": { - "/": "devfest-landing-page", - "/index.html": "devfest-landing-page", - "/call-for-speakers": "devfest-call-for-speakers-page" - }, - "httpCodes": { - "not-found": "devfest-not-found-page", - "not-authorized": "devfest-not-authorized-page" - }, - "shellComponents": [ - { - "node": "example-app-header", - "header": true, - "activate": false, - "attrs": [] - }, - { - "node": "example-app-drawer", - "drawer": true, - "activate": false, - "attrs": [] - } - ], - "serviceWorker": { - "globIgnores": [], - "runtimeCaching": [], - "globPatterns": [] - }, - "hosting": { - "rewrites": [ - { - "source": "/api/**", - "function": "app" - } - ], - "headers": [ - { - "source" : "**/*.@(jpg|jpeg|gif|png)", - "headers" : [ - { - "key" : "Cache-Control", - "value" : "max-age=7200" - } - ] - }, - { - "source" : "404.html", - "headers" : [ - { - "key" : "Cache-Control", - "value" : "max-age=300" - } - ] - }, - { - "source": "service-worker.js", - "headers" : [ - { - "key": "Cache-Control", - "value": "no-cache, no-store, must-revalidate" - } - ] - }, - { - "source": "routing-sw-src.js", - "headers" : [ - { - "key": "Cache-Control", - "value": "no-cache, no-store, must-revalidate" - } - ] - }, - { - "source": "routing-sw.js", - "headers" : [ - { - "key": "Cache-Control", - "value": "no-cache, no-store, must-revalidate" - } - ] - }, - { - "source": "sw.js", - "headers" : [ - { - "key": "Cache-Control", - "value": "no-cache, no-store, must-revalidate" - } - ] - }, - { - "source": "workbox-routing.js", - "headers" : [ - { - "key": "Cache-Control", - "value": "no-cache, no-store, must-revalidate" - } - ] - }, - { - "source": "workbox-sw.*.js", - "headers" : [ - { - "key": "Cache-Control", - "value": "no-cache, no-store, must-revalidate" - } - ] - } - ] - } -} diff --git a/archive/src/modules/devfest-module/components/devfest-footer.html b/archive/src/modules/devfest-module/components/devfest-footer.html deleted file mode 100644 index adab217..0000000 --- a/archive/src/modules/devfest-module/components/devfest-footer.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - - - - diff --git a/archive/src/modules/devfest-module/components/gdg-logo.html b/archive/src/modules/devfest-module/components/gdg-logo.html deleted file mode 100644 index 1f628e5..0000000 --- a/archive/src/modules/devfest-module/components/gdg-logo.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - diff --git a/archive/src/modules/devfest-module/fonts/devfest-fonts.html b/archive/src/modules/devfest-module/fonts/devfest-fonts.html deleted file mode 100644 index f864c40..0000000 --- a/archive/src/modules/devfest-module/fonts/devfest-fonts.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/archive/src/modules/devfest-module/icons/devfest-icons.html b/archive/src/modules/devfest-module/icons/devfest-icons.html deleted file mode 100644 index c62d79c..0000000 --- a/archive/src/modules/devfest-module/icons/devfest-icons.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/archive/src/modules/devfest-module/pages/devfest-call-for-speakers-page.html b/archive/src/modules/devfest-module/pages/devfest-call-for-speakers-page.html deleted file mode 100644 index b98c747..0000000 --- a/archive/src/modules/devfest-module/pages/devfest-call-for-speakers-page.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - diff --git a/archive/src/modules/devfest-module/pages/devfest-landing-page.html b/archive/src/modules/devfest-module/pages/devfest-landing-page.html deleted file mode 100644 index f06e62b..0000000 --- a/archive/src/modules/devfest-module/pages/devfest-landing-page.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - diff --git a/archive/src/modules/devfest-module/pages/devfest-not-authorized-page.html b/archive/src/modules/devfest-module/pages/devfest-not-authorized-page.html deleted file mode 100644 index acbbb2d..0000000 --- a/archive/src/modules/devfest-module/pages/devfest-not-authorized-page.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - diff --git a/archive/src/modules/devfest-module/pages/devfest-not-found-page.html b/archive/src/modules/devfest-module/pages/devfest-not-found-page.html deleted file mode 100644 index 1a7bf4a..0000000 --- a/archive/src/modules/devfest-module/pages/devfest-not-found-page.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - diff --git a/archive/src/modules/devfest-theme/components/_button.scss b/archive/src/modules/devfest-theme/components/_button.scss deleted file mode 100644 index 85c7044..0000000 --- a/archive/src/modules/devfest-theme/components/_button.scss +++ /dev/null @@ -1,11 +0,0 @@ -.button { - background: #2e9be6; - color: white; - border: 3px solid #2e9be6; - padding: 24px; - font-size: 24px; - display: inline-block; - text-transform: uppercase; - font-weight: bold; - text-decoration: none; -} diff --git a/archive/src/modules/devfest-theme/components/_footer.scss b/archive/src/modules/devfest-theme/components/_footer.scss deleted file mode 100644 index c2d41e3..0000000 --- a/archive/src/modules/devfest-theme/components/_footer.scss +++ /dev/null @@ -1,79 +0,0 @@ -.footer { - background: #303C42; - color: rgba(255,255,255,0.8); - - - a { - color: inherit; - text-decoration: none; - } - - > .top-mini { - @apply --layout-horizontal; - height: 8px; - - > .flex { - @apply --layout-flex; - height: 8px; - } - - > .color-mini { - height: 8px; - width: 60px; - } - - > .blue-mini { - background-color: #4285F4; - } - - > .red-mini { - background-color: #DB4437; - } - - > .yellow-mini { - background-color: #FFC107; - } - - > .green-mini { - background-color: #0F9D58; - } - } - - > .footer-columns { - padding-top: 20px; - @apply --layout-horizontal; - @apply --layout-wrap; - padding-left: 50px; - padding-right: 50px; - padding-bottom: 20px; - - @media only screen and (max-width: 500px) { - padding-left: 20px; - padding-right: 20px; - } - - > .footer-column { - @apply --layout-flex; - min-width: 200px; - // margin-left: 20px; - // margin-right: 20px; - - > .footer-link-list { - list-style-type: none; - padding: 0; - - > .footer-link-item { - padding-bottom: 5px; - } - } - } - - } - - > .footer-bottom { - background: #37424B; - padding: 20px; - padding-left: 50px; - - } -} diff --git a/archive/src/modules/devfest-theme/components/_gdg-logo.scss b/archive/src/modules/devfest-theme/components/_gdg-logo.scss deleted file mode 100644 index f62ef0a..0000000 --- a/archive/src/modules/devfest-theme/components/_gdg-logo.scss +++ /dev/null @@ -1,11 +0,0 @@ -.gdg-logo-anchor { - display: block; - vertical-align: middle; - text-decoration: none; - color: rgba(255, 255, 255, 0.5); - font-size: 24px; - - > img { - height: 24px; - } -} diff --git a/archive/src/modules/devfest-theme/components/_header.scss b/archive/src/modules/devfest-theme/components/_header.scss deleted file mode 100644 index 9c6b081..0000000 --- a/archive/src/modules/devfest-theme/components/_header.scss +++ /dev/null @@ -1,81 +0,0 @@ -.header { - font-family: 'Roboto'; - position: relative; - min-height: 100vh; - background: url('/images/devfest-bg-repeatable.png') center/contain repeat; - - > .header-white { - background: rgba(255,255,255, 0.75); - min-height: 100%; - position: absolute; - width: 100%; - top: 0; - bottom: 0; - left: 0; - right: 0; - } - - > .header-container { - position: relative; - height: 100vh; - @apply --layout-horizontal; - @apply --layout-center; - - > .header-image-text-container { - @apply --layout-flex; - - > .header-image { - position: relative; - // padding-top: 100px; - width: inherit; - text-align: center; - - > img { - width: 80%; - max-width: 600px; - } - } - - > .header-text { - text-align: center; - > h1 { - font-family: 'Product Sans'; - opacity: .75; - } - - } - } - } - - - - - - // > .header-image { - // position: relative; - // height: 100%; - // // padding-top: 10%; - // z-index: 1; - // text-align: center; - // @apply --layout-horizontal; - // @apply --layout-center; - - // background: rgba(255,255,255,0.5); /* For browsers that do not support gradients */ - // background: -webkit-radial-gradient(rgba(255,255,255,1), rgba(255,255,255,0.75), rgba(255,255,255,0)); /* Safari 5.1 to 6.0 */ - // background: -o-radial-gradient(rgba(255,255,255,1), rgba(255,255,255,0.75), rgba(255,255,255,0)); /* For Opera 11.6 to 12.0 */ - // background: -moz-radial-gradient(rgba(255,255,255,1), rgba(255,255,255,0.75), rgba(255,255,255,0)); /* For Firefox 3.6 to 15 */ - // background: radial-gradient(rgba(255,255,255,1), rgba(255,255,255,0.75), rgba(255,255,255,0)); /* Standard syntax */ - - // > .header-image-container { - // height: 60%; - // margin-left: 20px; - // margin-right: 20px; - // background: url('/images/devfest-10x-logo.png') center/contain no-repeat; - // @apply --layout-flex; - // } - - - // } - - -} diff --git a/archive/src/modules/devfest-theme/components/_temp-link.scss b/archive/src/modules/devfest-theme/components/_temp-link.scss deleted file mode 100644 index 27bfff3..0000000 --- a/archive/src/modules/devfest-theme/components/_temp-link.scss +++ /dev/null @@ -1,16 +0,0 @@ -.temp-link { - padding: 20px; - padding-top: 0px; - font-family: 'Roboto', 'Arial', sans-serif; - color: #666; - line-height: 150%; - font-size: 1.25em; - text-align: center; - margin: 0 auto; - max-width: 550px; - padding-bottom: 100px; - - @media only screen and (max-width: 500px) { - font-size: 1em; - } -} diff --git a/archive/src/modules/devfest-theme/partials/_base.scss b/archive/src/modules/devfest-theme/partials/_base.scss deleted file mode 100644 index f8e2208..0000000 --- a/archive/src/modules/devfest-theme/partials/_base.scss +++ /dev/null @@ -1,18 +0,0 @@ -// Font weights -$light: 100; -$regular: 400; -$bold: 600; - -// Base Font -$base-font-family: sans-serif; -$base-font-weight: $regular; -$base-font-size: 13px; -$base-line-height: 1.4; - -// Fixed Font -$fixed-font-family: monospace; -$fixed-font-size: 85%; -$fixed-line-height: $base-line-height; - -// Headings -$header-font-weight: $bold; diff --git a/archive/src/modules/devfest-theme/root.scss b/archive/src/modules/devfest-theme/root.scss deleted file mode 100644 index aa6d516..0000000 --- a/archive/src/modules/devfest-theme/root.scss +++ /dev/null @@ -1,9 +0,0 @@ -// @import "./core/modules/default-theme/partials/*"; -@import './partials/_base.scss'; -@import './components/button.scss'; - -body { - margin: 0; - font-size: $base-font-size; - font-family: 'Roboto', 'Arial', sans-serif; -} diff --git a/archive/src/modules/devfest-theme/theme.json b/archive/src/modules/devfest-theme/theme.json deleted file mode 100644 index 413b86d..0000000 --- a/archive/src/modules/devfest-theme/theme.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "devfest", - "author": "TJ Monserrat", - "themeColor": "#3f51b5", - "backgroundColor": "#3f51b5", - "startUrl": "/index.html", - "display": "standalone", - "webApp": { - "capable": "yes", - "statusBarStyle": "black-translucent", - "tapHighlight": "no" - }, - "icons": [ - { - "src": "images/icons/icon-48x48.png", - "sizes": "48x48", - "type": "image/png" - }, - { - "src": "images/icons/icon-72x72.png", - "sizes": "72x72", - "type": "image/png" - }, - { - "src": "images/icons/icon-96x96.png", - "sizes": "96x96", - "type": "image/png" - }, - { - "src": "images/icons/icon-128x128.png", - "sizes": "128x128", - "type": "image/png" - }, - { - "src": "images/icons/icon-144x144.png", - "sizes": "144x144", - "type": "image/png", - "tileImage": true - }, - { - "src": "images/icons/icon-152x152.png", - "sizes": "152x152", - "type": "image/png" - }, - { - "src": "images/icons/icon-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "images/icons/icon-384x384.png", - "sizes": "384x384", - "type": "image/png" - }, - { - "src": "images/icons/icon-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "dependencies": [ - "../../bower_components/iron-flex-layout/iron-flex-layout.html" - ] -} diff --git a/archive/src/modules/devfest-theme/theme.scss b/archive/src/modules/devfest-theme/theme.scss deleted file mode 100644 index 669e14a..0000000 --- a/archive/src/modules/devfest-theme/theme.scss +++ /dev/null @@ -1,9 +0,0 @@ -@import './components/header'; -@import './components/temp-link.scss'; -@import './components/footer.scss'; -@import './components/button.scss'; -@import './components/gdg-logo'; - -:host { - font-family: 'Roboto', 'Arial', sans-serif; -} diff --git a/archive/src/modules/example-data/models/example-data.html b/archive/src/modules/example-data/models/example-data.html deleted file mode 100644 index 69b0f15..0000000 --- a/archive/src/modules/example-data/models/example-data.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - diff --git a/archive/src/modules/example-data/reducers/reducers.html b/archive/src/modules/example-data/reducers/reducers.html deleted file mode 100644 index 1594747..0000000 --- a/archive/src/modules/example-data/reducers/reducers.html +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/archive/src/modules/example-module/components/example-app-header.html b/archive/src/modules/example-module/components/example-app-header.html deleted file mode 100644 index e69de29..0000000 diff --git a/archive/src/modules/example-module/pages/example-home-page.html b/archive/src/modules/example-module/pages/example-home-page.html deleted file mode 100644 index e69de29..0000000 diff --git a/archive/src/modules/example-module/pages/example-not-authorized-page.html b/archive/src/modules/example-module/pages/example-not-authorized-page.html deleted file mode 100644 index e69de29..0000000 diff --git a/archive/src/modules/example-module/pages/example-not-found-page.html b/archive/src/modules/example-module/pages/example-not-found-page.html deleted file mode 100644 index e69de29..0000000 diff --git a/archive/src/opts/auth-functions.html b/archive/src/opts/auth-functions.html deleted file mode 100644 index 38f4d67..0000000 --- a/archive/src/opts/auth-functions.html +++ /dev/null @@ -1,16 +0,0 @@ - diff --git a/archive/src/rules/database.dev.json b/archive/src/rules/database.dev.json deleted file mode 100644 index 4a116eb..0000000 --- a/archive/src/rules/database.dev.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - ".read": true, - ".write": "auth != null" -} diff --git a/archive/src/scripts/index.js b/archive/src/scripts/index.js deleted file mode 100644 index 0f112e3..0000000 --- a/archive/src/scripts/index.js +++ /dev/null @@ -1,4 +0,0 @@ -// put other index scripts here -if (App.__prod !== 'prod') { - console.log('Root script loaded') -} diff --git a/archive/src/service-worker/routing.js b/archive/src/service-worker/routing.js deleted file mode 100644 index d8325fd..0000000 --- a/archive/src/service-worker/routing.js +++ /dev/null @@ -1,14 +0,0 @@ -// put routing things here -router.registerRoute({route: new workbox.routing.ExpressRoute({ - path: '/api/landing-temp-link', - handler: workboxSW.strategies.networkFirst({ - networkTimeoutSeconds: 3, - cacheExpiration: { - maxEntries: 10, - maxAgeSeconds: 60 * 60 * 24 - }, - cacheableResponse: { - statuses: [200, 400, 404, 500] - } - }) -})}) diff --git a/bower.json b/bower.json index d1bb5a2..1068799 100644 --- a/bower.json +++ b/bower.json @@ -30,7 +30,12 @@ "paper-item": "PolymerElements/paper-item#^2.0.0", "paper-toast": "PolymerElements/paper-toast#^2.0.0", "google-map": "GoogleWebComponents/google-map#^2.0.2", - "iron-media-query": "PolymerElements/iron-media-query#^2.0.0" + "iron-media-query": "PolymerElements/iron-media-query#^2.0.0", + "paper-button": "PolymerElements/paper-button#^2.0.0", + "paper-spinner": "PolymerElements/paper-spinner#^2.0.0", + "paper-input": "PolymerElements/paper-input#^2.0.2", + "paper-dialog": "PolymerElements/paper-dialog#^2.0.0", + "paper-fab": "PolymerElements/paper-fab#^2.0.0" }, "devDependencies": { "web-component-tester": "^6.0.0" diff --git a/core/modules/state-manager/index.js b/core/modules/state-manager/index.js new file mode 100644 index 0000000..aa2103f --- /dev/null +++ b/core/modules/state-manager/index.js @@ -0,0 +1,12 @@ +import { createStore } from 'redux'; +import PolymerRedux from 'polymer-redux'; + +const reducers = {}; + +const initialStore = {}; + +const store = createStore((state = initialStore, action) => state); + +const ReduxMixin = PolymerRedux(store); + +export { reducers, store, ReduxMixin }; diff --git a/archive/src/modules/example-module/components/example-app-drawer.html b/core/modules/state-manager/polymer-redux.js similarity index 100% rename from archive/src/modules/example-module/components/example-app-drawer.html rename to core/modules/state-manager/polymer-redux.js diff --git a/core/shell/index.ejs b/core/shell/index.ejs index 5c85960..7ed2312 100644 --- a/core/shell/index.ejs +++ b/core/shell/index.ejs @@ -5,7 +5,7 @@ <% htmlWebpackPlugin.options.theme = htmlWebpackPlugin.options.getConfig(htmlWebpackPlugin.options.env).theme %> - + <%= htmlWebpackPlugin.options.config.app.title %> @@ -194,7 +194,7 @@ <% for (var i in htmlWebpackPlugin.options.config.routing) { var node = htmlWebpackPlugin.options.config.routing[i].name || htmlWebpackPlugin.options.config.routing[i] %> - <<%= node %> route="<%= i %>">> + <<%= node %> route="<%= i %>" <% if (htmlWebpackPlugin.options.config.routing[i].auth) { %> auth="<%= htmlWebpackPlugin.options.config.routing[i].auth %>" <% } %>>> <% } %> <% for (var i in htmlWebpackPlugin.options.config.httpCodes) { var node = htmlWebpackPlugin.options.config.httpCodes[i].name || htmlWebpackPlugin.options.config.httpCodes[i] %> <<%= node %> route="<%= i %>">> diff --git a/core/shell/index.js b/core/shell/index.js index e0b3cb6..8b17ebc 100644 --- a/core/shell/index.js +++ b/core/shell/index.js @@ -7,10 +7,37 @@ import routing from '../../src/routing.js' import httpCodes from '../../src/http-codes.js' import partials from '../../src/partials.js' import auth from '../../src/authentication/index.js' +import { reducers, store, ReduxMixin } from '../modules/state-manager'; +import { combineReducers } from 'redux'; +import '../../src/firebase'; + +const ROUTER_ACTION = { + PARAMS: 'ROUTER_UPDATE_PARAMS', + ROUTE: 'ROUTER_UPDATE_ROUTE' +}; + +reducers.router = (router = {}, action) => { + switch (action.type) { + case ROUTER_ACTION.PARAMS: + return Object.assign({}, router, { + params: action.params + }); + case ROUTER_ACTION.ROUTE: + return Object.assign({}, router, { + route: action.route + }); + default: + return router; + } +}; + +store.replaceReducer(combineReducers(reducers)); + +export { ROUTER_ACTION }; const messages = [] -class AppShell extends QueryParamsMixin(LocationMixin(Polymer.Element)) { +class AppShell extends ReduxMixin(QueryParamsMixin(LocationMixin(Polymer.Element))) { static get is () { return 'app-shell' } static get properties () { @@ -215,16 +242,26 @@ class AppShell extends QueryParamsMixin(LocationMixin(Polymer.Element)) { } routeName = route[0] this.params = params + + this.dispatch({ + type: ROUTER_ACTION.PARAMS, + params + }); } }) + this.dispatch({ + type: ROUTER_ACTION.ROUTE, + route: routeName || 'not-found' + }); + this._checkAuth(routeName || 'not-found') } _checkAuth (route) { if (this._routes[route] && this._routes[route].auth && auth[this._routes[route].auth]) { if (auth[this._routes[route].auth] instanceof Promise) { - auth[this._routes[route].auth]() + auth[this._routes[route].auth] .then((res) => { if (res) { this._loadPage(route) @@ -257,8 +294,20 @@ class AppShell extends QueryParamsMixin(LocationMixin(Polymer.Element)) { } if (this._routes[route]) { routes[route]().then(() => { + + if (!this._routes[route].element.constructor.is || + this._routes[route].element.constructor === this._routes[route].element.nodeName.toLowerCase()) { + this.dispatch({ + type: ROUTER_ACTION.ROUTE, + route: 'not-found' + }); + + this._checkAuth('not-found') + } + this._routes[route].element._setProperty('params', this.params) this._routes[route].element._setProperty('queryParams', this.paramsObject) + if (this._routes[route].element.reload) { this._routes[route].element.reload() } diff --git a/database.rules.json b/database.rules.json index 2060fb5..64e8be5 100644 --- a/database.rules.json +++ b/database.rules.json @@ -1,8 +1,96 @@ { "rules": { - "dev": { - ".read": true, - ".write": "auth != null" + + "v1": { + "$modelName": { + "$query": { + ".read": true, + ".indexOn": ["value"] + } + }, + "codelabs": { + ".read": true + }, + "codelabtype": { + ".read": true + }, + "codelabChecker": { + ".read": false + }, + "sponsors": { + "source": { + "$sponsor": { + "primary": { + ".read": true + } + } + } + }, + "user": { + "source": { + "$uid": { + "primary": { + ".read": "auth != null && auth.uid == $uid", + "email": { + ".write": "!data.exists()" + }, + "displayName": { + ".read": true + }, + "image": { + ".read": true + }, + "ticketNumber": { + ".write": false + }, + "ticketEmail": { + ".write": false + }, + "ticketName": { + ".write": false + }, + "github": { + ".read": true, + ".write": "(!data.exists() || !newData.exists()) && auth != null && auth.uid == $uid" + }, + "githubName": { + ".read": true, + ".write": "(!data.exists() || !newData.exists()) && auth != null && auth.uid == $uid" + } + }, + "meta": { + ".read": "auth != null && auth.uid == $uid", + "accepted": { + ".read": true, + ".write": "auth != null && auth.uid == $uid" + }, + "score": { + ".read": true, + ".write": false + }, + "verified": { + ".read": true, + ".write": false + }, + "dateJoined": { + ".read": true, + ".write": "!data.exists()" + } + }, + "cross": { + ".read": "auth != null && auth.uid == $uid", + "sponsor": { + ".read": true, + ".write": false + }, + "codelabsDone": { + ".read": true, + ".write": false + } + } + } + } + } } } } \ No newline at end of file diff --git a/firebase.json b/firebase.json index 6dbcc4a..7286178 100644 --- a/firebase.json +++ b/firebase.json @@ -5,8 +5,28 @@ "hosting": { "rewrites": [ { - "source": "/api/**", - "function": "app" + "source": "/connect", + "function": "connect" + }, + { + "source": "/validate-sponsor", + "function": "validate" + }, + { + "source": "/scan-id", + "function": "scanId" + }, + { + "source": "/disconnect", + "function": "disconnect" + }, + { + "source": "/scanned-list-for-sponsor", + "function": "scannedList" + }, + { + "source": "/submit-repo", + "function": "submitRepo" }, { "source": "/", @@ -40,6 +60,50 @@ "source": "/sponsors", "destination": "/index.html" }, + { + "source": "/tnc", + "destination": "/index.html" + }, + { + "source": "/login", + "destination": "/index.html" + }, + { + "source": "/profile", + "destination": "/index.html" + }, + { + "source": "/codelabs/**/**/**", + "destination": "/index.html" + }, + { + "source": "/codelabs/**/**", + "destination": "/index.html" + }, + { + "source": "/codelabs/**", + "destination": "/index.html" + }, + { + "source": "/codelabs", + "destination": "/index.html" + }, + { + "source": "/connect-ticket", + "destination": "/index.html" + }, + { + "source": "/scan", + "destination": "/index.html" + }, + { + "source": "/scanned-list", + "destination": "/index.html" + }, + { + "source": "/are-you-a-sponsor", + "destination": "/index.html" + }, { "source": "/auth-check", "destination": "/index.html" diff --git a/firestore.indexes.json b/firestore.indexes.json new file mode 100644 index 0000000..2a6adac --- /dev/null +++ b/firestore.indexes.json @@ -0,0 +1,14 @@ +{ + // Example: + // + // "indexes": [ + // { + // "collectionId": "widgets", + // "fields": [ + // { "fieldPath": "foo", "mode": "ASCENDING" }, + // { "fieldPath": "bar", "mode": "DESCENDING" } + // ] + // } + // ] + "indexes": [] +} \ No newline at end of file diff --git a/firestore.rules b/firestore.rules new file mode 100644 index 0000000..31eda17 --- /dev/null +++ b/firestore.rules @@ -0,0 +1,7 @@ +service cloud.firestore { + match /databases/{database}/documents { + match /{document=**} { + allow read, write; + } + } +} diff --git a/functions/index.js b/functions/index.js index ce475e2..4a5fb01 100644 --- a/functions/index.js +++ b/functions/index.js @@ -1,4 +1,756 @@ -const functions = require('firebase-functions') +const functions = require('firebase-functions'); +const admin = require('firebase-admin'); +const fetch = require('node-fetch'); +const fs = require('fs'); +const path = require('path'); +var Chance = require('chance'); + +// Instantiate Chance so it can be used +var chance = new Chance(); + +if (fs.existsSync(path.resolve(__dirname, './firebase-config.json'))) { + var serviceAccount = require('./firebase-config.json'); + admin.initializeApp({ + credential: admin.credential.cert(serviceAccount), + databaseURL: 'https://devfestph.firebaseio.com' + }); +} else { + admin.initializeApp(functions.config().firebase); +} + +let eventbrite = null; +let event = null; + +if (fs.existsSync(path.resolve(__dirname, './eventbrite.json'))) { + eventbrite = JSON.parse(fs.readFileSync(path.resolve(__dirname, './eventbrite.json'), 'utf8')).key; + event = JSON.parse(fs.readFileSync(path.resolve(__dirname, './eventbrite.json'), 'utf8')).event; +} + +eventbrite = eventbrite || process.env.EVENTBRITE; +event = event || process.env.EVENT; + +exports.createProfile = functions.auth.user().onCreate(event => { + const user = event.data; + const email = user.email; + const displayName = user.displayName || email; + const uid = user.uid; + const image = user.photoURL; + const updates = {}; + const path = `v1/user/source/${uid}`; + updates[`${path}/primary/email`] = email; + updates[`${path}/primary/displayName`] = displayName; + updates[`${path}/primary/image`] = image; + updates[`${path}/primary/ticketNumber`] = ''; + updates[`${path}/primary/ticketEmail`] = ''; + updates[`${path}/primary/ticketName`] = ''; + updates[`${path}/meta/accepted`] = false; + updates[`${path}/meta/score`] = 0; + updates[`${path}/meta/verified`] = false; + updates[`${path}/meta/dateJoined`] = admin.database.ServerValue.TIMESTAMP; + // updates[`${path}/cross/ticketEmail`] = ''; + admin.database().ref().update(updates); + // ... +}); + +exports.updateScore = functions.database.ref('v1/user/source/{userId}/cross/codelabs') + .onWrite(event => { + var score = 0; + var updates = {}; + if (!event.data.exists()) { + event.data.previous.forEach(child => { + updates[`v1/codelabs/source/${child.key}/cross/scores/${event.params.userId}/value`] = score; + updates[`v1/codelabtype/source/${child.val().type}/cross/scores/${event.params.userId}/value`] = score; + }); + updates[`v1/user/source/${event.params.userId}/meta/score`] = score; + updates[`v1/user/query/score/${event.params.userId}/value`] = score; + } else { + event.data.forEach(child => { + updates[`v1/codelabs/source/${child.key}/cross/scores/${event.params.userId}/value`] = child.val().value; + if (updates[`v1/codelabtype/source/${child.val().type}/cross/scores/${event.params.userId}/value`]) { + updates[`v1/codelabtype/source/${child.val().type}/cross/scores/${event.params.userId}/value`] += child.val().value; + } else { + updates[`v1/codelabtype/source/${child.val().type}/cross/scores/${event.params.userId}/value`] = child.val().value; + } + score = score + child.val().value; + }); + updates[`v1/user/source/${event.params.userId}/meta/score`] = score; + updates[`v1/user/query/score/${event.params.userId}/value`] = score; + } + + + return admin.database().ref().update(updates); + }); + +exports.validate = functions.https.onRequest((req, res) => { + if (!req.body.token) { + return res + .status(404) + .json({ + success: false, + message: 'No auth or uid found' + }); + } + + if (!req.body.validate) { + return res + .status(404) + .json({ + success: false, + message: 'No verification code found' + }); + } + + if (!req.body.company) { + return res + .status(404) + .json({ + success: false, + message: 'No company ID found' + }); + } + + const updates = {}; + const promises = []; + + promises.push( + admin.auth().verifyIdToken(req.body.token) + ); + + promises.push( + admin.database().ref(`v1/sponsors/source/${req.body.company}/meta/code`) + .once('value') + ); + + Promise.all(promises) + .then(results => { + const user = results[0]; + const sponsor = results[1]; + + if (!sponsor.exists()) { + var error3 = { + status_code: 404, + message: 'No Sponsor found for the given company ID' + }; + return Promise.reject(error3); + } + + if (!user) { + var error2 = { + status_code: 404, + message: 'No User found' + }; + return Promise.reject(error2); + } + + if (sponsor.val() !== req.body.validate) { + var error4 = { + status_code: 404, + message: 'Invalidate code given' + }; + return Promise.reject(error4); + } + + updates[`v1/sponsors/source/${req.body.company}/cross/sponsorUsers/${user.uid}/value`] = true; + updates[`v1/user/source/${user.uid}/cross/sponsorId`] = req.body.company; + + return admin.database().ref().update(updates); + }) + .then(() => { + res + .status(200) + .json({ + success: true + }); + }) + .catch(error => { + console.log(error); + return res + .status(error.status_code || 500) + .json(error); + }); +}); + +exports.scanId = functions.https.onRequest((req, res) => { + if (!req.body.token) { + return res + .status(404) + .json({ + success: false, + message: 'No auth or uid found' + }); + } + + if (!req.body.id) { + return res + .status(404) + .json({ + success: false, + message: 'No ticket Id found' + }); + } + + if (!req.body.company) { + return res + .status(404) + .json({ + success: false, + message: 'No company Id found' + }); + } + + const updates = {}; + const promises = []; + + promises.push( + admin.auth().verifyIdToken(req.body.token) + ); + + promises.push( + admin.database().ref(`v1/eventbrite/source/${req.body.id}`).once('value') + ); + + promises.push( + admin.database().ref(`v1/sponsors/source/${req.body.company}/cross/sponsorUsers/`) + .once('value') + ); + + Promise.all(promises) + .then(results => { + var user = results[0]; + var eventbrite = results[1]; + var sponsor = results[2]; + + if (!sponsor.exists()) { + var error3 = { + status_code: 404, + message: 'No Sponsor found for the given company ID' + }; + return Promise.reject(error3); + } + + if (!user) { + var error2 = { + status_code: 404, + message: 'No User found' + }; + return Promise.reject(error2); + } + + if (!sponsor.val()[user.uid].value) { + var error5 = { + status_code: 403, + message: 'Your user is not connected to this sponsor' + }; + return Promise.reject(error5); + } + + if (!eventbrite.exists()) { + var error = { + status_code: 403, + message: `This ticket is not connected to an account or the attendee hasn't accepted the terms and conditions :(` + }; + return Promise.reject(error); + } + + return Promise.all([ + Promise.resolve(eventbrite), + Promise.resolve(sponsor), + Promise.resolve(user), + admin.database().ref(`v1/user/source/${eventbrite.val().primary.uid}`).once('value') + ]); + }) + .then(results => { + // var eventbrite = results[0]; + // var sponsor = results[1]; + var user = results[2]; + var attendee = results[3]; + + if (attendee.val().primary.ticketNumber.substring(9, 18) !== req.body.id.substring(9, 18)) { + var error = { + status_code: 403, + message: `This ticket is not connected to the scanned id :(` + }; + return Promise.reject(error); + } + + if (!attendee.val().meta.accepted) { + var error2 = { + status_code: 403, + message: `Attendee hasn't accepted the Terms and Conditions. :( ` + }; + return Promise.reject(error2); + } + + updates[`v1/sponsors/source/${req.body.company}/cross/scanned/${attendee.key}/dateScanned`] = admin.database.ServerValue.TIMESTAMP; + updates[`v1/sponsors/source/${req.body.company}/cross/scanned/${attendee.key}/email`] = attendee.val().primary.email; + updates[`v1/sponsors/source/${req.body.company}/cross/scanned/${attendee.key}/ticketEmail`] = attendee.val().primary.ticketEmail; + updates[`v1/sponsors/source/${req.body.company}/cross/scanned/${attendee.key}/ticketName`] = attendee.val().primary.ticketName; + updates[`v1/sponsors/source/${req.body.company}/cross/scanned/${attendee.key}/displayName`] = attendee.val().primary.displayName; + updates[`v1/sponsors/source/${req.body.company}/cross/scanned/${attendee.key}/scannedByUid`] = user.uid; + updates[`v1/sponsors/source/${req.body.company}/cross/scanned/${attendee.key}/scannedBy`] = user.name || user.displayName || user.email; + updates[`v1/sponsors/source/${req.body.company}/cross/scanned/${attendee.key}/scannedByEmail`] = user.email; + + return admin.database().ref().update(updates); + }) + .then(() => { + res + .status(200) + .json({ + success: true + }); + }) + .catch(error => { + console.log(error); + return res + .status(error.status_code || 500) + .json(error); + }); +}); + +exports.submitRepo = functions.https.onRequest((req, res) => { + if (!req.body.token) { + return res + .status(404) + .json({ + success: false, + message: 'No auth or uid found' + }); + } + + if (!req.body.repo) { + return res + .status(404) + .json({ + success: false, + message: 'No repository found' + }); + } + + if (!req.body.codelabId) { + return res + .status(404) + .json({ + success: false, + message: 'No codelabId found' + }); + } + + const github = 'https://raw.githubusercontent.com'; + const updates = {}; + const promises = []; + + admin.auth().verifyIdToken(req.body.token) + .then(user => { + if (!user) { + var error2 = { + status_code: 404, + message: 'No User found' + }; + return Promise.reject(error2); + } + + promises.push( + Promise.resolve(user) + ); + + promises.push( + admin.database().ref(`v1/user/source/${user.uid}/primary/githubName`).once('value') + ); + + promises.push( + admin.database().ref(`v1/user/source/${user.uid}/meta/accepted`).once('value') + ); + + promises.push( + admin.database().ref(`v1/codelabChecker/source/${req.body.codelabId}/primary/files`).once('value') + ); + + promises.push( + admin.database().ref(`v1/codelabs/source/${req.body.codelabId}/meta/type`).once('value') + ); + + return Promise.all(promises); + }) + .then(results => { + var user = results[0]; + var githubName = results[1].val(); + var accepted = results[2].val(); + var codelab = results[3]; + var typeSnapshot = results[4]; + var newPromises = []; + + var multiplier = accepted ? 2 : 1; + + if (!githubName) { + var error2 = { + status_code: 404, + message: 'No Github account found' + }; + return Promise.reject(error2); + } + + if (!codelab.exists()) { + var error3 = { + status_code: 404, + message: 'No codelab id found' + }; + return Promise.reject(error3); + } + + if (!typeSnapshot.exists()) { + var error4 = { + status_code: 404, + message: 'No codelab type found' + }; + return Promise.reject(error4); + } + + newPromises.push(Promise.resolve(user)); + newPromises.push(Promise.resolve(multiplier)); + var list = []; + codelab.forEach(child => { + list.push(child.val()); + }); + + const index = chance.integer({min: 0, max: list.length - 1}); + newPromises.push(Promise.resolve(list[index].strings)); + console.log(`${github}/${githubName}/${req.body.repo}/master${list[index].filename}`); + newPromises.push(fetch(`${github}/${githubName}/${req.body.repo}/master${list[index].filename}`).then(response => response.text())); + newPromises.push(Promise.resolve(typeSnapshot.val())); + + return Promise.all(newPromises); + }) + .then(results => { + var user = results[0]; + var multiplier = results[1]; + var strings = results[2]; + var string = results[3]; + var type = results[4]; + var score = 0; + + if (string.indexOf('404: Not Found') < 0) { + score = 5 * multiplier; + } + + if (strings && strings.length) { + for (var i in strings) { + // console.log(strings[i], string.indexOf(strings[i])) + if (string.indexOf(strings[i]) >= 0) { + score = score + (multiplier * 1); + } + } + } + + updates[`v1/user/source/${user.uid}/cross/codelabs/${req.body.codelabId}/value`] = score; + updates[`v1/user/source/${user.uid}/cross/codelabs/${req.body.codelabId}/type`] = type; + + return admin.database().ref().update(updates); + // console.log(score); + + // return Promise.resolve(); + }) + .then(() => { + res + .status(200) + .json({ + success: true + }); + }) + .catch(error => { + console.log(error); + return res + .status(error.status_code || 500) + .json(error); + }); + // https://raw.githubusercontent.com/ +}); + +exports.scannedList = functions.https.onRequest((req, res) => { + if (!req.body.token) { + return res + .status(404) + .json({ + success: false, + message: 'No auth or uid found' + }); + } + + if (!req.body.company) { + return res + .status(404) + .json({ + success: false, + message: 'No repository found' + }); + } + + const promises = []; + + promises.push( + admin.auth().verifyIdToken(req.body.token) + ); + + promises.push( + admin.database().ref(`v1/sponsors/source/${req.body.company}/cross/sponsorUsers/`) + .once('value') + ); + + promises.push( + admin.database().ref(`v1/sponsors/source/${req.body.company}/cross/scanned/`) + .once('value') + ); + + Promise.all(promises) + .then(results => { + var user = results[0]; + var sponsor = results[1]; + var scanned = results[2]; + var list = []; + + if (!user) { + var error2 = { + status_code: 404, + message: 'No User found' + }; + return Promise.reject(error2); + } + + if (!sponsor.exists()) { + var error3 = { + status_code: 404, + message: 'No Sponsor found for the given company ID' + }; + return Promise.reject(error3); + } + + if (!sponsor.val()[user.uid].value) { + var error5 = { + status_code: 403, + message: 'Your user is not connected to this sponsor' + }; + return Promise.reject(error5); + } + + scanned.forEach(child => { + list.push({ + $key: child.key, + displayName: child.val().displayName, + email: child.val().email, + scannedBy: child.val().scannedBy, + dateScanned: child.val().dateScanned + }); + }); + + list.sort((a, b) => { + return a.dateScanned - b.dateScanned; + }); + + return res + .status(200) + .json({ + success: true, + list + }); + }) + .catch(error => { + console.log(error); + return res + .status(error.status_code || 500) + .json(error); + }); +}); + +exports.disconnect = functions.https.onRequest((req, res) => { + if (!req.body.token) { + return res + .status(404) + .json({ + success: false, + message: 'No auth or uid found' + }); + } + + if (!req.body.id) { + return res + .status(404) + .json({ + success: false, + message: 'No ticket Id found' + }); + } + + const updates = {}; + const promises = []; + + promises.push( + admin.auth().verifyIdToken(req.body.token) + ); + + promises.push( + admin.database().ref(`v1/sponsors/query/sponsors`).once('value') + ); + + Promise.all(promises) + .then(results => { + var user = results[0]; + var sponsors = results[1]; + + if (!user) { + var error2 = { + status_code: 404, + message: 'No User found' + }; + return Promise.reject(error2); + } + + sponsors.forEach(child => { + updates[`v1/sponsors/source/${child.key}/cross/scanned/${user.uid}`] = null; + }); + + updates[`v1/user/source/${user.uid}/primary/ticketEmail`] = ''; + updates[`v1/user/source/${user.uid}/primary/ticketName`] = ''; + updates[`v1/user/source/${user.uid}/primary/ticketNumber`] = ''; + updates[`v1/user/source/${user.uid}/meta/accepted`] = false; + updates[`v1/user/source/${user.uid}/meta/score`] = 0; + updates[`v1/user/source/${user.uid}/cross/codelabs`] = null; + updates[`v1/eventbrite/source/${req.body.id}`] = null; + + return admin + .database() + .ref() + .update(updates); + }) + .then(() => { + res + .status(200) + .json({ + success: true + }); + }) + .catch(error => { + console.log(error); + return res + .status(error.status_code || 500) + .json(error); + }); +}); + +exports.connect = functions.https.onRequest((req, res) => { + if (!req.body.token) { + return res + .status(404) + .json({ + success: false, + message: 'No auth or uid found' + }); + } + + if (!req.body.id) { + return res + .status(404) + .json({ + success: false, + message: 'No ticket Id found' + }); + } + + const updates = {}; + const promises = []; + + promises.push( + admin.auth().verifyIdToken(req.body.token) + ); + + promises.push( + fetch(`https://www.eventbriteapi.com/v3/events/${event}/attendees/${req.body.id.substring(9, 18)}/?token=${eventbrite}`) + .then(result => { + return result.json(); + }) + ); + + promises.push( + admin.database().ref(`v1/eventbrite/source/${req.body.id}`).once('value') + ); + + Promise.all(promises) + .then(results => { + const user = results[0]; + const json = results[1]; + const snapshot = results[2]; + + if (json.status_code === 400) { + return Promise.reject(json); + } + + if (!json.profile) { + return Promise.reject(json); + } + + if (!user) { + var error2 = { + status_code: 404, + message: 'No User found' + }; + return Promise.reject(error2); + } + + if (snapshot.exists()) { + var eventbriteUser = snapshot.val(); + var error = { + status_code: 403, + message: `${eventbriteUser.primary.displayName} has your ticket. Please approach the person to rescan their ticket or you might have scanning another person's ticket.` + }; + return Promise.reject(error); + } + + return Promise.all([ + Promise.resolve(user), + Promise.resolve(json), + admin + .database() + .ref(`v1/user/source/${user.uid}/primary/ticketNumber`) + .once('value') + ]); + }) + .then(results => { + var user = results[0]; + var json = results[1]; + var snapshot = results[2]; + + if (snapshot.exists()) { + var oldTicketNumber = snapshot.val(); + } + + updates[`v1/user/source/${user.uid}/primary/ticketEmail`] = json.profile.email; + updates[`v1/user/source/${user.uid}/primary/ticketName`] = json.profile.first_name + ' ' + json.profile.last_name; + updates[`v1/user/source/${user.uid}/primary/ticketNumber`] = req.body.id; + updates[`v1/user/source/${user.uid}/meta/accepted`] = true; + updates[`v1/eventbrite/source/${req.body.id}/primary/displayName`] = user.displayName || user.name || user.email; + updates[`v1/eventbrite/source/${req.body.id}/primary/email`] = user.email; + updates[`v1/eventbrite/source/${req.body.id}/primary/uid`] = user.uid; + + if (oldTicketNumber) { + updates[`v1/eventbrite/source/${oldTicketNumber}`] = null; + } + return admin + .database() + .ref() + .update(updates); + }) + .then(() => { + res + .status(200) + .json({ + success: true + }); + }) + .catch(error => { + console.log(error); + return res + .status(error.status_code || 500) + .json(error); + }); +}); // // Create and Deploy Your First Cloud Functions // // https://firebase.google.com/docs/functions/write-firebase-functions diff --git a/functions/package.json b/functions/package.json index 9deb08a..f473044 100644 --- a/functions/package.json +++ b/functions/package.json @@ -2,8 +2,10 @@ "name": "functions", "description": "Cloud Functions for Firebase", "dependencies": { - "firebase-admin": "~4.2.1", - "firebase-functions": "^0.5.7" + "chance": "^1.0.11", + "firebase-admin": "~5.4.0", + "firebase-functions": "^0.7.0", + "node-fetch": "^1.7.3" }, "private": true } diff --git a/functions/yarn.lock b/functions/yarn.lock index 50dfba6..1e6efdc 100644 --- a/functions/yarn.lock +++ b/functions/yarn.lock @@ -2,9 +2,126 @@ # yarn lockfile v1 +"@google-cloud/common-grpc@^0.4.0": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@google-cloud/common-grpc/-/common-grpc-0.4.1.tgz#09264607efb8934309affd63849986fbb80f9218" + dependencies: + "@google-cloud/common" "^0.13.6" + dot-prop "^2.4.0" + duplexify "^3.5.1" + extend "^3.0.0" + grpc "^1.6.0" + is "^3.2.0" + modelo "^4.2.0" + retry-request "^3.0.0" + through2 "^2.0.3" + +"@google-cloud/common@^0.13.0", "@google-cloud/common@^0.13.5", "@google-cloud/common@^0.13.6": + version "0.13.6" + resolved "https://registry.yarnpkg.com/@google-cloud/common/-/common-0.13.6.tgz#a9d8e137bc429a44aba9689fe6a0e4331784f853" + dependencies: + array-uniq "^1.0.3" + arrify "^1.0.1" + concat-stream "^1.6.0" + create-error-class "^3.0.2" + duplexify "^3.5.0" + ent "^2.2.0" + extend "^3.0.0" + google-auto-auth "^0.7.1" + is "^3.2.0" + log-driver "^1.2.5" + methmeth "^1.1.0" + modelo "^4.2.0" + request "^2.79.0" + retry-request "^3.0.0" + split-array-stream "^1.0.0" + stream-events "^1.0.1" + string-format-obj "^1.1.0" + through2 "^2.0.3" + +"@google-cloud/firestore@~0.8.2": + version "0.8.2" + resolved "https://registry.yarnpkg.com/@google-cloud/firestore/-/firestore-0.8.2.tgz#e93a7068b723f0773c1af62f3494c0633ba2d346" + dependencies: + "@google-cloud/common" "^0.13.5" + "@google-cloud/common-grpc" "^0.4.0" + bun "^0.0.12" + extend "^3.0.1" + functional-red-black-tree "^1.0.1" + google-gax "^0.14.1" + grpc "^1.6.0" + is "^3.2.0" + through2 "^2.0.3" + +"@google-cloud/storage@^1.2.1": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-1.4.0.tgz#af5bcac2a986989c46f352b1ca1833be7b383ddb" + dependencies: + "@google-cloud/common" "^0.13.0" + arrify "^1.0.0" + async "^2.0.1" + concat-stream "^1.5.0" + create-error-class "^3.0.2" + duplexify "^3.5.0" + extend "^3.0.0" + gcs-resumable-upload "^0.8.2" + hash-stream-validation "^0.2.1" + is "^3.0.1" + mime-types "^2.0.8" + once "^1.3.1" + pumpify "^1.3.3" + safe-buffer "^5.1.1" + snakeize "^0.1.0" + stream-events "^1.0.1" + string-format-obj "^1.0.0" + through2 "^2.0.0" + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + "@types/express-serve-static-core@*": - version "4.0.51" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.51.tgz#6b436955b8d01b9bc0908f59785c9d44268e91fc" + version "4.0.53" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.53.tgz#1723a35d1447f2c55e13c8721eab3448e42f4d82" dependencies: "@types/node" "*" @@ -15,6 +132,12 @@ "@types/express-serve-static-core" "*" "@types/serve-static" "*" +"@types/google-cloud__storage@^1.1.1": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@types/google-cloud__storage/-/google-cloud__storage-1.1.5.tgz#e45e8bd8d86b72de2a35de2f0d4618b4491f7a19" + dependencies: + "@types/node" "*" + "@types/jsonwebtoken@^7.1.32", "@types/jsonwebtoken@^7.1.33": version "7.2.3" resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-7.2.3.tgz#483c8f39945e1e6d308dcc51fd4aeca5208d4dca" @@ -22,17 +145,29 @@ "@types/node" "*" "@types/lodash@^4.14.34": - version "4.14.74" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.74.tgz#ac3bd8db988e7f7038e5d22bd76a7ba13f876168" + version "4.14.77" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.77.tgz#0bc699413e84d6ed5d927ca30ea0f0a890b42d75" + +"@types/long@^3.0.31": + version "3.0.32" + resolved "https://registry.yarnpkg.com/@types/long/-/long-3.0.32.tgz#f4e5af31e9e9b196d8e5fca8a5e2e20aa3d60b69" "@types/mime@*": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.1.tgz#2cf42972d0931c1060c7d5fa6627fce6bd876f2f" + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b" "@types/node@*": version "8.0.27" resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.27.tgz#13fbe7e92afeecebb843d7cea6c15b521e0000e1" +"@types/node@^7.0.29": + version "7.0.43" + resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.43.tgz#a187e08495a075f200ca946079c914e1a5fe962c" + +"@types/node@^8.0.32": + version "8.0.34" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.34.tgz#55f801fa2ddb2a40dd6dfc15ecfe1dde9c129fe9" + "@types/serve-static@*": version "1.7.32" resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.7.32.tgz#0f6732e4dab0813771dd8fc8fe14940f34728b4c" @@ -46,36 +181,271 @@ dependencies: "@types/node" "*" -accepts@~1.3.3: +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +accepts@~1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" dependencies: mime-types "~2.1.16" negotiator "0.6.1" +ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ajv@^5.1.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.3.tgz#c06f598778c44c6b161abafe3466b81ad1814ed2" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + json-schema-traverse "^0.3.0" + json-stable-stringify "^1.0.1" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arguejs@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/arguejs/-/arguejs-0.2.3.tgz#b6f939f5fe0e3cd1f3f93e2aa9262424bf312af7" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1, array-uniq@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +ascli@~1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ascli/-/ascli-1.0.1.tgz#bcfa5974a62f18e81cabaeb49732ab4a88f906bc" + dependencies: + colour "~0.7.1" + optjs "~3.2.2" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +async@^2.0.1, async@^2.1.2, async@^2.3.0, async@^2.4.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" + dependencies: + lodash "^4.14.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.2.1, aws4@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + base64url@2.0.0, base64url@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/base64url/-/base64url-2.0.0.tgz#eac16e03ea1438eff9423d69baa36262ed1f70bb" +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +body-parser@1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.1" + http-errors "~1.6.2" + iconv-lite "0.4.19" + on-finished "~2.3.0" + qs "6.5.1" + raw-body "2.3.2" + type-is "~1.6.15" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + +brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + buffer-equal-constant-time@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" +buffer-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + +bun@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/bun/-/bun-0.0.12.tgz#d54fae69f895557f275423bc14b404030b20a5fc" + dependencies: + readable-stream "~1.0.32" + +bytebuffer@~5: + version "5.0.1" + resolved "https://registry.yarnpkg.com/bytebuffer/-/bytebuffer-5.0.1.tgz#582eea4b1a873b6d020a48d58df85f0bba6cfddd" + dependencies: + long "~3" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + +camelcase@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +capture-stack-trace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + "charenc@>= 0.0.1": version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" +cliui@^3.0.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +colour@~0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/colour/-/colour-0.7.1.tgz#9cb169917ec5d12c0736d3e8685746df1cadf778" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.5.0, concat-stream@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +configstore@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" -content-type@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" cookie-signature@1.0.6: version "1.0.6" @@ -85,16 +455,64 @@ cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +create-error-class@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + "crypt@>= 0.0.1": version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" -debug@2.6.8: - version "2.6.8" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +debug@2.6.9, debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" +decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + depd@1.1.1, depd@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" @@ -103,6 +521,33 @@ destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" +dot-prop@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-2.4.0.tgz#848e28f7f1d50740c6747ab3cb07670462b6f89c" + dependencies: + is-obj "^1.0.0" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + dependencies: + is-obj "^1.0.0" + +duplexify@^3.1.2, duplexify@^3.5.0, duplexify@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.1.tgz#4e1516be68838bc90a49994f0b39a6e5960befcd" + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + ecdsa-sig-formatter@1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz#4bc926274ec3b5abb5016e7e1d60921ac262b2a1" @@ -118,46 +563,76 @@ encodeurl@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" + dependencies: + once "^1.4.0" + +ent@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" -etag@~1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" express@^4.0.33: - version "4.15.4" - resolved "https://registry.yarnpkg.com/express/-/express-4.15.4.tgz#032e2253489cf8fce02666beca3d11ed7a2daed1" + version "4.16.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" dependencies: - accepts "~1.3.3" + accepts "~1.3.4" array-flatten "1.1.1" + body-parser "1.18.2" content-disposition "0.5.2" - content-type "~1.0.2" + content-type "~1.0.4" cookie "0.3.1" cookie-signature "1.0.6" - debug "2.6.8" + debug "2.6.9" depd "~1.1.1" encodeurl "~1.0.1" escape-html "~1.0.3" - etag "~1.8.0" - finalhandler "~1.0.4" - fresh "0.5.0" + etag "~1.8.1" + finalhandler "1.1.0" + fresh "0.5.2" merge-descriptors "1.0.1" methods "~1.1.2" on-finished "~2.3.0" - parseurl "~1.3.1" + parseurl "~1.3.2" path-to-regexp "0.1.7" - proxy-addr "~1.1.5" - qs "6.5.0" + proxy-addr "~2.0.2" + qs "6.5.1" range-parser "~1.2.0" - send "0.15.4" - serve-static "1.12.4" - setprototypeof "1.0.3" + safe-buffer "5.1.1" + send "0.16.1" + serve-static "1.13.1" + setprototypeof "1.1.0" statuses "~1.3.1" type-is "~1.6.15" - utils-merge "1.0.0" - vary "~1.1.1" + utils-merge "1.0.1" + vary "~1.1.2" + +extend@^3.0.0, extend@^3.0.1, extend@~3.0.0, extend@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +extsprintf@1.3.0, extsprintf@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +fast-deep-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" faye-websocket@0.9.3: version "0.9.3" @@ -165,29 +640,36 @@ faye-websocket@0.9.3: dependencies: websocket-driver ">=0.5.1" -finalhandler@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.4.tgz#18574f2e7c4b98b8ae3b230c21f201f31bdb3fb7" +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" dependencies: - debug "2.6.8" + debug "2.6.9" encodeurl "~1.0.1" escape-html "~1.0.3" on-finished "~2.3.0" - parseurl "~1.3.1" + parseurl "~1.3.2" statuses "~1.3.1" unpipe "~1.0.0" -firebase-admin@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/firebase-admin/-/firebase-admin-4.2.1.tgz#91794bfc214ee21decc765d308411166a05c0b20" +firebase-admin@^5.4.2: + version "5.4.2" + resolved "https://registry.yarnpkg.com/firebase-admin/-/firebase-admin-5.4.2.tgz#002f58be2ad8901229e525ec55fa726d12f904eb" dependencies: + "@google-cloud/firestore" "~0.8.2" + "@google-cloud/storage" "^1.2.1" + "@types/google-cloud__storage" "^1.1.1" "@types/jsonwebtoken" "^7.1.33" + "@types/node" "^8.0.32" faye-websocket "0.9.3" + google-auth-library "^0.10.0" jsonwebtoken "7.1.9" + lodash "^4.6.1" + node-forge "0.7.1" -firebase-functions@^0.5.7: - version "0.5.9" - resolved "https://registry.yarnpkg.com/firebase-functions/-/firebase-functions-0.5.9.tgz#74155c3fb42f3bb15a95793311664d14bf610a7a" +firebase-functions@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/firebase-functions/-/firebase-functions-0.7.1.tgz#125b950f95769ce25a44b576b5cdaddc3246b4ca" dependencies: "@types/express" "^4.0.33" "@types/jsonwebtoken" "^7.1.32" @@ -198,19 +680,253 @@ firebase-functions@^0.5.7: lodash "^4.6.1" sha1 "^1.1.1" -forwarded@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +form-data@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gcp-metadata@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-0.3.1.tgz#313814456e7c3d0eeb8f8b084b33579e886f829a" + dependencies: + extend "^3.0.0" + retry-request "^3.0.0" + +gcs-resumable-upload@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/gcs-resumable-upload/-/gcs-resumable-upload-0.8.2.tgz#37df02470430395a789a637e72cabc80677ae964" + dependencies: + buffer-equal "^1.0.0" + configstore "^3.0.0" + google-auto-auth "^0.7.1" + pumpify "^1.3.3" + request "^2.81.0" + stream-events "^1.0.1" + through2 "^2.0.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" -fresh@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" +glob@^7.0.3, glob@^7.0.5: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +google-auth-library@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-0.10.0.tgz#6e15babee85fd1dd14d8d128a295b6838d52136e" + dependencies: + gtoken "^1.2.1" + jws "^3.1.4" + lodash.noop "^3.0.1" + request "^2.74.0" + +google-auto-auth@^0.5.2: + version "0.5.4" + resolved "https://registry.yarnpkg.com/google-auto-auth/-/google-auto-auth-0.5.4.tgz#1d86c7928d633e75a9c1ab034a527efcce4a40b1" + dependencies: + async "^2.1.2" + google-auth-library "^0.10.0" + object-assign "^3.0.0" + request "^2.79.0" + +google-auto-auth@^0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/google-auto-auth/-/google-auto-auth-0.7.2.tgz#bf9352d5c4a0897bf31fd9c491028b765fbea71e" + dependencies: + async "^2.3.0" + gcp-metadata "^0.3.0" + google-auth-library "^0.10.0" + request "^2.79.0" + +google-gax@^0.14.1: + version "0.14.1" + resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-0.14.1.tgz#fe88fb9d5030d26277c63508a79af7b37179e139" + dependencies: + extend "^3.0.0" + globby "^6.1.0" + google-auto-auth "^0.5.2" + google-proto-files "^0.13.1" + grpc "^1.2" + is-stream-ended "^0.1.0" + lodash "^4.17.2" + process-nextick-args "^1.0.7" + protobufjs "^6.8.0" + readable-stream "^2.2.2" + through2 "^2.0.3" + +google-p12-pem@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-0.1.2.tgz#33c46ab021aa734fa0332b3960a9a3ffcb2f3177" + dependencies: + node-forge "^0.7.1" + +google-proto-files@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/google-proto-files/-/google-proto-files-0.13.1.tgz#fcf123637d1811612d6a4cb030fd14516b5aec4b" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +grpc@^1.2, grpc@^1.6.0: + version "1.6.6" + resolved "https://registry.yarnpkg.com/grpc/-/grpc-1.6.6.tgz#2051784f6bd6134681fa2c4b5e75dc82c6c23ffa" + dependencies: + arguejs "^0.2.3" + lodash "^4.17.4" + nan "^2.7.0" + node-pre-gyp "^0.6.38" + protobufjs "^5.0.2" + +gtoken@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-1.2.2.tgz#172776a1a9d96ac09fc22a00f5be83cee6de8820" + dependencies: + google-p12-pem "^0.1.0" + jws "^3.0.0" + mime "^1.2.11" + request "^2.72.0" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hash-stream-validation@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/hash-stream-validation/-/hash-stream-validation-0.2.1.tgz#ecc9b997b218be5bb31298628bb807869b73dcd1" + dependencies: + through2 "^2.0.0" + +hawk@3.1.3, hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" -http-errors@~1.6.2: +hoek@4.x.x: + version "4.2.0" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" + +http-errors@1.6.2, http-errors@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" dependencies: @@ -219,18 +935,95 @@ http-errors@~1.6.2: setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" -inherits@2.0.3: +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.19, iconv-lite@~0.4.13: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" -ipaddr.js@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.4.0.tgz#296aca878a821816e5b85d0a285a99bcff4582f0" +ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +ipaddr.js@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-stream-ended@^0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-stream-ended/-/is-stream-ended-0.1.3.tgz#a0473b267c756635486beedc7e3344e549d152ac" + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is@^3.0.1, is@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is/-/is-3.2.1.tgz#d0ac2ad55eb7b0bec926a5266f6c662aaa83dca5" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" isemail@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/isemail/-/isemail-1.2.0.tgz#be03df8cc3e29de4d2c5df6501263f1fa4595e9a" +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + joi@^6.10.1: version "6.10.1" resolved "https://registry.yarnpkg.com/joi/-/joi-6.10.1.tgz#4d50c318079122000fe5f16af1ff8e1917b77e06" @@ -240,6 +1033,32 @@ joi@^6.10.1: moment "2.x.x" topo "1.x.x" +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + jsonwebtoken@7.1.9: version "7.1.9" resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-7.1.9.tgz#847804e5258bec5a9499a8dc4a5e7a3bae08d58a" @@ -260,6 +1079,15 @@ jsonwebtoken@^7.1.9: ms "^2.0.0" xtend "^4.0.1" +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + jwa@^1.1.4: version "1.1.5" resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.5.tgz#a0552ce0220742cd52e153774a32905c30e756e5" @@ -269,7 +1097,7 @@ jwa@^1.1.4: ecdsa-sig-formatter "1.0.9" safe-buffer "^5.0.1" -jws@^3.1.3, jws@^3.1.4: +jws@^3.0.0, jws@^3.1.3, jws@^3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.4.tgz#f9e8b9338e8a847277d6444b1464f61880e050a2" dependencies: @@ -277,14 +1105,38 @@ jws@^3.1.3, jws@^3.1.4: jwa "^1.1.4" safe-buffer "^5.0.1" +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +lodash.noop@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-3.0.1.tgz#38188f4d650a3a474258439b96ec45b32617133c" + lodash.once@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" -lodash@^4.6.1: +lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.6.1: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" +log-driver@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" + +long@^3.2.0, long@~3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" + +make-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" + dependencies: + pify "^2.3.0" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -293,6 +1145,10 @@ merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" +methmeth@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/methmeth/-/methmeth-1.1.0.tgz#e80a26618e52f5c4222861bb748510bd10e29089" + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -301,15 +1157,39 @@ mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" -mime-types@~2.1.15, mime-types@~2.1.16: +mime-types@^2.0.8, mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" dependencies: mime-db "~1.30.0" -mime@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" +mime@1.4.1, mime@^1.2.11: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + +minimatch@^3.0.0, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +"mkdirp@>=0.5 0", mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +modelo@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/modelo/-/modelo-4.2.0.tgz#3b4b420023a66ca7e32bdba16e710937e14d1b0b" moment@2.x.x: version "2.18.1" @@ -323,74 +1203,365 @@ ms@^0.7.1: version "0.7.3" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff" +nan@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" + negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" +node-fetch@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-forge@0.7.1, node-forge@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.1.tgz#9da611ea08982f4b94206b3beb4cc9665f20c300" + +node-pre-gyp@^0.6.38: + version "0.6.38" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.38.tgz#e92a20f83416415bb4086f6d1fb78b3da73d113d" + dependencies: + hawk "3.1.3" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.1, oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" dependencies: ee-first "1.1.1" -parseurl@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" +once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +optjs@~3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/optjs/-/optjs-3.2.2.tgz#69a6ce89c442a44403141ad2f9b370bd5bb6f4ee" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" -proxy-addr@~1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.5.tgz#71c0ee3b102de3f202f3b64f608d173fcba1a918" +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +process-nextick-args@^1.0.7, process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +protobufjs@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-5.0.2.tgz#59748d7dcf03d2db22c13da9feb024e16ab80c91" + dependencies: + ascli "~1" + bytebuffer "~5" + glob "^7.0.5" + yargs "^3.10.0" + +protobufjs@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.0.tgz#04e85493c4e1653878ec283f18bc78b1e7c5d5a2" + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^3.0.31" + "@types/node" "^7.0.29" + long "^3.2.0" + +proxy-addr@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" dependencies: - forwarded "~0.1.0" - ipaddr.js "1.4.0" + forwarded "~0.1.2" + ipaddr.js "1.5.2" + +pump@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.3.5" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.5.tgz#1b671c619940abcaeac0ad0e3a3c164be760993b" + dependencies: + duplexify "^3.1.2" + inherits "^2.0.1" + pump "^1.0.0" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -qs@6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49" +qs@6.5.1, qs@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" -safe-buffer@^5.0.1: +raw-body@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + dependencies: + bytes "3.0.0" + http-errors "1.6.2" + iconv-lite "0.4.19" + unpipe "1.0.0" + +rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^2.0.0, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readable-stream@~1.0.32: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +request@2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +request@^2.72.0, request@^2.74.0, request@^2.79.0, request@^2.81.0: + version "2.83.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + dependencies: + 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" + +retry-request@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-3.0.0.tgz#8bad2b1dcf04938bb211e2ced862e591b82f1917" + dependencies: + request "^2.81.0" + through2 "^2.0.0" + +rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" -send@0.15.4: - version "0.15.4" - resolved "https://registry.yarnpkg.com/send/-/send-0.15.4.tgz#985faa3e284b0273c793364a35c6737bd93905b9" +semver@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + +send@0.16.1: + version "0.16.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" dependencies: - debug "2.6.8" + debug "2.6.9" depd "~1.1.1" destroy "~1.0.4" encodeurl "~1.0.1" escape-html "~1.0.3" - etag "~1.8.0" - fresh "0.5.0" + etag "~1.8.1" + fresh "0.5.2" http-errors "~1.6.2" - mime "1.3.4" + mime "1.4.1" ms "2.0.0" on-finished "~2.3.0" range-parser "~1.2.0" statuses "~1.3.1" -serve-static@1.12.4: - version "1.12.4" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.4.tgz#9b6aa98eeb7253c4eedc4c1f6fdbca609901a961" +serve-static@1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" dependencies: encodeurl "~1.0.1" escape-html "~1.0.3" - parseurl "~1.3.1" - send "0.15.4" + parseurl "~1.3.2" + send "0.16.1" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" setprototypeof@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + sha1@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848" @@ -398,16 +1569,151 @@ sha1@^1.1.1: charenc ">= 0.0.1" crypt ">= 0.0.1" +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +snakeize@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/snakeize/-/snakeize-0.1.0.tgz#10c088d8b58eb076b3229bb5a04e232ce126422d" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +sntp@2.x.x: + version "2.0.2" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.0.2.tgz#5064110f0af85f7cfdb7d6b67a40028ce52b4b2b" + dependencies: + hoek "4.x.x" + +split-array-stream@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/split-array-stream/-/split-array-stream-1.0.3.tgz#d2b75a8e5e0d824d52fdec8b8225839dc2e35dfa" + dependencies: + async "^2.4.0" + is-stream-ended "^0.1.0" + +sshpk@^1.7.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + "statuses@>= 1.3.1 < 2", statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" +stream-events@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stream-events/-/stream-events-1.0.2.tgz#abf39f66c0890a4eb795bc8d5e859b2615b590b2" + dependencies: + stubs "^3.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +string-format-obj@^1.0.0, string-format-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/string-format-obj/-/string-format-obj-1.1.0.tgz#7635610b1ef397013e8478be98a170e04983d068" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.4, stringstream@~0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +stubs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b" + +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +through2@^2.0.0, through2@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + topo@1.x.x: version "1.1.0" resolved "https://registry.yarnpkg.com/topo/-/topo-1.1.0.tgz#e9d751615d1bb87dc865db182fa1ca0a5ef536d5" dependencies: hoek "2.x.x" +tough-cookie@~2.3.0, tough-cookie@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + dependencies: + punycode "^1.4.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + type-is@~1.6.15: version "1.6.15" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" @@ -415,17 +1721,47 @@ type-is@~1.6.15: media-typer "0.3.0" mime-types "~2.1.15" -unpipe@~1.0.0: +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +unique-string@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + dependencies: + crypto-random-string "^1.0.0" -utils-merge@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" -vary@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + +uuid@^3.0.0, uuid@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" websocket-driver@>=0.5.1: version "0.6.5" @@ -437,6 +1773,55 @@ websocket-extensions@>=0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" -xtend@^4.0.1: +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +window-size@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + +xtend@^4.0.1, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yargs@^3.10.0: + version "3.32.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" + dependencies: + camelcase "^2.0.1" + cliui "^3.0.3" + decamelize "^1.1.1" + os-locale "^1.4.0" + string-width "^1.0.1" + window-size "^0.1.4" + y18n "^3.2.0" diff --git a/gulp/test.js b/gulp/test.js index 261c1af..4465202 100644 --- a/gulp/test.js +++ b/gulp/test.js @@ -1,2 +1,11 @@ import '../core/shell/index.test' -import '../src/modules/devfest-module/pages/devfest-landing-page/devfest-landing-page.test' \ No newline at end of file +import '../src/modules/devfest-module/pages/devfest-authorized-page/devfest-authorized-page.test' +import '../src/modules/devfest-module/pages/devfest-landing-page/devfest-landing-page.test' +import '../src/modules/devfest-module/pages/devfest-not-authorized-page/devfes-not-authorized-page.test' +import '../src/modules/devfest-module/pages/devfest-not-found-page/devfest-not-found-page.test' +import '../src/modules/devfest-module/pages/devfest-session-page/devfest-session-page.test' +import '../src/modules/devfest-module/pages/devfest-sessions-page/devfest-sessions-page.test' +import '../src/modules/devfest-module/pages/devfest-speaker-page/devfest-speaker-page.test' +import '../src/modules/devfest-module/pages/devfest-speakers-page/devfest-speakers-page.test' +import '../src/modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.test' +import '../src/modules/devfest-module/pages/devfest-tickets-page/devfest-tickets-page.test' diff --git a/gulp/utils/create-firebase-config.js b/gulp/utils/create-firebase-config.js index 6cd39ad..b89ce03 100644 --- a/gulp/utils/create-firebase-config.js +++ b/gulp/utils/create-firebase-config.js @@ -1,9 +1,25 @@ -const getConfig = require('./get-config') +const getConfig = require('./get-config'); -module.exports = (env) => { - const {config} = getConfig(env) +module.exports = (dev) => { + const {config} = getConfig(dev); return ` - export default ${JSON.stringify(config.build.firebaseConfig)} - ` -} \ No newline at end of file + let firebase = null; + const configs = ${JSON.stringify(config.build.firebaseConfig)}; + import(/* webpackChunkName: 'firebase' */ 'firebase').then(sdk => { + firebase = sdk; + configs.forEach(config => { + if (config.name) { + firebase.initializeApp(config, name); + } else { + firebase.initializeApp(config); + } + }); + window.firebase = firebase; + window.dispatchEvent(new window.CustomEvent('firebase-initialized', { detail: firebase })); + }) + const firebaseConfig = configs; + export default firebase; + export { firebaseConfig }; + `; +}; diff --git a/gulp/utils/create-firebase-json.js b/gulp/utils/create-firebase-json.js index 0d126a8..6899cf2 100644 --- a/gulp/utils/create-firebase-json.js +++ b/gulp/utils/create-firebase-json.js @@ -23,6 +23,20 @@ module.exports = (env, dest) => { source: i.split('/').map(path => (path.indexOf(':') === 0 ? '**' : path)).join('/'), destination: '/index.html' }) + var arr = i.split('/') + + while(arr.length > 0) { + if (arr[arr.length - 1].indexOf(':') === 0 && arr[arr.length -1].indexOf('?') === arr[arr.length - 1].length - 1) { + arr.pop() + firebase.hosting.rewrites.push({ + source: arr.map(path => (path.indexOf(':') === 0 ? '**' : path)).join('/'), + destination: '/index.html' + }) + } else { + break; + } + } + } firebase.hosting.public = dest diff --git a/package.json b/package.json index 0adff4e..5cea531 100644 --- a/package.json +++ b/package.json @@ -21,10 +21,14 @@ "build-production": "cd gulp && ./node_modules/.bin/gulp --prod" }, "dependencies": { + "firebase": "^4.5.0", + "global": "^4.3.2", "indexeddbshim": "^3.0.4", "intersection-observer": "^0.4.2", "marked": "^0.3.6", + "md-gum-polyfill": "^1.0.0", "path-to-regexp": "^1.7.0", + "qrcode-reader": "^1.0.3", "redux": "^3.7.2" }, "devDependencies": { @@ -33,6 +37,7 @@ "babel-plugin-transform-runtime": "^6.23.0", "babel-preset-env": "^1.6.0", "eslint-plugin-html": "^3.2.0", + "semistandard": "^11.0.0", "workbox-build": "^2.0.0", "workbox-routing": "^1.1.0", "workbox-sw": "^1.1.0" @@ -43,6 +48,18 @@ "minimist": "1.2.0", "isarray": "1.0.0", "assert-plus": "1.0.0", - "domelementtype": "1.3.0" + "domelementtype": "1.3.0", + "rimraf": "2.6.2", + "semver": "5.4.1", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "is-fullwidth-code-point": "2.0.0", + "ansi-regex": "3.0.0", + "es-abstract": "1.9.0", + "debug": "2.6.9", + "doctrine": "2.0.0", + "acorn": "5.1.2", + "find-up": "2.1.0", + "path-exists": "3.0.0" } } diff --git a/src/.temp/temp.json b/src/.temp/temp.json index fe75d47..386180e 100644 --- a/src/.temp/temp.json +++ b/src/.temp/temp.json @@ -19,7 +19,11 @@ "firebaseConfig": [ { "apiKey": "AIzaSyB3VQN0MNOxcunaUKXZr54u0t6ruv2YbkE", - "name": "DEFAULT" + "authDomain": "devfestph.firebaseapp.com", + "databaseURL": "https://devfestph.firebaseio.com", + "projectId": "devfestph", + "storageBucket": "devfestph.appspot.com", + "messagingSenderId": "36335134103" } ] }, @@ -35,6 +39,14 @@ "devfest-session-page": "modules/devfest-module/pages/devfest-session-page/devfest-session-page.js", "devfest-tickets-page": "modules/devfest-module/pages/devfest-tickets-page/devfest-tickets-page.js", "devfest-sponsors-page": "modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.js", + "devfest-login-page": "modules/devfest-module/pages/devfest-login-page/devfest-login-page.js", + "devfest-tnc-page": "modules/devfest-module/pages/devfest-tnc-page/devfest-tnc-page.js", + "devfest-profile-page": "modules/devfest-module/pages/devfest-profile-page/devfest-profile-page.js", + "devfest-codelabs-page": "modules/devfest-module/pages/devfest-codelabs-page/devfest-codelabs-page.js", + "devfest-connect-page": "modules/devfest-module/pages/devfest-connect-page/devfest-connect-page.js", + "devfest-scan-page": "modules/devfest-module/pages/devfest-scan-page/devfest-scan-page.js", + "devfest-scanned-list-page": "modules/devfest-module/pages/devfest-scanned-list-page/devfest-scanned-list-page.js", + "devfest-not-sponsor-page": "modules/devfest-module/pages/devfest-not-sponsor-page/devfest-not-sponsor-page.js", "devfest-not-found-page": "modules/devfest-module/pages/devfest-not-found-page/devfest-not-found-page.js", "devfest-not-authorized-page": "modules/devfest-module/pages/devfest-not-authorized-page/devfest-not-authorized-page.js", "devfest-authorized-page": "modules/devfest-module/pages/devfest-authorized-page/devfest-authorized-page.js", @@ -50,6 +62,32 @@ "/sessions/:id": "devfest-session-page", "/tickets": "devfest-tickets-page", "/sponsors": "devfest-sponsors-page", + "/tnc": "devfest-tnc-page", + "/login": "devfest-login-page", + "/profile": { + "name": "devfest-profile-page", + "auth": "isLoggedIn" + }, + "/codelabs/:type?/:id?/:page?": { + "name": "devfest-codelabs-page", + "auth": "isLoggedIn" + }, + "/connect-ticket": { + "name": "devfest-connect-page", + "auth": "isLoggedIn" + }, + "/scan": { + "name": "devfest-scan-page", + "auth": "isSponsor" + }, + "/scanned-list": { + "name": "devfest-scanned-list-page", + "auth": "isSponsor" + }, + "/are-you-a-sponsor": { + "name": "devfest-not-sponsor-page", + "auth": "isLoggedIn" + }, "/auth-check": { "name": "devfest-authorized-page", "auth": "exampleAuthentication" @@ -85,8 +123,28 @@ "hosting": { "rewrites": [ { - "source": "/api/**", - "function": "app" + "source": "/connect", + "function": "connect" + }, + { + "source": "/validate-sponsor", + "function": "validate" + }, + { + "source": "/scan-id", + "function": "scanId" + }, + { + "source": "/disconnect", + "function": "disconnect" + }, + { + "source": "/scanned-list-for-sponsor", + "function": "scannedList" + }, + { + "source": "/submit-repo", + "function": "submitRepo" } ], "headers": [ diff --git a/src/authentication/index.js b/src/authentication/index.js index 401cad9..19b3d19 100644 --- a/src/authentication/index.js +++ b/src/authentication/index.js @@ -1,5 +1,24 @@ +import { store } from '../../core/modules/state-manager'; + export default { exampleAuthentication: () => { - return false + return false; + }, + + isLoggedIn: () => { + if (window.firebase) { + return window.firebase.auth() && window.firebase.auth().currentUser && window.firebase.auth().currentUser.uid; + } + }, + + // isSponsor: isSponsor + + isSponsor: () => { + if (window.firebase) { + if (window.firebase.auth().currentUser.uid) { + var user = store.getState().user; + return user && user.profile && user.profile.sponsorId; + } + } } -} +}; diff --git a/src/config/dev.json b/src/config/dev.json index fe75d47..386180e 100644 --- a/src/config/dev.json +++ b/src/config/dev.json @@ -19,7 +19,11 @@ "firebaseConfig": [ { "apiKey": "AIzaSyB3VQN0MNOxcunaUKXZr54u0t6ruv2YbkE", - "name": "DEFAULT" + "authDomain": "devfestph.firebaseapp.com", + "databaseURL": "https://devfestph.firebaseio.com", + "projectId": "devfestph", + "storageBucket": "devfestph.appspot.com", + "messagingSenderId": "36335134103" } ] }, @@ -35,6 +39,14 @@ "devfest-session-page": "modules/devfest-module/pages/devfest-session-page/devfest-session-page.js", "devfest-tickets-page": "modules/devfest-module/pages/devfest-tickets-page/devfest-tickets-page.js", "devfest-sponsors-page": "modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.js", + "devfest-login-page": "modules/devfest-module/pages/devfest-login-page/devfest-login-page.js", + "devfest-tnc-page": "modules/devfest-module/pages/devfest-tnc-page/devfest-tnc-page.js", + "devfest-profile-page": "modules/devfest-module/pages/devfest-profile-page/devfest-profile-page.js", + "devfest-codelabs-page": "modules/devfest-module/pages/devfest-codelabs-page/devfest-codelabs-page.js", + "devfest-connect-page": "modules/devfest-module/pages/devfest-connect-page/devfest-connect-page.js", + "devfest-scan-page": "modules/devfest-module/pages/devfest-scan-page/devfest-scan-page.js", + "devfest-scanned-list-page": "modules/devfest-module/pages/devfest-scanned-list-page/devfest-scanned-list-page.js", + "devfest-not-sponsor-page": "modules/devfest-module/pages/devfest-not-sponsor-page/devfest-not-sponsor-page.js", "devfest-not-found-page": "modules/devfest-module/pages/devfest-not-found-page/devfest-not-found-page.js", "devfest-not-authorized-page": "modules/devfest-module/pages/devfest-not-authorized-page/devfest-not-authorized-page.js", "devfest-authorized-page": "modules/devfest-module/pages/devfest-authorized-page/devfest-authorized-page.js", @@ -50,6 +62,32 @@ "/sessions/:id": "devfest-session-page", "/tickets": "devfest-tickets-page", "/sponsors": "devfest-sponsors-page", + "/tnc": "devfest-tnc-page", + "/login": "devfest-login-page", + "/profile": { + "name": "devfest-profile-page", + "auth": "isLoggedIn" + }, + "/codelabs/:type?/:id?/:page?": { + "name": "devfest-codelabs-page", + "auth": "isLoggedIn" + }, + "/connect-ticket": { + "name": "devfest-connect-page", + "auth": "isLoggedIn" + }, + "/scan": { + "name": "devfest-scan-page", + "auth": "isSponsor" + }, + "/scanned-list": { + "name": "devfest-scanned-list-page", + "auth": "isSponsor" + }, + "/are-you-a-sponsor": { + "name": "devfest-not-sponsor-page", + "auth": "isLoggedIn" + }, "/auth-check": { "name": "devfest-authorized-page", "auth": "exampleAuthentication" @@ -85,8 +123,28 @@ "hosting": { "rewrites": [ { - "source": "/api/**", - "function": "app" + "source": "/connect", + "function": "connect" + }, + { + "source": "/validate-sponsor", + "function": "validate" + }, + { + "source": "/scan-id", + "function": "scanId" + }, + { + "source": "/disconnect", + "function": "disconnect" + }, + { + "source": "/scanned-list-for-sponsor", + "function": "scannedList" + }, + { + "source": "/submit-repo", + "function": "submitRepo" } ], "headers": [ diff --git a/src/config/prod.json b/src/config/prod.json index 67502e2..ee34ca4 100644 --- a/src/config/prod.json +++ b/src/config/prod.json @@ -19,7 +19,11 @@ "firebaseConfig": [ { "apiKey": "AIzaSyB3VQN0MNOxcunaUKXZr54u0t6ruv2YbkE", - "name": "DEFAULT" + "authDomain": "devfestph.firebaseapp.com", + "databaseURL": "https://devfestph.firebaseio.com", + "projectId": "devfestph", + "storageBucket": "devfestph.appspot.com", + "messagingSenderId": "36335134103" } ] }, @@ -35,6 +39,14 @@ "devfest-session-page": "modules/devfest-module/pages/devfest-session-page/devfest-session-page.js", "devfest-tickets-page": "modules/devfest-module/pages/devfest-tickets-page/devfest-tickets-page.js", "devfest-sponsors-page": "modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.js", + "devfest-login-page": "modules/devfest-module/pages/devfest-login-page/devfest-login-page.js", + "devfest-tnc-page": "modules/devfest-module/pages/devfest-tnc-page/devfest-tnc-page.js", + "devfest-profile-page": "modules/devfest-module/pages/devfest-profile-page/devfest-profile-page.js", + "devfest-codelabs-page": "modules/devfest-module/pages/devfest-codelabs-page/devfest-codelabs-page.js", + "devfest-connect-page": "modules/devfest-module/pages/devfest-connect-page/devfest-connect-page.js", + "devfest-scan-page": "modules/devfest-module/pages/devfest-scan-page/devfest-scan-page.js", + "devfest-scanned-list-page": "modules/devfest-module/pages/devfest-scanned-list-page/devfest-scanned-list-page.js", + "devfest-not-sponsor-page": "modules/devfest-module/pages/devfest-not-sponsor-page/devfest-not-sponsor-page.js", "devfest-not-found-page": "modules/devfest-module/pages/devfest-not-found-page/devfest-not-found-page.js", "devfest-not-authorized-page": "modules/devfest-module/pages/devfest-not-authorized-page/devfest-not-authorized-page.js", "devfest-authorized-page": "modules/devfest-module/pages/devfest-authorized-page/devfest-authorized-page.js", @@ -50,6 +62,32 @@ "/sessions/:id": "devfest-session-page", "/tickets": "devfest-tickets-page", "/sponsors": "devfest-sponsors-page", + "/tnc": "devfest-tnc-page", + "/login": "devfest-login-page", + "/profile": { + "name": "devfest-profile-page", + "auth": "isLoggedIn" + }, + "/codelabs/:type?/:id?/:page?": { + "name": "devfest-codelabs-page", + "auth": "isLoggedIn" + }, + "/connect-ticket": { + "name": "devfest-connect-page", + "auth": "isLoggedIn" + }, + "/scan": { + "name": "devfest-scan-page", + "auth": "isSponsor" + }, + "/scanned-list": { + "name": "devfest-scanned-list-page", + "auth": "isSponsor" + }, + "/are-you-a-sponsor": { + "name": "devfest-not-sponsor-page", + "auth": "isLoggedIn" + }, "/auth-check": { "name": "devfest-authorized-page", "auth": "exampleAuthentication" @@ -85,8 +123,28 @@ "hosting": { "rewrites": [ { - "source": "/api/**", - "function": "app" + "source": "/connect", + "function": "connect" + }, + { + "source": "/validate-sponsor", + "function": "validate" + }, + { + "source": "/scan-id", + "function": "scanId" + }, + { + "source": "/disconnect", + "function": "disconnect" + }, + { + "source": "/scanned-list-for-sponsor", + "function": "scannedList" + }, + { + "source": "/submit-repo", + "function": "submitRepo" } ], "headers": [ diff --git a/src/firebase.js b/src/firebase.js index 821ca14..56c7d0a 100644 --- a/src/firebase.js +++ b/src/firebase.js @@ -1,3 +1,19 @@ - export default [{"apiKey":"AIzaSyB3VQN0MNOxcunaUKXZr54u0t6ruv2YbkE","name":"DEFAULT"}] + let firebase = null; + const configs = [{"apiKey":"AIzaSyB3VQN0MNOxcunaUKXZr54u0t6ruv2YbkE","authDomain":"devfestph.firebaseapp.com","databaseURL":"https://devfestph.firebaseio.com","projectId":"devfestph","storageBucket":"devfestph.appspot.com","messagingSenderId":"36335134103"}]; + import(/* webpackChunkName: 'firebase' */ 'firebase').then(sdk => { + firebase = sdk; + configs.forEach(config => { + if (config.name) { + firebase.initializeApp(config, name); + } else { + firebase.initializeApp(config); + } + }); + window.firebase = firebase; + window.dispatchEvent(new window.CustomEvent('firebase-initialized', { detail: firebase })); + }) + const firebaseConfig = configs; + export default firebase; + export { firebaseConfig }; \ No newline at end of file diff --git a/src/images/codelabs/android.svg b/src/images/codelabs/android.svg new file mode 100644 index 0000000..f810b33 --- /dev/null +++ b/src/images/codelabs/android.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/images/codelabs/assistant.png b/src/images/codelabs/assistant.png new file mode 100644 index 0000000..e978afc Binary files /dev/null and b/src/images/codelabs/assistant.png differ diff --git a/src/images/codelabs/cloud.png b/src/images/codelabs/cloud.png new file mode 100644 index 0000000..394bbf1 Binary files /dev/null and b/src/images/codelabs/cloud.png differ diff --git a/src/images/codelabs/firebase.png b/src/images/codelabs/firebase.png new file mode 100644 index 0000000..140d5a5 Binary files /dev/null and b/src/images/codelabs/firebase.png differ diff --git a/src/images/codelabs/tensorflow.png b/src/images/codelabs/tensorflow.png new file mode 100644 index 0000000..c7e66d8 Binary files /dev/null and b/src/images/codelabs/tensorflow.png differ diff --git a/src/images/codelabs/vr.svg b/src/images/codelabs/vr.svg new file mode 100644 index 0000000..12e373f --- /dev/null +++ b/src/images/codelabs/vr.svg @@ -0,0 +1 @@ +cardboard \ No newline at end of file diff --git a/src/images/codelabs/web.svg b/src/images/codelabs/web.svg new file mode 100644 index 0000000..8c2dbc7 --- /dev/null +++ b/src/images/codelabs/web.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/content-loader/content-loader-mixin.js b/src/modules/content-loader/content-loader-mixin.js index bc00365..92aed68 100644 --- a/src/modules/content-loader/content-loader-mixin.js +++ b/src/modules/content-loader/content-loader-mixin.js @@ -6,8 +6,9 @@ export default (superClass) => { super() this.__observeProps = {} } - _fetchJson (content, prop) { - fetch(`${app.contentRepo + app.branch}/${content}`) + _fetchJson (content, prop, own) { + var href = own ? `/${content}` : `${app.contentRepo + app.branch}/${content}` + fetch(href) .then(res => { return res.json() }) diff --git a/src/modules/devfest-module/components/codelab-block/codelab-block.html b/src/modules/devfest-module/components/codelab-block/codelab-block.html new file mode 100644 index 0000000..23d808d --- /dev/null +++ b/src/modules/devfest-module/components/codelab-block/codelab-block.html @@ -0,0 +1,62 @@ + + + diff --git a/src/modules/devfest-module/components/codelab-block/codelab-block.js b/src/modules/devfest-module/components/codelab-block/codelab-block.js new file mode 100644 index 0000000..3a310f7 --- /dev/null +++ b/src/modules/devfest-module/components/codelab-block/codelab-block.js @@ -0,0 +1,129 @@ +import 'polymer/polymer-element.html'; +import 'shadycss/apply-shim.html'; +import 'marked-element/marked-element.html'; +import 'iron-flex-layout/iron-flex-layout.html'; +import 'paper-input/paper-input.html'; +import 'paper-fab/paper-fab.html'; +import 'paper-ripple/paper-ripple.html'; +import '../../fonts/devfest-fonts.html'; +import '../../icons/devfest-icons.html'; +import './codelab-block.html'; +import User from '../../models/user-model'; +import marked from 'marked'; +window.marked = window.marked || marked; + +const {Polymer} = window; + +class CodelabBlock extends User(Polymer.Element) { + static get is () { return 'codelab-block'; } + + static get properties () { + return { + page: { + type: String, + observer: '_pageChanged' + }, + pages: { + type: Array + }, + pageId: { + type: String + }, + codelabId: { + type: String + }, + repo: { + type: String + } + }; + } + + _pageChanged (page) { + Polymer.RenderStatus.afterNextRender(this, () => { + const markdown = this.shadowRoot.querySelectorAll('[slot=markdown-html]'); + if (markdown) { + markdown.forEach((item) => { + item.querySelectorAll('*').forEach((node) => { + node.classList.add(this.nodeName.toLowerCase()); + }); + }); + } + }); + } + + submit () { + var repo = this.repo; + + if (repo) { + const headers = new Headers(); + headers.append('Content-Type', 'application/json'); + var user = this.user; + if (user) { + user.getIdToken().then(token => { + fetch('/submit-repo', { + method: 'POST', + headers, + body: JSON.stringify({ + repo, + codelabId: this.codelabId, + token + }) + }).then(res => { + return res.json(); + }).then(json => { + if (json.success) { + document.querySelector('app-shell').showMessage('Done! Calculating', () => { + document.querySelector('app-shell').closeToast(); + }, 'Close', null, 10000); + } else { + if (Raven) { + Raven.captureException(json); + } + document.querySelector('app-shell').showMessage('Error in submitting repository: ' + json.message, () => { + document.querySelector('app-shell').closeToast(); + }, 'Close', null, 10000); + // document.querySelector('app-shell').showMessage('Error in scanning: ' + json.message, function () { document.querySelector('app-shell').closeToast(); }, 'Close', null, 10000); + } + }); + }); + } + } else { + document.querySelector('app-shell').showMessage('Please put a proper repository.', () => { + document.querySelector('app-shell').closeToast(); + }, 'Close', null, 10000); + } + } + + isSubmit (page) { + return page === 'submit'; + } + + previous () { + var page = this.pageId || 'page-01'; + var index = this.pages.findIndex(item => item.$key === page); + + if (index > 0) { + var newPage = this.pages[index - 1]; + window.history.pushState({}, '', `/codelabs/exer/${this.codelabId}/${newPage}`); + window.dispatchEvent(new CustomEvent('location-changed')); + } + } + + next () { + var page = this.pageId || 'page-01'; + var index = this.pages.findIndex(item => item.$key === page); + + if (index < this.pages.length - 1) { + var newPage = this.pages[index + 1]; + window.history.pushState({}, '', `/codelabs/exer/${this.codelabId}/${newPage}`); + window.dispatchEvent(new CustomEvent('location-changed')); + } else { + window.history.pushState({}, '', `/codelabs/exer/${this.codelabId}/submit`); + window.dispatchEvent(new CustomEvent('location-changed')); + } + } +} + +window.customElements.define(CodelabBlock.is, CodelabBlock); + +export default CodelabBlock; diff --git a/src/modules/devfest-module/components/codelab-block/codelab-block.scss b/src/modules/devfest-module/components/codelab-block/codelab-block.scss new file mode 100644 index 0000000..a5de6c3 --- /dev/null +++ b/src/modules/devfest-module/components/codelab-block/codelab-block.scss @@ -0,0 +1,147 @@ +@import '../../styles/components/typography.scss'; + +.block { + @apply --layout-horizontal; + + @media screen and (max-width: 500px) { + display: block; + } +} + +.next { + position: absolute; + bottom: 30px; + right: 30px; + background: #2e9be6; +} + +.previous { + position: absolute; + bottom: 30px; + left: 30px; + background: #2e9be6; +} + +img { + max-width: 100%; +} + +.form-repo { + max-width: 500px; +} + +blockquote { + border-color: #6a6; + background: #ded; + color: #464; + padding: 0.5em 1em; + margin: 2em 0; + border-left: 4px solid; +} + +p code { + color: white; + background-color: #28323f; + padding: 5px; + -webkit-text-size-adjust: none; + line-height: 1.4; +} + +pre { + color: white; + background-color: #28323f; + padding: 14px; + -webkit-text-size-adjust: none; + line-height: 1.4; + max-width: 800px; + display: block; + overflow-x: auto; +} + +a code { + display: inline; + background-color: #0F9D58; + color: #fff; +} + +.sidebar { + width: 300px; + padding: 20px; + box-shadow: 0px 3px 6px -3px #BDBDBD; + border-right: 1px solid #BDBDBD; + + @media screen and (max-width: 500px) { + border-right: 0px; + width: auto; + } +} + +.web-header { + background: #4285f4; + color: white; +} + +.cloud-header { + background: #4285f4; + color: white; +} + +.assistant-header { + background: #4285f4; + color: white; +} + +.firebase-header { + background: #0288D1; + color: white; +} + +.android-header { + background: #a0bd3a; +} + +.tensorflow-header { + background: #ef6c00; + color: white; +} + +.virtual-header { + background: #FF8A65; + color: white; +} + +.header { + padding: 10px 20px; +} + +.title { + color: inherit; +} + +.icon { + text-decoration: none; + color: inherit; + margin-right: 20px; + @media screen and (max-width: 500px) { + display: none; + } +} + +.page-item { + display: block; + padding: 20px; + text-decoration: none; + color: inherit; + position: relative; +} + +.main { + @apply --layout-flex; + position: relative; + padding-bottom: 90px; +} + +.body { + margin: 0 20px; + +} \ No newline at end of file diff --git a/src/modules/devfest-module/components/codelab-item/codelab-item.html b/src/modules/devfest-module/components/codelab-item/codelab-item.html new file mode 100644 index 0000000..1eab5c1 --- /dev/null +++ b/src/modules/devfest-module/components/codelab-item/codelab-item.html @@ -0,0 +1,27 @@ + + + diff --git a/src/modules/devfest-module/components/codelab-item/codelab-item.js b/src/modules/devfest-module/components/codelab-item/codelab-item.js new file mode 100644 index 0000000..00bec84 --- /dev/null +++ b/src/modules/devfest-module/components/codelab-item/codelab-item.js @@ -0,0 +1,72 @@ +import 'polymer/polymer-element.html'; +import 'iron-flex-layout/iron-flex-layout.html'; +import 'shadycss/apply-shim.html'; +import '../../fonts/devfest-fonts.html'; +import '../../icons/devfest-icons.html'; +import '../../components/devfest-button-only/devfest-button-only.js'; +import './codelab-item.html'; +import marked from 'marked'; +window.marked = window.marked || marked; + +const {Polymer} = window; + +class CodelabItem extends Polymer.Element { + static get is () { return 'codelab-item'; } + + static get properties () { + return { + codelabId: { + type: String + }, + codelabTypes: { + type: Array, + value: [] + }, + title: String, + image: String + }; + } + + static get observers () { + return [ + '_getCodelab(codelabId, codelabTypes, codelabTypes.splices)' + ]; + } + + disconnectedCallback () { + super.disconnectedCallback(); + if (this._codelabTitle) { + this._codelabTitle.off(); + } + + if (this._codelabType) { + this._codelabType.off(); + } + } + + _getCodelab (codelabId, codelabTypes) { + if (this._codelabTitle) { + this._codelabTitle.off(); + } + + if (this._codelabType) { + this._codelabType.off(); + } + + this._codelabTitle = firebase.database().ref(`v1/codelabs/source/${codelabId}/primary/title`); + this._codelabType = firebase.database().ref(`v1/codelabs/source/${codelabId}/meta/type`); + + this._codelabTitle.on('value', snapshot => { + this.title = snapshot.val(); + }); + + this._codelabType.on('value', snapshot => { + var obj = codelabTypes[codelabTypes.findIndex(item => item.$key === snapshot.val())]; + this.type = snapshot.val(); + this.image = obj ? obj.image : ''; + }); + } +} +window.customElements.define(CodelabItem.is, CodelabItem); + +export default CodelabItem; diff --git a/src/modules/devfest-module/components/codelab-item/codelab-item.scss b/src/modules/devfest-module/components/codelab-item/codelab-item.scss new file mode 100644 index 0000000..f4f46d7 --- /dev/null +++ b/src/modules/devfest-module/components/codelab-item/codelab-item.scss @@ -0,0 +1,67 @@ +@import '../../styles/components/typography.scss'; + +:host { + @apply --layout-flex; + margin: 20px; + max-width: 350px; + min-width: 250px; + border: 1px solid #BDBDBD; + box-shadow: 0px 3px 6px -3px #BDBDBD; +} + +.web-header { + background: #4285f4; +} + +.cloud-header { + background: #4285f4; +} + +.assistant-header { + background: #4285f4; +} + +.firebase-header { + background: #0288D1; +} + +.android-header { + background: #a0bd3a; +} + +.tensorflow-header { + background: #ef6c00; +} + +.virtual-header { + background: #FF8A65; +} + +.header { + padding: 20px; +} + +.image { + height: 60px; + width: 60px; + border-radius: 50%; + background: white; +} + +.icon { + height: 60px; + width: 60px; + border-radius: 50% +} + +.body { + padding: 20px; +} + +.footer { + padding: 20px; +} + +.anchor { + +} \ No newline at end of file diff --git a/src/modules/devfest-module/components/codelab-step/codelab-step.html b/src/modules/devfest-module/components/codelab-step/codelab-step.html new file mode 100644 index 0000000..410c368 --- /dev/null +++ b/src/modules/devfest-module/components/codelab-step/codelab-step.html @@ -0,0 +1,9 @@ + + + diff --git a/src/modules/devfest-module/components/codelab-step/codelab-step.js b/src/modules/devfest-module/components/codelab-step/codelab-step.js new file mode 100644 index 0000000..a3c19aa --- /dev/null +++ b/src/modules/devfest-module/components/codelab-step/codelab-step.js @@ -0,0 +1,22 @@ +import 'polymer/polymer-element.html'; +import 'shadycss/apply-shim.html'; +import '../../fonts/devfest-fonts.html'; +import '../../icons/devfest-icons.html'; +import './codelab-step.html'; +import marked from 'marked'; +window.marked = window.marked || marked; + +const {Polymer} = window; + +class CodelabStep extends Polymer.Element { + static get is () { return 'codelab-step'; } + + static get properties () { + return { + }; + } +} + +window.customElements.define(CodelabStep.is, CodelabStep); + +export default CodelabStep; diff --git a/src/modules/devfest-module/components/codelab-step/codelab-step.scss b/src/modules/devfest-module/components/codelab-step/codelab-step.scss new file mode 100644 index 0000000..cf91b23 --- /dev/null +++ b/src/modules/devfest-module/components/codelab-step/codelab-step.scss @@ -0,0 +1,2 @@ +@import '../../styles/components/host.scss'; +@import '../../styles/components/typography.scss'; diff --git a/src/modules/devfest-module/components/devfest-button-only/devfest-button-only.html b/src/modules/devfest-module/components/devfest-button-only/devfest-button-only.html new file mode 100644 index 0000000..c8b7786 --- /dev/null +++ b/src/modules/devfest-module/components/devfest-button-only/devfest-button-only.html @@ -0,0 +1,10 @@ + + + diff --git a/src/modules/devfest-module/components/devfest-button-only/devfest-button-only.js b/src/modules/devfest-module/components/devfest-button-only/devfest-button-only.js new file mode 100644 index 0000000..a9fe5a8 --- /dev/null +++ b/src/modules/devfest-module/components/devfest-button-only/devfest-button-only.js @@ -0,0 +1,56 @@ +import 'polymer/polymer.html'; +import 'paper-ripple/paper-ripple.html'; +import './devfest-button-only.html'; + +class DevfestButton extends Polymer.Element { + static get is () { return 'devfest-button-only'; } + + static get properties () { + return { + href: { + type: String, + value: '#' + }, + isBig: { + type: Boolean, + value: false + }, + target: { + type: String + }, + noColor: { + type: Boolean, + value: false + }, + disable: { + type: Boolean, + value: false + }, + red: { + type: Boolean, + value: false + }, + className: String + }; + } + + _isBig (isBig) { + return isBig ? 'button__big' : ''; + } + + _noColor (noColor) { + return noColor ? 'button__no-color' : ''; + } + + _getHref (href, disable) { + return disable ? '#' : href; + } + + _red (red) { + return red ? 'red' : ''; + } +} + +window.customElements.define(DevfestButton.is, DevfestButton); + +export default DevfestButton; diff --git a/src/modules/devfest-module/components/devfest-button-only/devfest-button-only.scss b/src/modules/devfest-module/components/devfest-button-only/devfest-button-only.scss new file mode 100644 index 0000000..f3f91e2 --- /dev/null +++ b/src/modules/devfest-module/components/devfest-button-only/devfest-button-only.scss @@ -0,0 +1,54 @@ +.button { + font-family: 'Roboto', 'Arial', sans-serif; + background: #2e9be6; + color: white; + border: 3px solid #2e9be6; + border-radius: 2px; + padding: 15px; + font-size: 16px; + width: 100%; + display: block; + font-weight: bold; + text-decoration: none; + position: relative; + cursor: pointer; +} + +.google { + background: #DD4B39; + color: white; + border-color: #DD4B39; +} + +.facebook { + background: #3B5998; + color: white; + border-color: #3B5998; +} + +.github { + background: #444444; + color: white; + border-color: #444444; +} + +.button__big { + padding: 24px; + font-size: 1.5em; +} + +.button__no-color { + background: none; + color: #666; + border: none; +} + +.button__no-color:hover { + color: #4688f4; +} + +.red { + background: #e63125; + border: 3px solid #e63125; + color: white; +} \ No newline at end of file diff --git a/src/modules/devfest-module/components/devfest-button/devfest-button.html b/src/modules/devfest-module/components/devfest-button/devfest-button.html index 4ddd644..0c4e986 100644 --- a/src/modules/devfest-module/components/devfest-button/devfest-button.html +++ b/src/modules/devfest-module/components/devfest-button/devfest-button.html @@ -7,10 +7,4 @@ - - diff --git a/src/modules/devfest-module/components/devfest-drawer/devfest-drawer.html b/src/modules/devfest-module/components/devfest-drawer/devfest-drawer.html index b806b11..5e298a5 100644 --- a/src/modules/devfest-module/components/devfest-drawer/devfest-drawer.html +++ b/src/modules/devfest-module/components/devfest-drawer/devfest-drawer.html @@ -12,6 +12,16 @@ + + + + diff --git a/src/modules/devfest-module/components/devfest-drawer/devfest-drawer.js b/src/modules/devfest-module/components/devfest-drawer/devfest-drawer.js index 948bb15..d871681 100644 --- a/src/modules/devfest-module/components/devfest-drawer/devfest-drawer.js +++ b/src/modules/devfest-module/components/devfest-drawer/devfest-drawer.js @@ -1,51 +1,54 @@ -import 'polymer/polymer.html' -import 'polymer/lib/mixins/gesture-event-listeners.html' -import 'app-layout/app-header/app-header.html' -import 'app-layout/app-toolbar/app-toolbar.html' -import 'app-layout/app-drawer/app-drawer.html' -import '../devfest-button/devfest-button.js' -import '../gdg-logo/gdg-logo.js' -import './devfest-drawer.html' -import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js' - -class DevfestDrawer extends contentLoaderMixin(Polymer.GestureEventListeners(Polymer.Element)) { - static get is () { return 'devfest-drawer' } +import 'polymer/polymer.html'; +import 'polymer/lib/mixins/gesture-event-listeners.html'; +import 'app-layout/app-header/app-header.html'; +import 'app-layout/app-toolbar/app-toolbar.html'; +import 'app-layout/app-drawer/app-drawer.html'; +import '../devfest-button/devfest-button.js'; +import '../gdg-logo/gdg-logo.js'; +import './devfest-drawer.html'; +import User from '../../models/user-model'; +import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js'; + +const {Polymer} = window; + +class DevfestDrawer extends User(contentLoaderMixin(Polymer.GestureEventListeners(Polymer.Element))) { + static get is () { return 'devfest-drawer'; } static get properties () { return { menu: { type: Array } - } + }; } constructor () { - super() - this._boundOpenDrawer = this.openDrawer.bind(this) + super(); + this._boundOpenDrawer = this.openDrawer.bind(this); } connectedCallback () { - super.connectedCallback() - this.reload() - window.addEventListener('open-drawer', this._boundOpenDrawer) + super.connectedCallback(); + this.reload(); + window.addEventListener('open-drawer', this._boundOpenDrawer); } disconnectedCallback () { - super.disconnectedCallback() - window.removeEventListener('open-drawer', this._boundOpenDrawer) + super.disconnectedCallback(); + window.removeEventListener('open-drawer', this._boundOpenDrawer); } reload (menu) { - this._fetchJson(menu || 'menu/default.json', 'menu') + this._fetchJson(menu || 'menu/default.json', 'menu'); } openDrawer () { - this.shadowRoot.querySelector('app-drawer').open() + this.shadowRoot.querySelector('app-drawer').open(); } closeDrawer () { - this.shadowRoot.querySelector('app-drawer').close() + this.shadowRoot.querySelector('app-drawer').close(); } } -window.customElements.define(DevfestDrawer.is, DevfestDrawer) \ No newline at end of file +window.customElements.define(DevfestDrawer.is, DevfestDrawer); diff --git a/src/modules/devfest-module/components/devfest-header/devfest-header.html b/src/modules/devfest-module/components/devfest-header/devfest-header.html index 8ded3f3..6f7fbdf 100644 --- a/src/modules/devfest-module/components/devfest-header/devfest-header.html +++ b/src/modules/devfest-module/components/devfest-header/devfest-header.html @@ -12,6 +12,16 @@ + + + + diff --git a/src/modules/devfest-module/components/devfest-header/devfest-header.js b/src/modules/devfest-module/components/devfest-header/devfest-header.js index eb5e0f4..5bac9e3 100644 --- a/src/modules/devfest-module/components/devfest-header/devfest-header.js +++ b/src/modules/devfest-module/components/devfest-header/devfest-header.js @@ -1,81 +1,83 @@ -import 'polymer/polymer.html' -import 'polymer/lib/mixins/gesture-event-listeners.html' -import 'app-layout/app-header/app-header.html' -import 'app-layout/app-toolbar/app-toolbar.html' -import 'iron-flex-layout/iron-flex-layout.html' -import 'shadycss/apply-shim.html' -import '../devfest-button/devfest-button.js' -import '../devfest-icon-button/devfest-icon-button.js' -import '../gdg-logo/gdg-logo.js' -import '../../fonts/devfest-fonts.html' -import './devfest-header.html' -import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js' +import 'polymer/polymer.html'; +import 'polymer/lib/mixins/gesture-event-listeners.html'; +import 'app-layout/app-header/app-header.html'; +import 'app-layout/app-toolbar/app-toolbar.html'; +import 'iron-flex-layout/iron-flex-layout.html'; +import 'shadycss/apply-shim.html'; +import '../devfest-button/devfest-button.js'; +import '../devfest-icon-button/devfest-icon-button.js'; +import '../gdg-logo/gdg-logo.js'; +import '../../fonts/devfest-fonts.html'; +import './devfest-header.html'; +import User from '../../models/user-model'; +import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js'; -class DevfestHeader extends contentLoaderMixin(Polymer.GestureEventListeners(Polymer.Element)) { - static get is () { return 'devfest-header' } +const {Polymer, IntersectionObserver, CustomEvent} = window; + +class DevfestHeader extends User(contentLoaderMixin(Polymer.GestureEventListeners(Polymer.Element))) { + static get is () { return 'devfest-header'; } static get properties () { return { menu: { type: Array } - } + }; } connectedCallback () { - super.connectedCallback() - this.reload() - this._observedObject = null + super.connectedCallback(); + this.reload(); + this._observedObject = null; if (window.IntersectionObserver) { this._observer = new IntersectionObserver(entries => { entries.forEach(entry => { if (entry.target === this._observedObject) { if (!entry.isIntersecting) { - this.shadowRoot.querySelector('gdg-logo').style.opacity = 1 + this.shadowRoot.querySelector('gdg-logo').style.opacity = 1; } else { - this.shadowRoot.querySelector('gdg-logo').style.opacity = 0 + this.shadowRoot.querySelector('gdg-logo').style.opacity = 0; } } - }) + }); }, { threshold: [0, 0.25, 0.5, 0.75, 1.0] - }) + }); } } reload (menu) { - this._fetchJson(menu || 'menu/default.json', 'menu') + this._fetchJson(menu || 'menu/default.json', 'menu'); Polymer.RenderStatus.afterNextRender(this, () => { if (this._observer) { - this._observer.disconnect() + this._observer.disconnect(); } - const page = document.querySelector('.page--on-view') + const page = document.querySelector('.page--on-view'); if (page && page.nodeName.toLowerCase() === 'devfest-landing-page' && page.shadowRoot) { - - const children = page.shadowRoot.children - this._observedObject = null + const children = page.shadowRoot.children; + this._observedObject = null; for (var i = 0; i < children.length; i++) { if (children[i].getBoundingClientRect().height > 0) { - this._observedObject = children[i] + this._observedObject = children[i]; break; } } if (this._observer && this._observedObject) { - this._observer.observe(this._observedObject) + this._observer.observe(this._observedObject); } } - }) + }); } openDrawer () { - window.dispatchEvent(new CustomEvent('open-drawer')) + window.dispatchEvent(new CustomEvent('open-drawer')); } } -window.customElements.define(DevfestHeader.is, DevfestHeader) +window.customElements.define(DevfestHeader.is, DevfestHeader); -export default DevfestHeader \ No newline at end of file +export default DevfestHeader; diff --git a/src/modules/devfest-module/components/devfest-header/devfest-header.scss b/src/modules/devfest-module/components/devfest-header/devfest-header.scss index e9fdf8d..17b91a2 100644 --- a/src/modules/devfest-module/components/devfest-header/devfest-header.scss +++ b/src/modules/devfest-module/components/devfest-header/devfest-header.scss @@ -20,13 +20,13 @@ app-header { .menu { display: none; - @media screen and (max-width: 700px) { + @media screen and (max-width: 1100px) { display: block; } } .links { - @media screen and (max-width: 700px) { + @media screen and (max-width: 1100px) { display: none; } } @@ -38,7 +38,7 @@ app-header { min-width: 100px; height: 10px; - @media screen and (max-width: 700px) { + @media screen and (max-width: 1100px) { display: none; } } diff --git a/src/modules/devfest-module/components/devfest-speakers-section/devfest-speakers-section.js b/src/modules/devfest-module/components/devfest-speakers-section/devfest-speakers-section.js index b60c4cb..176815c 100644 --- a/src/modules/devfest-module/components/devfest-speakers-section/devfest-speakers-section.js +++ b/src/modules/devfest-module/components/devfest-speakers-section/devfest-speakers-section.js @@ -1,9 +1,9 @@ -import 'polymer/polymer.html' -import './devfest-speakers-section.html' -import app from '../../../../app' +import 'polymer/polymer.html'; +import './devfest-speakers-section.html'; +import app from '../../../../app'; class DevfestSpeakersSection extends Polymer.Element { - static get is () { return 'devfest-speakers-section' } + static get is () { return 'devfest-speakers-section'; } static get properties () { return { @@ -19,35 +19,33 @@ class DevfestSpeakersSection extends Polymer.Element { type: Boolean, value: false } - } + }; } static get observers () { return [ 'reload(speakers)', 'reload(speakers.*)' - ] + ]; } constructor () { super() - this._app = app + this._app = app; } reload () { - this.speakersArray = [] - const speakers = Object.entries(this.speakers) + this.speakersArray = []; + const speakers = Object.entries(this.speakers); speakers.forEach(speaker => { - const obj = speaker[1] - obj.id = speaker[0] - this.speakersArray.push(obj) - }) + const obj = speaker[1]; + obj.id = speaker[0]; + this.speakersArray.push(obj); + }); // console.log() } - - } -window.customElements.define(DevfestSpeakersSection.is, DevfestSpeakersSection) +window.customElements.define(DevfestSpeakersSection.is, DevfestSpeakersSection); -export default DevfestSpeakersSection \ No newline at end of file +export default DevfestSpeakersSection; diff --git a/src/modules/devfest-module/icons/devfest-icons.html b/src/modules/devfest-module/icons/devfest-icons.html index c1036fd..e1e1d35 100644 --- a/src/modules/devfest-module/icons/devfest-icons.html +++ b/src/modules/devfest-module/icons/devfest-icons.html @@ -6,6 +6,9 @@ + + + @@ -50,5 +53,7 @@ + + diff --git a/src/modules/devfest-module/models/user-model.js b/src/modules/devfest-module/models/user-model.js new file mode 100644 index 0000000..93c66e6 --- /dev/null +++ b/src/modules/devfest-module/models/user-model.js @@ -0,0 +1,248 @@ +import { combineReducers } from 'redux'; +import { login, link, unlink, reloadUser, logout, firebaseDocumentLoader, observeAuth, firebaseRemoveListeners, updateFirebase } from '../../firebase'; +import { ReduxMixin, store, reducers } from '../../../../core/modules/state-manager'; + +const {fetch, Polymer} = window; + +const profileModel = { + primary: { + displayName: String, + email: String, + avatar: String, + github: String, + ticket: String, + ticketEmail: String, + ticketName: String + }, + meta: { + dateJoined: Number, + score: Number, + accepted: Boolean, + verified: Boolean + }, + cross: { + sponsorId: String, + codelabsDone: Array + } +}; + +const modelPath = 'v1/user'; + +const USER_ACTION = { + UPDATE: 'USER_UPDATE', + PROFILE: 'USER_UPDATE_PROFILE', + FETCH: 'USER_UPDATE_FETCH' +}; + +reducers.user = (user = {}, action) => { + switch (action.type) { + case USER_ACTION.FETCH: + if (user.user && user.user.uid) { + firebaseDocumentLoader(modelPath, user.user.uid, action, store, profileModel, USER_ACTION.PROFILE); + } + return user; + case USER_ACTION.UPDATE: + if (!action.user) { + firebaseRemoveListeners(); + } + return Object.assign({}, user, { + user: action.user + }); + case USER_ACTION.PROFILE: + const profile = Object.assign({}, user.profile); + + if (action.attrs) { + action.attrs.forEach(item => { + profile[item.attr] = item.value; + }); + } else if (action.attr) { + profile[action.attr] = action.value; + } + + if (action.del) { + return Object.assign({}, user, { + profile: null + }); + } + + return Object.assign({}, user, { + profile + }); + default: + return user; + } +}; +store.replaceReducer(combineReducers(reducers)); + +const userState = (user) => { + store.dispatch({ + type: USER_ACTION.UPDATE, + user + }); + + const shell = document.querySelector('app-shell'); + shell._pathChanged(shell.path); +}; + +observeAuth(userState); + +export { USER_ACTION }; + +export default (superClass) => { + return class extends ReduxMixin(superClass) { + static get properties () { + return { + user: { + type: Object, + statePath: 'user.user', + observer: '_userChanged' + }, + profile: { + type: Object, + statePath: 'user.profile' + } + }; + } + + static get observers () { + return [ + '_checkSponsorIdReloadPage(profile.sponsorId)' + ]; + } + + _checkSponsorIdReloadPage (sponsorId) { + if (sponsorId !== this.__sponsorId) { + const shell = document.querySelector('app-shell'); + shell._pathChanged(shell.path); + this.__sponsorId = sponsorId; + } + } + + _userChanged (user) { + if (user) { + this.dispatch({ + type: USER_ACTION.FETCH, + modelType: 'primary' + }); + this.dispatch({ + type: USER_ACTION.FETCH, + modelType: 'meta' + }); + this.dispatch({ + type: USER_ACTION.FETCH, + modelType: 'cross', + attr: 'sponsorId' + }); + } else { + this.dispatch({ + type: USER_ACTION.PROFILE, + del: true + }); + } + } + + login (e) { + var el = e.target; + while (!el.id) { + el = el.parentNode; + } + var provider = el.id; + login(provider) + .then(result => { + const user = result.user; + const providerId = result.credential.providerId; + if (providerId === 'github.com') { + return fetch(`https://api.github.com/user?access_token=${result.credential.accessToken}`) + .then(response => Promise.all([response.json(), Promise.resolve(user)])); + } + document.querySelector('app-shell').showMessage('Login successful', null, null, null, 5000); + return Promise.resolve(); + }) + .then(result => { + if (result) { + if (result[0] && result[1]) { + const updates = {}; + updates[`v1/user/source/${result[1].uid}/primary/github`] = result[0].html_url; + updates[`v1/user/source/${result[1].uid}/primary/githubName`] = result[0].login; + updateFirebase(updates); + } + } + }); + } + + link (e) { + var el = e.target; + while (!el.id) { + el = el.parentNode; + } + var provider = el.id; + link(this.user, provider) + .then(result => { + const user = result.user; + const providerId = result.credential.providerId; + + document.querySelector('app-shell').showMessage('Link successful', null, null, null, 5000); + this.dispatch({ + type: USER_ACTION.UPDATE, + user + }); + this.notifyPath('user.providerData'); + + if (providerId === 'github.com') { + return fetch(`https://api.github.com/user?access_token=${result.credential.accessToken}`) + .then(response => Promise.all([response.json(), Promise.resolve(user)])); + } + + return Promise.resolve(); + }) + .then(result => { + if (result) { + if (result[0] && result[1]) { + const updates = {}; + updates[`v1/user/source/${result[1].uid}/primary/github`] = result[0].html_url; + updates[`v1/user/source/${result[1].uid}/primary/githubName`] = result[0].login; + updateFirebase(updates); + } + } + }); + } + + unlink (e) { + if (this.user && this.user.providerData && this.user.providerData.length > 1) { + var provider = this._unlinkId; + unlink(this.user, provider) + .then(() => { + const user = reloadUser(); + + this.dispatch({ + type: USER_ACTION.UPDATE, + user + }); + + if (provider === 'github') { + const updates = {}; + updates[`v1/user/source/${this.user.uid}/primary/github`] = null; + updates[`v1/user/source/${this.user.uid}/primary/githubName`] = null; + updateFirebase(updates); + } + + this.notifyPath('user.providerData'); + + document.querySelector('app-shell').showMessage('Unlinked account successful', null, null, null, 5000); + }) + .catch((e) => { + document.querySelector('app-shell').showMessage(e.message, null, null, null, 5000); + }); + } else { + document.querySelector('app-shell').showMessage('You cannot unlink your only account.', null, null, null, 5000); + } + } + + logout () { + if (this.shadowRoot.querySelector('app-drawer')) { + this.shadowRoot.querySelector('app-drawer').close(); + } + logout(); + } + }; +}; diff --git a/src/modules/devfest-module/pages/devfest-authorized-page/devfest-authorized-page.js b/src/modules/devfest-module/pages/devfest-authorized-page/devfest-authorized-page.js index de90227..bd8e90a 100644 --- a/src/modules/devfest-module/pages/devfest-authorized-page/devfest-authorized-page.js +++ b/src/modules/devfest-module/pages/devfest-authorized-page/devfest-authorized-page.js @@ -1,10 +1,10 @@ -import 'polymer/polymer.html' -import './devfest-authorized-page.html' +import 'polymer/polymer.html'; +import './devfest-authorized-page.html'; class DevfestAuthorizedPage extends Polymer.Element { - static get is () { return 'devfest-authorized-page' } + static get is () { return 'devfest-authorized-page'; } } -window.customElements.define(DevfestAuthorizedPage.is, DevfestAuthorizedPage) +window.customElements.define(DevfestAuthorizedPage.is, DevfestAuthorizedPage); -export default DevfestAuthorizedPage \ No newline at end of file +export default DevfestAuthorizedPage; diff --git a/src/modules/devfest-module/pages/devfest-authorized-page/devfest-authorized-page.test.js b/src/modules/devfest-module/pages/devfest-authorized-page/devfest-authorized-page.test.js new file mode 100644 index 0000000..c98c6fb --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-authorized-page/devfest-authorized-page.test.js @@ -0,0 +1,14 @@ +import { expect } from 'chai' +import page from './devfest-authorized-page' + +describe('Devfest authorized page', () => { + + it('should exist', () => { + expect(page).to.exist + }) + + it('should work', () => { + const el = document.createElement('devfest-authorized-page') + expect(el.constructor.is).to.equal('devfest-authorized-page') + }) +}) \ No newline at end of file diff --git a/src/modules/devfest-module/pages/devfest-codelabs-page/devfest-codelabs-page.html b/src/modules/devfest-module/pages/devfest-codelabs-page/devfest-codelabs-page.html new file mode 100644 index 0000000..381e454 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-codelabs-page/devfest-codelabs-page.html @@ -0,0 +1,37 @@ + + + diff --git a/src/modules/devfest-module/pages/devfest-codelabs-page/devfest-codelabs-page.js b/src/modules/devfest-module/pages/devfest-codelabs-page/devfest-codelabs-page.js new file mode 100644 index 0000000..2341392 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-codelabs-page/devfest-codelabs-page.js @@ -0,0 +1,186 @@ +import 'polymer/polymer-element.html'; +import 'polymer/lib/elements/dom-repeat.html'; +import 'iron-icon/iron-icon.html'; +import 'iron-flex-layout/iron-flex-layout.html'; +import 'shadycss/apply-shim.html'; +import 'marked-element/marked-element.html'; +import '../../components/codelab-item/codelab-item.js'; +import '../../components/codelab-block/codelab-block.js'; +import '../../fonts/devfest-fonts.html'; +import '../../icons/devfest-icons.html'; +import '../../components/devfest-footer/devfest-footer.js'; +import '../../components/devfest-button/devfest-button.js'; +import './devfest-codelabs-page.html'; +import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js'; +import marked from 'marked'; +window.marked = window.marked || marked; + +const {Polymer} = window; + +class DevfestCodelabsPage extends contentLoaderMixin(Polymer.Element) { + static get is () { return 'devfest-codelabs-page'; } + + static get properties () { + return { + codelabs: { + type: Array + }, + codelabType: { + type: String, + value: 'all' + }, + codelabTypes: { + type: Array + }, + pages: { + type: Array + }, + page: { + type: String + } + }; + } + + static get observers () { + return [ + '_changeListCodelab(codelabType, params.id, params.page, user.uid)', + '_changeCodeLabType(params.type)' + ]; + } + + connectedCallback () { + super.connectedCallback(); + this.reload(); + if (this._codelabTypes) { + this._codelabTypes.off(); + } + + this._codelabTypes = firebase.database().ref(`v1/codelabtype/source`) + this._codelabTypes.on('value', snapshot => { + var list = []; + snapshot.forEach(child => { + list.push({ + $key: child.key, + image: child.val().primary.image, + title: child.val().primary.title + }); + }); + this.codelabTypes = list; + }); + } + + disconnectedCallback () { + super.disconnectedCallback(); + if (this._codelabs) { + this._codelabs.off(); + } + + if (this._codelabPages) { + this._codelabPages.off(); + } + + if (this._codelabPage) { + this._codelabPage.off(); + } + + if (this._codelabTitle) { + this._codelabTitle.off(); + } + + if (this._codelabType) { + this._codelabType.off(); + } + } + + _changeCodeLabType (type) { + console.log(type) + this.codelabType = type || 'all'; + } + + _changeListCodelab (codelabType, id, page, uid) { + if (this._codelabs) { + this._codelabs.off(); + } + + if (this._codelabPages) { + this._codelabPages.off(); + } + + if (this._codelabPage) { + this._codelabPage.off(); + } + + if (this._codelabTitle) { + this._codelabTitle.off(); + } + + if (this._codelabType) { + this._codelabType.off(); + } + + if (codelabType === 'done' && uid) { + this._codelabs = firebase.database().ref(`v1/user/source/${uid}/cross/codelabs`); + this._codelabs.on('value', (snapshot) => { + var list = []; + snapshot.forEach(child => { + list.push({ + $key: child.key + }); + }); + this.codelabs = list; + }); + } else if (codelabType === 'exer' && id) { + + this._codelabPages = firebase.database().ref(`v1/codelabs/source/${id}/primary/pages`); + this._codelabPages.on('value', snapshot => { + var list = []; + snapshot.forEach(child => { + list.push({ + $key: child.key, + title: child.val().title, + value: child.val().value + }); + }); + this.pages = list; + }); + + this._codelabTitle = firebase.database().ref(`v1/codelabs/source/${id}/primary/title`); + this._codelabTitle.on('value', snapshot => { + this.codelabTitle = snapshot.val(); + }); + + this._codelabType = firebase.database().ref(`v1/codelabs/source/${id}/meta/type`); + this._codelabType.on('value', snapshot => { + this.codelabTypePage = snapshot.val(); + }); + + page = page || 'page-01'; + + this._codelabPage = firebase.database().ref(`v1/codelabs/source/${id}/primary/pageContent/${page}/value`); + this._codelabPage.on('value', snapshot => { + this.page = snapshot.val(); + }); + + } else { + if (codelabType === 'exer' || codelabType === 'done') { + codelabType = 'all'; + } + this._codelabs = firebase.database().ref(`v1/codelabs/query/${codelabType}`); + this._codelabs.on('value', (snapshot) => { + var list = []; + snapshot.forEach(child => { + list.push({ + $key: child.key + }); + }); + this.codelabs = list; + }); + } + } + + reload () {} +} + +window.customElements.define(DevfestCodelabsPage.is, DevfestCodelabsPage); + +export default DevfestCodelabsPage; diff --git a/src/modules/devfest-module/pages/devfest-codelabs-page/devfest-codelabs-page.scss b/src/modules/devfest-module/pages/devfest-codelabs-page/devfest-codelabs-page.scss new file mode 100644 index 0000000..47662f6 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-codelabs-page/devfest-codelabs-page.scss @@ -0,0 +1,26 @@ +@import '../../styles/components/host.scss'; +@import '../../styles/components/typography.scss'; +@import '../../styles/components/section.scss'; + +.banner { + padding: 40px 0 48px 0; + box-shadow: 0px 3px 6px -3px #BDBDBD; +} + +.banner-text { + margin: 0 auto; + width: 90vw; + max-width: 1024px; +} + +.codelabs-list { + @apply --layout-wrap; + @apply --layout-horizontal; + + max-width: 1000px; + margin: 0 auto; + + @media screen and (max-width: 500px) { + display: block; + } +} \ No newline at end of file diff --git a/src/modules/devfest-module/pages/devfest-connect-page/devfest-connect-page.html b/src/modules/devfest-module/pages/devfest-connect-page/devfest-connect-page.html new file mode 100644 index 0000000..3518978 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-connect-page/devfest-connect-page.html @@ -0,0 +1,23 @@ + + + diff --git a/src/modules/devfest-module/pages/devfest-connect-page/devfest-connect-page.js b/src/modules/devfest-module/pages/devfest-connect-page/devfest-connect-page.js new file mode 100644 index 0000000..1619e67 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-connect-page/devfest-connect-page.js @@ -0,0 +1,235 @@ +import 'polymer/polymer-element.html'; +import 'polymer/lib/elements/dom-repeat.html'; +import 'iron-icon/iron-icon.html'; +import 'iron-flex-layout/iron-flex-layout.html'; +import 'shadycss/apply-shim.html'; +import 'marked-element/marked-element.html'; +import '../../fonts/devfest-fonts.html'; +import '../../icons/devfest-icons.html'; +import '../../components/devfest-footer/devfest-footer.js'; +import '../../components/devfest-button/devfest-button.js'; +import './devfest-connect-page.html'; +import User from '../../models/user-model'; +import QrCode from 'qrcode-reader'; +import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js'; +import marked from 'marked'; +window.marked = window.marked || marked; + +const {Polymer, fetch, Raven, Headers} = window; + +class DevfestConnectPage extends User(contentLoaderMixin(Polymer.Element)) { + static get is () { return 'devfest-connect-page'; } + + static get properties () { + return { + perks: { + type: Array, + value: [] + }, + details: { + type: Array, + value: [] + }, + payment: { + type: Array, + value: [] + } + }; + } + + constructor () { + super(); + this._qr = new QrCode(); + this._qr.callback = (error, result) => { + if (error) { + + } + if (result && result.result) { + this.shadowRoot.querySelector('#video').classList.add('scanned'); + this.stopRecording(); + // console.log(result.result); + document.querySelector('app-shell').showMessage('Scanning...', function () { document.querySelector('app-shell').closeToast(); }, 'Close', null, 10000); + const headers = new Headers(); + headers.append('Content-Type', 'application/json'); + var user = this.user; + if (user) { + user.getIdToken().then(token => { + fetch('/connect', { + method: 'POST', + headers, + body: JSON.stringify({ + id: result.result, + token + }) + }).then(res => { + return res.json(); + }).then(json => { + if (json.success) { + document.querySelector('app-shell').showMessage('Scan complete', function () { document.querySelector('app-shell').closeToast(); }, 'Close', null, 10000); + window.history.pushState({}, '', '/profile'); + window.dispatchEvent(new CustomEvent('location-changed')); + } else { + if (Raven) { + Raven.captureException(json); + } + window.history.pushState({}, '', '/profile'); + window.dispatchEvent(new CustomEvent('location-changed')); + document.querySelector('app-shell').showMessage('Error in scanning: ' + json.message, function () { document.querySelector('app-shell').closeToast(); }, 'Close', null, 10000); + } + + this.shadowRoot.querySelector('#video').classList.remove('scanned'); + }); + }); + } + } + }; + + this._boundResize = this._boundResize || this.resize.bind(this); + window.addEventListener('resize', this._boundResize); + } + + connectedCallback () { + super.connectedCallback(); + this.reload(); + } + + stopRecording () { + if (this._interval) { + clearInterval(this._interval); + this._interval = null; + } + + if (this._stream) { + var tracks = this._stream.getTracks(); + for (var i in tracks) { + if (tracks[i].stop) { + console.log(tracks[i]); + tracks[i].stop(); + } + } + // console.log(this._stream) + delete this._stream; + var video = this.shadowRoot.querySelector('#video'); + video.src = ''; + } + } + + resize () { + // this.$$('#uploading-dialog').center(); + var canvas = this.shadowRoot.querySelector('#canvas'); + var video = this.shadowRoot.querySelector('#video'); + var size = this.windowSize(); + if (canvas && video) { + this.height = size.height - 240; + this.width = size.width - 80; + video.height = this.height; + // video.width = this.width; + canvas.height = this.height; + canvas.width = this.width; + } + } + + windowSize () { + var width = 0; + var height = 0; + if (window && document) { + if (typeof window.innerWidth === 'number') { + // Non-IE + width = window.innerWidth; + height = window.innerHeight; + } else if (document.documentElement && ( + document.documentElement.clientWidth || + document.documentElement.clientHeight)) { + // IE 6+ in 'standards compliant mode' + width = document.documentElement.clientWidth; + height = document.documentElement.clientHeight; + } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) { + // IE 4 compatible + width = document.body.clientWidth; + height = document.body.clientHeight; + } + } + return { width: width, height: height }; + } + + scanned () { + // App.Shell.showMessage('Scan start', function () { App.Shell.closeToast() }, 'Close', null, 10000) + var video = this.shadowRoot.querySelector('#video'); + var canvas = this.shadowRoot.querySelector('#canvas'); + var context = canvas.getContext('2d'); + + var width2 = (video.videoWidth * this.height) / video.videoHeight; + var height2 = (video.videoHeight * this.width) / video.videoWidth; + + if (height2 > this.height) { + context.drawImage(video, (this.width - width2) / 2, 0, width2, this.height); + } else { + context.drawImage(video, 0, (this.height - height2) / 2, this.width, height2); + } + + var dataURL = canvas.toDataURL(); + this._qr.decode(dataURL); + // this._qr.decode(`http://localhost:5000/images/test.png`); + } + + reload () { + Polymer.RenderStatus.afterNextRender(this, () => { + if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { + this.getUserMedia(); + } else { + import(/* webpackChunkName: 'md-gum-polyfill' */ 'md-gum-polyfill').then(() => { + console.log('loaded polyfill'); + this.getUserMedia(); + }); + } + // Get access to the camera! + }); + } + + getUserMedia () { + var video = this.shadowRoot.querySelector('#video'); + + if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { + // console.log(navigator.mediaDevices.getSupportedConstraints()); + // Not adding `{ audio: true }` since we only want video now + navigator.mediaDevices.getUserMedia({ video: { facingMode: { exact: 'environment' } } }).then((stream) => { + this._stream = stream; + video.src = window.URL.createObjectURL(stream); + video.play(); + if (this._interval) { + clearInterval(this._interval); + this._interval = null; + } + + this._interval = setInterval(() => { + this.scanned(); + }, 100); + // setTimeout(function() {console.log(video.videoHeight)}, 1000) + }) + .catch((error) => { + console.error(error); + return navigator.mediaDevices.getUserMedia({ video: true }); + // Raven.captureException(error) + // this.$.toast.show(error.message, 5000); + }) + .then((stream) => { + this._stream = stream; + video.src = window.URL.createObjectURL(stream); + video.play(); + + if (this._interval) { + clearInterval(this._interval); + this._interval = null; + } + this._interval = setInterval(() => { + this.scanned(); + }, 100); + }); + } + this.resize(); + } +} + +window.customElements.define(DevfestConnectPage.is, DevfestConnectPage); + +export default DevfestConnectPage; diff --git a/src/modules/devfest-module/pages/devfest-connect-page/devfest-connect-page.scss b/src/modules/devfest-module/pages/devfest-connect-page/devfest-connect-page.scss new file mode 100644 index 0000000..21999e6 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-connect-page/devfest-connect-page.scss @@ -0,0 +1,45 @@ +@import '../../styles/components/host.scss'; +@import '../../styles/components/typography.scss'; +@import '../../styles/components/section.scss'; + +.qr-section { + text-align: center; + position: relative; + max-width: 600px; + padding: 20px; + margin: 60px auto 60px; + text-align: center; + box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12), 0 3px 1px -2px rgba(0,0,0,.2); + + @media screen and (max-width: 720px) { + margin: 20px 20px; + } +} + +#video { + display: block; + width: 100%; + background: #000; +} + +#canvas { + display: none; +} + +.snap-area { + padding: 0 20px 40px 20px; +} + +.scan-section { + width: 60%; + height: 20%; + position: absolute; + top: 25%; + left: 20%; + border: 1px red solid; + z-index: 100; +} + +.scanned { + border: 2px solid red; +} \ No newline at end of file diff --git a/src/modules/devfest-module/pages/devfest-landing-page/devfest-landing-page.html b/src/modules/devfest-module/pages/devfest-landing-page/devfest-landing-page.html index d3d0744..030b8f8 100644 --- a/src/modules/devfest-module/pages/devfest-landing-page/devfest-landing-page.html +++ b/src/modules/devfest-module/pages/devfest-landing-page/devfest-landing-page.html @@ -64,7 +64,7 @@

[[item.name]]

diff --git a/src/modules/devfest-module/pages/devfest-landing-page/devfest-landing-page.js b/src/modules/devfest-module/pages/devfest-landing-page/devfest-landing-page.js index 6c20195..3a41c1b 100644 --- a/src/modules/devfest-module/pages/devfest-landing-page/devfest-landing-page.js +++ b/src/modules/devfest-module/pages/devfest-landing-page/devfest-landing-page.js @@ -1,27 +1,28 @@ -import 'polymer/polymer.html' -import 'paper-ripple/paper-ripple.html' -import 'iron-flex-layout/iron-flex-layout.html' -import 'shadycss/apply-shim.html' -import 'iron-icon/iron-icon.html' -import 'marked-element/marked-element.html' -import 'google-map/google-map.html' -import 'google-map/google-map-marker.html' -import 'iron-media-query/iron-media-query.html' -import '../../components/devfest-button/devfest-button.js' -import '../../components/devfest-icon-button/devfest-icon-button.js' -import '../../components/devfest-speakers-section/devfest-speakers-section.js' -import '../../components/devfest-banner/devfest-banner.js' -import '../../components/devfest-footer/devfest-footer.js' -import '../../fonts/devfest-fonts.html' -import './devfest-landing-page.html' -import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js' -import marked from 'marked' -import firebaseConfig from '../../../../firebase.js' -import app from '../../../../app.js' -window.marked = window.marked || marked +import 'polymer/polymer.html'; +import 'paper-ripple/paper-ripple.html'; +import 'iron-flex-layout/iron-flex-layout.html'; +import 'shadycss/apply-shim.html'; +import 'iron-icon/iron-icon.html'; +import 'marked-element/marked-element.html'; +import 'google-map/google-map.html'; +import 'google-map/google-map-marker.html'; +import 'iron-media-query/iron-media-query.html'; +import '../../components/devfest-button/devfest-button.js'; +import '../../components/devfest-icon-button/devfest-icon-button.js'; +import '../../components/devfest-speakers-section/devfest-speakers-section.js'; +import '../../components/devfest-banner/devfest-banner.js'; +import '../../components/devfest-footer/devfest-footer.js'; +import '../../fonts/devfest-fonts.html'; +import './devfest-landing-page.html'; +import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js'; +import marked from 'marked'; +import { firebaseConfig } from '../../../../firebase.js'; +import app from '../../../../app.js'; +window.marked = window.marked || marked; +const {Polymer, google} = window; class DevfestLandingPage extends contentLoaderMixin(Polymer.Element) { - static get is () { return 'devfest-landing-page' } + static get is () { return 'devfest-landing-page'; } static get properties () { return { @@ -62,44 +63,44 @@ class DevfestLandingPage extends contentLoaderMixin(Polymer.Element) { type: Boolean, value: false } - } + }; } static get observers () { return [ '_setMap(largeMapSize, middleSizeMap, smallMapSize, _map)' - ] + ]; } constructor () { - super() - this._apiKey = firebaseConfig[0].apiKey - this._app = app + super(); + this._apiKey = firebaseConfig[0].apiKey; + this._app = app; } connectedCallback () { - super.connectedCallback() - this.reload() + super.connectedCallback(); + this.reload(); } _setMap (large, middle, small, m) { - const map = this.shadowRoot.querySelector('.venue-section') + const map = this.shadowRoot.querySelector('.venue-section'); if (map) { if (!large && !middle && !small) { - large = window.innerWidth > 800 - small = window.innerWidth <= 600 - middle = !large && !small + large = window.innerWidth > 800; + small = window.innerWidth <= 600; + middle = !large && !small; } if (large) { - map.latitude = 14.536921 - map.longitude = 121.0151518 + map.latitude = 14.536921; + map.longitude = 121.0151518; } else if (middle) { - map.latitude = 14.52676 - map.longitude = 121.0214175 + map.latitude = 14.52676; + map.longitude = 121.0214175; } else if (small) { - map.latitude = 14.52976 - map.longitude = 121.0214175 + map.latitude = 14.52976; + map.longitude = 121.0214175; } else { } @@ -110,39 +111,36 @@ class DevfestLandingPage extends contentLoaderMixin(Polymer.Element) { if (map) { map.setOptions({ // center: {lat: 14.536921, lng: 121.0151518}, - panControl:false, - zoomControl:false, - mapTypeControl:false, - scaleControl:false, - streetViewControl:false, - overviewMapControl:false, - rotateControl:false, + panControl: false, + zoomControl: false, + mapTypeControl: false, + scaleControl: false, + streetViewControl: false, + overviewMapControl: false, + rotateControl: false, scrollwheel: false, navigationControl: false, draggable: false - }) + }); } } _animateMarker (marker) { - if (marker) { - marker.setAnimation(google.maps.Animation.BOUNCE) + if (marker && google) { + marker.setAnimation(google.maps.Animation.BOUNCE); } } + reload () { + this._fetchContent('pages/landing.md'); + this._fetchJson('speakers/speakers.json', 'speakers'); - reload() { - this._fetchContent('pages/landing.md') - this._fetchJson('speakers/speakers.json', 'speakers') - - const map = this.shadowRoot.querySelector('.venue-section') + const map = this.shadowRoot.querySelector('.venue-section'); if (map && typeof map.resize === 'function') { - map.resize() + map.resize(); } } - - // _shareFacebookLink () { // var text = 'Let\'s attend the Grandest Technology event of the year - GDG DevFest Philippines 2017!' // var link = window.location.protocol + '//' + window.location.hostname //'https://uxphilippines.com' // @@ -161,6 +159,6 @@ class DevfestLandingPage extends contentLoaderMixin(Polymer.Element) { // } } -window.customElements.define(DevfestLandingPage.is, DevfestLandingPage) +window.customElements.define(DevfestLandingPage.is, DevfestLandingPage); -export default DevfestLandingPage \ No newline at end of file +export default DevfestLandingPage; diff --git a/src/modules/devfest-module/pages/devfest-landing-page/devfest-landing-page.scss b/src/modules/devfest-module/pages/devfest-landing-page/devfest-landing-page.scss index 81694b1..8733dbf 100644 --- a/src/modules/devfest-module/pages/devfest-landing-page/devfest-landing-page.scss +++ b/src/modules/devfest-module/pages/devfest-landing-page/devfest-landing-page.scss @@ -38,6 +38,10 @@ devfest-banner { @apply --layout-horizontal; @apply --layout-wrap; + @media screen and (max-width: 650px) { + display: block; + } + .about-part { @apply --layout-flex; min-width: 300px; @@ -82,6 +86,10 @@ devfest-banner { @apply --layout-horizontal; @apply --layout-wrap; + @media only screen and (max-width: 650px) { + display: block; + } + .expect { @apply --layout-flex; min-width: 200px; @@ -125,6 +133,10 @@ devfest-banner { @apply --layout-center; max-width: 1200px; margin: 0 auto; + + @media screen and (max-width: 500px) { + display: block; + } } .flex { diff --git a/src/modules/devfest-module/pages/devfest-login-page/devfest-login-page.html b/src/modules/devfest-module/pages/devfest-login-page/devfest-login-page.html new file mode 100644 index 0000000..a5756d0 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-login-page/devfest-login-page.html @@ -0,0 +1,49 @@ + + + diff --git a/src/modules/devfest-module/pages/devfest-login-page/devfest-login-page.js b/src/modules/devfest-module/pages/devfest-login-page/devfest-login-page.js new file mode 100644 index 0000000..34aa757 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-login-page/devfest-login-page.js @@ -0,0 +1,65 @@ +import 'polymer/polymer-element.html'; +import 'polymer/lib/elements/dom-repeat.html'; +import 'iron-icon/iron-icon.html'; +import 'iron-flex-layout/iron-flex-layout.html'; +import 'shadycss/apply-shim.html'; +import 'paper-spinner/paper-spinner.html'; +import 'marked-element/marked-element.html'; +import '../../fonts/devfest-fonts.html'; +import '../../icons/devfest-icons.html'; +import '../../components/devfest-footer/devfest-footer.js'; +import '../../components/devfest-button-only/devfest-button-only.js'; +import './devfest-login-page.html'; +import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js'; +import User from '../../models/user-model'; +import marked from 'marked'; +window.marked = window.marked || marked; + +const {Polymer} = window; + +class DevfestLoginPage extends User(Polymer.GestureEventListeners(contentLoaderMixin(Polymer.Element))) { + static get is () { return 'devfest-login-page'; } + + static get properties () { + return { + perks: { + type: Array, + value: [] + }, + details: { + type: Array, + value: [] + }, + payment: { + type: Array, + value: [] + } + }; + } + + static get observers () { + return [ + '_checkUser(user)' + ]; + } + + connectedCallback () { + super.connectedCallback(); + this.reload(); + } + + _checkUser (user) { + if (user) { + window.history.pushState({}, '', '/profile'); + window.dispatchEvent(new CustomEvent('location-changed')); + } + } + + reload () { + this._checkUser(this.user); + } +} + +window.customElements.define(DevfestLoginPage.is, DevfestLoginPage); + +export default DevfestLoginPage; diff --git a/src/modules/devfest-module/pages/devfest-login-page/devfest-login-page.scss b/src/modules/devfest-module/pages/devfest-login-page/devfest-login-page.scss new file mode 100644 index 0000000..2c225f5 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-login-page/devfest-login-page.scss @@ -0,0 +1,62 @@ +@import '../../styles/components/host.scss'; +@import '../../styles/components/typography.scss'; +@import '../../styles/components/section.scss'; + +.section { + max-width: 600px; + padding: 20px; + margin: 60px auto 60px; + text-align: center; + box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12), 0 3px 1px -2px rgba(0,0,0,.2); + + @media screen and (max-width: 720px) { + margin: 20px 20px; + } +} + +.row { + @apply --layout-horizontal; + @apply --layout-center; +} + + +.left { + text-align: left; + @apply --layout-flex-4; +} + +.right { + @apply --layout-flex-3; + text-align: right; + margin-right: 40px; + + @media screen and (max-width: 500px) { + margin-right: 20px; + } +} + +.icon { + width: 24px !important; + height: 24px !important; +} + +.icon { + --iron-icon-height: 24px !important; + --iron-icon-width: 24px !important; +} + +.login-image { + width: 50%; + margin-bottom: 40px; + + @media screen and (max-width: 550px) { + width: 80%; + } +} + +.button { + display: block; + margin: 0 auto 5px; + width: 80%; + cursor: pointer; +} \ No newline at end of file diff --git a/src/modules/devfest-module/pages/devfest-not-authorized-page/devfes-not-authorized-page.test.js b/src/modules/devfest-module/pages/devfest-not-authorized-page/devfes-not-authorized-page.test.js new file mode 100644 index 0000000..ba1ea3c --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-not-authorized-page/devfes-not-authorized-page.test.js @@ -0,0 +1,14 @@ +import { expect } from 'chai' +import page from './devfest-not-authorized-page' + +describe('Devfest not authorized page', () => { + + it('should exist', () => { + expect(page).to.exist + }) + + it('should work', () => { + const el = document.createElement('devfest-not-authorized-page') + expect(el.constructor.is).to.equal('devfest-not-authorized-page') + }) +}) \ No newline at end of file diff --git a/src/modules/devfest-module/pages/devfest-not-found-page/devfest-not-found-page.test.js b/src/modules/devfest-module/pages/devfest-not-found-page/devfest-not-found-page.test.js new file mode 100644 index 0000000..df8fd24 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-not-found-page/devfest-not-found-page.test.js @@ -0,0 +1,14 @@ +import { expect } from 'chai' +import page from './devfest-not-found-page' + +describe('Devfest not found page', () => { + + it('should exist', () => { + expect(page).to.exist + }) + + it('should work', () => { + const el = document.createElement('devfest-not-found-page') + expect(el.constructor.is).to.equal('devfest-not-found-page') + }) +}) \ No newline at end of file diff --git a/src/modules/devfest-module/pages/devfest-not-sponsor-page/devfest-not-sponsor-page.html b/src/modules/devfest-module/pages/devfest-not-sponsor-page/devfest-not-sponsor-page.html new file mode 100644 index 0000000..8c04517 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-not-sponsor-page/devfest-not-sponsor-page.html @@ -0,0 +1,44 @@ + + + diff --git a/src/modules/devfest-module/pages/devfest-not-sponsor-page/devfest-not-sponsor-page.js b/src/modules/devfest-module/pages/devfest-not-sponsor-page/devfest-not-sponsor-page.js new file mode 100644 index 0000000..2524ba0 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-not-sponsor-page/devfest-not-sponsor-page.js @@ -0,0 +1,76 @@ +import 'polymer/polymer-element.html'; +import 'polymer/lib/elements/dom-repeat.html'; +import 'iron-icon/iron-icon.html'; +import 'iron-flex-layout/iron-flex-layout.html'; +import 'shadycss/apply-shim.html'; +import 'marked-element/marked-element.html'; +import 'paper-input/paper-input.html'; +import '../../fonts/devfest-fonts.html'; +import '../../icons/devfest-icons.html'; +import '../../components/devfest-footer/devfest-footer.js'; +import '../../components/devfest-button-only/devfest-button-only.js'; +import './devfest-not-sponsor-page.html'; +import User from '../../models/user-model'; +import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js'; +import marked from 'marked'; +window.marked = window.marked || marked; + +const {Polymer, fetch, Headers, Raven} = window; + +class DevfestNotSponsorPage extends User(contentLoaderMixin(Polymer.Element)) { + static get is () { return 'devfest-not-sponsor-page'; } + + static get properties () { + return { + verificationCode: { + type: String + }, + companyId: { + type: String + } + }; + } + + connectedCallback () { + super.connectedCallback(); + this.reload(); + } + + reload () {} + + verify () { + var validate = this.verificationCode; + var company = this.companyId; + const headers = new Headers(); + headers.append('Content-Type', 'application/json'); + var user = this.user; + if (user && validate) { + user.getIdToken().then(token => { + fetch('/validate-sponsor', { + method: 'POST', + headers, + body: JSON.stringify({ + token, + validate, + company + }) + }).then(res => { + return res.json(); + }).then(json => { + if (json.success) { + document.querySelector('app-shell').showMessage('Validation successful', function () { document.querySelector('app-shell').closeToast(); }, 'Close', null, 10000); + } else { + if (Raven) { + Raven.captureException(json); + } + document.querySelector('app-shell').showMessage('Cannot validate your company', function () { document.querySelector('app-shell').closeToast(); }, 'Close', null, 10000); + } + }); + }); + } + } +} + +window.customElements.define(DevfestNotSponsorPage.is, DevfestNotSponsorPage); + +export default DevfestNotSponsorPage; diff --git a/src/modules/devfest-module/pages/devfest-not-sponsor-page/devfest-not-sponsor-page.scss b/src/modules/devfest-module/pages/devfest-not-sponsor-page/devfest-not-sponsor-page.scss new file mode 100644 index 0000000..aeaf544 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-not-sponsor-page/devfest-not-sponsor-page.scss @@ -0,0 +1,81 @@ +@import '../../styles/components/host.scss'; +@import '../../styles/components/typography.scss'; +@import '../../styles/components/section.scss'; + +.section { + max-width: 600px; + padding: 20px; + margin: 60px auto 60px; + box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12), 0 3px 1px -2px rgba(0,0,0,.2); + + @media screen and (max-width: 720px) { + margin: 20px 20px; + } +} + +.row { + @apply --layout-horizontal; + @apply --layout-wrap; + + @media screen and (max-width: 550px) { + display: block; + } +} + +.avatar { + border-radius: 50%; + width: 200px; + height: 200px; + margin: 0 auto; +} + +.flex { + @apply --layout-flex; + margin-left: 40px; + text-align: left; + + @media screen and (max-width: 550px) { + margin-left: 0px; + } +} + +.brow { + @apply --layout-horizontal; + @apply --layout-center; +} + +.button-row { + @apply --layout-flex; +} + + +.left { + text-align: left; + @apply --layout-flex-4; +} + +.right { + @apply --layout-flex-3; + text-align: right; + margin-right: 40px; + + @media screen and (max-width: 500px) { + margin-right: 20px; + } +} + +.icon { + width: 24px !important; + height: 24px !important; +} + +.icon { + --iron-icon-height: 24px !important; + --iron-icon-width: 24px !important; +} + +.text-area { + text-align: left; +} + + diff --git a/src/modules/devfest-module/pages/devfest-profile-page/devfest-profile-page.html b/src/modules/devfest-module/pages/devfest-profile-page/devfest-profile-page.html new file mode 100644 index 0000000..234e63a --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-profile-page/devfest-profile-page.html @@ -0,0 +1,142 @@ + + + diff --git a/src/modules/devfest-module/pages/devfest-profile-page/devfest-profile-page.js b/src/modules/devfest-module/pages/devfest-profile-page/devfest-profile-page.js new file mode 100644 index 0000000..2d79e85 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-profile-page/devfest-profile-page.js @@ -0,0 +1,173 @@ +import 'polymer/polymer-element.html'; +import 'polymer/lib/elements/dom-repeat.html'; +import 'iron-icon/iron-icon.html'; +import 'iron-flex-layout/iron-flex-layout.html'; +import 'shadycss/apply-shim.html'; +import 'paper-dialog/paper-dialog.html'; +import 'marked-element/marked-element.html'; +import '../../fonts/devfest-fonts.html'; +import '../../icons/devfest-icons.html'; +import '../../components/devfest-footer/devfest-footer.js'; +import '../../components/devfest-button-only/devfest-button-only.js'; +import './devfest-profile-page.html'; +import User from '../../models/user-model'; +import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js'; +import marked from 'marked'; +window.marked = window.marked || marked; + +const {Polymer} = window; + +class DevfestProfilePage extends User(contentLoaderMixin(Polymer.Element)) { + static get is () { return 'devfest-profile-page'; } + + static get properties () { + return { + + }; + } + + static get observers () { + return [ + '_setProfileImage(profile.image)' + ] + } + + connectedCallback () { + super.connectedCallback(); + this.reload(); + } + + _setProfileImage (image) { + this.shadowRoot.querySelector('#profile-image').style.background = `url(${image}) center/cover no-repeat`; + } + + _getMoreLinks (providerData) { + var providers = [ + 'github.com', + 'facebook.com', + 'google.com' + ]; + + for (var i in providerData) { + providers.splice(providers.indexOf(providerData[i].providerId), 1); + } + + return providers.map(item => ({providerId: item})); + } + + _getMoreLinksNumber (providerData) { + var providers = [ + 'github.com', + 'facebook.com', + 'google.com' + ]; + + for (var i in providerData) { + providers.splice(providers.indexOf(providerData[i].providerId), 1); + } + + return providers.length; + } + + _getProvider (provider) { + if (provider === 'github.com') { + return 'github'; + } else if (provider === 'google.com') { + return 'google'; + } else if (provider === 'facebook.com') { + return 'facebook'; + } else { + console.log(provider); + } + } + + _getProviderIcon (provider) { + if (provider === 'github.com') { + return 'github'; + } else if (provider === 'google.com') { + return 'google-plus'; + } else if (provider === 'facebook.com') { + return 'facebook'; + } else { + console.log(provider); + } + } + + _getProviderName (provider) { + if (provider === 'github.com') { + return 'Github'; + } else if (provider === 'google.com') { + return 'Google'; + } else if (provider === 'facebook.com') { + return 'Facebook'; + } else { + console.log(provider); + } + } + + disconnectDialog () { + this.shadowRoot.querySelector('#disconnect-dialog').open(); + } + + unlinkDialog (e) { + var el = e.target; + while (!el.id) { + el = el.parentNode; + } + this._unlinkId = el.id; + this.shadowRoot.querySelector('#unlink-dialog').open(); + } + + unlink () { + super.unlink(); + this.shadowRoot.querySelector('#unlink-dialog').close(); + this._unlinkId = null; + } + + _closeUnlinkDialog () { + this.shadowRoot.querySelector('#unlink-dialog').cancel(); + this._unlinkId = null; + } + + _disconnect () { + const headers = new Headers(); + headers.append('Content-Type', 'application/json'); + var user = this.user; + var profile = this.profile; + if (user && profile) { + user.getIdToken().then(token => { + fetch('/disconnect', { + method: 'POST', + headers, + body: JSON.stringify({ + id: profile.ticketNumber, + token + }) + }).then(res => { + return res.json(); + }).then(json => { + if (json.success) { + document.querySelector('app-shell').showMessage('Disconnected', function () { document.querySelector('app-shell').closeToast(); }, 'Close', null, 10000); + } else { + if (Raven) { + Raven.captureException(json); + } + document.querySelector('app-shell').showMessage('Error in disconnecting ticket: ' + json.message, function () { document.querySelector('app-shell').closeToast(); }, 'Close', null, 10000); + } + this.notifyPath('profile.ticketNumber'); + this.shadowRoot.querySelector('#disconnect-dialog').close(); + }); + }); + } + } + + _closeDisconnectDialog () { + this.shadowRoot.querySelector('#disconnect-dialog').cancel(); + } + + reload () {} +} + +window.customElements.define(DevfestProfilePage.is, DevfestProfilePage); + +export default DevfestProfilePage; diff --git a/src/modules/devfest-module/pages/devfest-profile-page/devfest-profile-page.scss b/src/modules/devfest-module/pages/devfest-profile-page/devfest-profile-page.scss new file mode 100644 index 0000000..8465ae3 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-profile-page/devfest-profile-page.scss @@ -0,0 +1,83 @@ +@import '../../styles/components/host.scss'; +@import '../../styles/components/typography.scss'; +@import '../../styles/components/section.scss'; + +.section { + max-width: 600px; + padding: 20px; + margin: 60px auto 60px; + box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12), 0 3px 1px -2px rgba(0,0,0,.2); + + @media screen and (max-width: 720px) { + margin: 20px 20px; + } +} + +.row { + @apply --layout-horizontal; + @apply --layout-wrap; + + @media screen and (max-width: 550px) { + display: block; + } +} + +.avatar { + border-radius: 50%; + width: 200px; + height: 200px; + margin: 0 auto; +} + +.flex { + @apply --layout-flex; + margin-left: 40px; + text-align: left; + + @media screen and (max-width: 550px) { + margin-left: 0px; + } +} + +.brow { + @apply --layout-horizontal; + @apply --layout-center; +} + +.button-row { + @apply --layout-flex; +} + + +.left { + text-align: left; + @apply --layout-flex-4; +} + +.right { + @apply --layout-flex-3; + text-align: right; + margin-right: 40px; + + @media screen and (max-width: 500px) { + margin-right: 20px; + } +} + +.icon { + width: 24px !important; + height: 24px !important; +} + +.icon { + --iron-icon-height: 24px !important; + --iron-icon-width: 24px !important; +} + +.text-area { + text-align: left; +} + +.dialog-box { + box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12), 0 3px 1px -2px rgba(0,0,0,.2); +} diff --git a/src/modules/devfest-module/pages/devfest-register-page/devfest-register-page.html b/src/modules/devfest-module/pages/devfest-register-page/devfest-register-page.html new file mode 100644 index 0000000..515f397 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-register-page/devfest-register-page.html @@ -0,0 +1,12 @@ + + + diff --git a/src/modules/devfest-module/pages/devfest-register-page/devfest-register-page.js b/src/modules/devfest-module/pages/devfest-register-page/devfest-register-page.js new file mode 100644 index 0000000..f236fb8 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-register-page/devfest-register-page.js @@ -0,0 +1,48 @@ +import 'polymer/polymer-element.html'; +import 'polymer/lib/elements/dom-repeat.html'; +import 'iron-icon/iron-icon.html'; +import 'iron-flex-layout/iron-flex-layout.html'; +import 'shadycss/apply-shim.html'; +import 'marked-element/marked-element.html'; +import '../../fonts/devfest-fonts.html'; +import '../../icons/devfest-icons.html'; +import '../../components/devfest-footer/devfest-footer.js'; +import '../../components/devfest-button/devfest-button.js'; +import './devfest-register-page.html'; +import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js'; +import marked from 'marked'; +window.marked = window.marked || marked; + +const {Polymer} = window; + +class DevfestRegisterPage extends contentLoaderMixin(Polymer.Element) { + static get is () { return 'devfest-register-page'; } + + static get properties () { + return { + perks: { + type: Array, + value: [] + }, + details: { + type: Array, + value: [] + }, + payment: { + type: Array, + value: [] + } + }; + } + + connectedCallback () { + super.connectedCallback(); + this.reload(); + } + + reload () {} +} + +window.customElements.define(DevfestRegisterPage.is, DevfestRegisterPage); + +export default DevfestRegisterPage; diff --git a/src/modules/devfest-module/pages/devfest-register-page/devfest-register-page.scss b/src/modules/devfest-module/pages/devfest-register-page/devfest-register-page.scss new file mode 100644 index 0000000..4c50add --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-register-page/devfest-register-page.scss @@ -0,0 +1,3 @@ +@import '../../styles/components/host.scss'; +@import '../../styles/components/typography.scss'; +@import '../../styles/components/section.scss'; diff --git a/src/modules/devfest-module/pages/devfest-scan-page/devfest-scan-page.html b/src/modules/devfest-module/pages/devfest-scan-page/devfest-scan-page.html new file mode 100644 index 0000000..fcf1906 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-scan-page/devfest-scan-page.html @@ -0,0 +1,29 @@ + + + diff --git a/src/modules/devfest-module/pages/devfest-scan-page/devfest-scan-page.js b/src/modules/devfest-module/pages/devfest-scan-page/devfest-scan-page.js new file mode 100644 index 0000000..35f249f --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-scan-page/devfest-scan-page.js @@ -0,0 +1,245 @@ +import 'polymer/polymer-element.html'; +import 'polymer/lib/elements/dom-repeat.html'; +import 'iron-icon/iron-icon.html'; +import 'iron-flex-layout/iron-flex-layout.html'; +import 'shadycss/apply-shim.html'; +import 'marked-element/marked-element.html'; +import '../../fonts/devfest-fonts.html'; +import '../../icons/devfest-icons.html'; +import '../../components/devfest-footer/devfest-footer.js'; +import './devfest-scan-page.html'; +import '../../components/devfest-button-only/devfest-button-only.js'; +import User from '../../models/user-model'; +import QrCode from 'qrcode-reader'; +import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js'; +import marked from 'marked'; +window.marked = window.marked || marked; + +const { Polymer, fetch, Raven, Headers } = window; + +class DevfestScanPage extends User(Polymer.GestureEventListeners(contentLoaderMixin(Polymer.Element))) { + static get is () { return 'devfest-scan-page'; } + + static get properties () { + return { + perks: { + type: Array, + value: [] + }, + details: { + type: Array, + value: [] + }, + payment: { + type: Array, + value: [] + } + }; + } + + constructor () { + super(); + this._qr = new QrCode(); + this._qr.callback = (error, result) => { + if (error) { + + } + if (result && result.result) { + this.shadowRoot.querySelector('#video').classList.add('scanned'); + this.stopRecording(); + // console.log(result.result); + document.querySelector('app-shell').showMessage('Scanning...', function () { document.querySelector('app-shell').closeToast(); }, 'Close', null, 10000); + const headers = new Headers(); + headers.append('Content-Type', 'application/json'); + var user = this.user; + var profile = this.profile; + if (user && profile) { + user.getIdToken().then(token => { + fetch('/scan-id', { + method: 'POST', + headers, + body: JSON.stringify({ + id: result.result, + uid: user.uid, + company: profile.sponsorId, + token + }) + }).then(res => { + return res.json(); + }).then(json => { + if (json.success) { + document.querySelector('app-shell').showMessage('Scan complete', function () { document.querySelector('app-shell').closeToast(); }, 'Close', null, 10000); + } else { + if (Raven) { + Raven.captureException(json); + } + document.querySelector('app-shell').showMessage('Error in scanning: ' + json.message, function () { document.querySelector('app-shell').closeToast(); }, 'Close', null, 10000); + } + + this.shadowRoot.querySelector('#video').classList.remove('scanned'); + this.reload(); + }); + }); + } else { + document.querySelector('app-shell').showMessage('Can`\t find your user credentials', function () { document.querySelector('app-shell').closeToast(); }, 'Close', null, 10000); + this.shadowRoot.querySelector('#video').classList.remove('scanned'); + this.reload(); + } + } + }; + + this._boundResize = this._boundResize || this.resize.bind(this); + window.addEventListener('resize', this._boundResize); + } + + stopRecording () { + if (this._interval) { + clearInterval(this._interval); + this._interval = null; + } + + if (this._stream) { + var tracks = this._stream.getTracks(); + for (var i in tracks) { + if (tracks[i].stop) { + console.log(tracks[i]); + tracks[i].stop(); + } + } + // console.log(this._stream) + delete this._stream; + var video = this.shadowRoot.querySelector('#video'); + video.src = ''; + } + } + + goBack () { + this.stopRecording(); + window.history.pushState({}, '', '/are-you-a-sponsor'); + window.dispatchEvent(new CustomEvent('location-changed')); + } + + connectedCallback () { + super.connectedCallback(); + this.reload(); + } + + resize () { + // this.$$('#uploading-dialog').center(); + var canvas = this.shadowRoot.querySelector('#canvas'); + var video = this.shadowRoot.querySelector('#video'); + var size = this.windowSize(); + if (canvas && video) { + this.height = size.height - 240; + this.width = size.width - 80; + video.height = this.height; + // video.width = this.width; + canvas.height = this.height; + canvas.width = this.width; + } + } + + windowSize () { + var width = 0; + var height = 0; + if (window && document) { + if (typeof window.innerWidth === 'number') { + // Non-IE + width = window.innerWidth; + height = window.innerHeight; + } else if (document.documentElement && ( + document.documentElement.clientWidth || + document.documentElement.clientHeight)) { + // IE 6+ in 'standards compliant mode' + width = document.documentElement.clientWidth; + height = document.documentElement.clientHeight; + } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) { + // IE 4 compatible + width = document.body.clientWidth; + height = document.body.clientHeight; + } + } + return { width: width, height: height }; + } + + scanned () { + // App.Shell.showMessage('Scan start', function () { App.Shell.closeToast() }, 'Close', null, 10000) + var video = this.shadowRoot.querySelector('#video'); + var canvas = this.shadowRoot.querySelector('#canvas'); + var context = canvas.getContext('2d'); + + var width2 = (video.videoWidth * this.height) / video.videoHeight; + var height2 = (video.videoHeight * this.width) / video.videoWidth; + + if (height2 > this.height) { + context.drawImage(video, (this.width - width2) / 2, 0, width2, this.height); + } else { + context.drawImage(video, 0, (this.height - height2) / 2, this.width, height2); + } + + var dataURL = canvas.toDataURL(); + this._qr.decode(dataURL); + // this._qr.decode(`http://localhost:5000/images/test.png`); + } + + reload () { + Polymer.RenderStatus.afterNextRender(this, () => { + if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { + this.getUserMedia(); + } else { + import(/* webpackChunkName: 'md-gum-polyfill' */ 'md-gum-polyfill').then(() => { + console.log('loaded polyfill'); + this.getUserMedia(); + }); + } + // Get access to the camera! + }); + } + + getUserMedia () { + var video = this.shadowRoot.querySelector('#video'); + + if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { + // console.log(navigator.mediaDevices.getSupportedConstraints()); + // Not adding `{ audio: true }` since we only want video now + navigator.mediaDevices.getUserMedia({ video: { facingMode: { exact: 'environment' } } }).then((stream) => { + this._stream = stream; + video.src = window.URL.createObjectURL(stream); + video.play(); + if (this._interval) { + clearInterval(this._interval); + this._interval = null; + } + + this._interval = setInterval(() => { + this.scanned(); + }, 100); + // setTimeout(function() {console.log(video.videoHeight)}, 1000) + }) + .catch((error) => { + console.error(error); + return navigator.mediaDevices.getUserMedia({ video: true }); + // Raven.captureException(error) + // this.$.toast.show(error.message, 5000); + }) + .then((stream) => { + this._stream = stream; + video.src = window.URL.createObjectURL(stream); + video.play(); + + if (this._interval) { + clearInterval(this._interval); + this._interval = null; + } + this._interval = setInterval(() => { + this.scanned(); + }, 100); + }); + } + this.resize(); + } +} + +window.customElements.define(DevfestScanPage.is, DevfestScanPage); + +export default DevfestScanPage; diff --git a/src/modules/devfest-module/pages/devfest-scan-page/devfest-scan-page.scss b/src/modules/devfest-module/pages/devfest-scan-page/devfest-scan-page.scss new file mode 100644 index 0000000..21999e6 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-scan-page/devfest-scan-page.scss @@ -0,0 +1,45 @@ +@import '../../styles/components/host.scss'; +@import '../../styles/components/typography.scss'; +@import '../../styles/components/section.scss'; + +.qr-section { + text-align: center; + position: relative; + max-width: 600px; + padding: 20px; + margin: 60px auto 60px; + text-align: center; + box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12), 0 3px 1px -2px rgba(0,0,0,.2); + + @media screen and (max-width: 720px) { + margin: 20px 20px; + } +} + +#video { + display: block; + width: 100%; + background: #000; +} + +#canvas { + display: none; +} + +.snap-area { + padding: 0 20px 40px 20px; +} + +.scan-section { + width: 60%; + height: 20%; + position: absolute; + top: 25%; + left: 20%; + border: 1px red solid; + z-index: 100; +} + +.scanned { + border: 2px solid red; +} \ No newline at end of file diff --git a/src/modules/devfest-module/pages/devfest-scanned-list-page/devfest-scanned-list-page.html b/src/modules/devfest-module/pages/devfest-scanned-list-page/devfest-scanned-list-page.html new file mode 100644 index 0000000..05e4823 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-scanned-list-page/devfest-scanned-list-page.html @@ -0,0 +1,55 @@ + + + diff --git a/src/modules/devfest-module/pages/devfest-scanned-list-page/devfest-scanned-list-page.js b/src/modules/devfest-module/pages/devfest-scanned-list-page/devfest-scanned-list-page.js new file mode 100644 index 0000000..276ccd5 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-scanned-list-page/devfest-scanned-list-page.js @@ -0,0 +1,88 @@ +import 'polymer/polymer-element.html'; +import 'polymer/lib/elements/dom-repeat.html'; +import 'iron-icon/iron-icon.html'; +import 'iron-flex-layout/iron-flex-layout.html'; +import 'shadycss/apply-shim.html'; +import 'marked-element/marked-element.html'; +import '../../fonts/devfest-fonts.html'; +import '../../icons/devfest-icons.html'; +import '../../components/devfest-footer/devfest-footer.js'; +import '../../components/devfest-button-only/devfest-button-only.js'; +import User from '../../models/user-model'; +import './devfest-scanned-list-page.html'; +import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js'; +import marked from 'marked'; +window.marked = window.marked || marked; + +const {Polymer} = window; + +class DevfestScannedListPage extends User(contentLoaderMixin(Polymer.Element)) { + static get is () { return 'devfest-scanned-list-page'; } + + static get properties () { + return { + perks: { + type: Array, + value: [] + }, + details: { + type: Array, + value: [] + }, + payment: { + type: Array, + value: [] + } + }; + } + + connectedCallback () { + super.connectedCallback(); + this.reload(); + } + + reload () { + const headers = new Headers(); + headers.append('Content-Type', 'application/json'); + var user = this.user; + var profile = this.profile; + if (user && profile) { + user.getIdToken().then(token => { + fetch('/scanned-list-for-sponsor', { + method: 'POST', + headers, + body: JSON.stringify({ + uid: user.uid, + company: profile.sponsorId, + token + }) + }).then(res => { + return res.json(); + }).then(json => { + if (json.success) { + this.scanned = json.list; + } else { + if (Raven) { + Raven.captureException(json); + } + document.querySelector('app-shell').showMessage('Error in scanning: ' + json.message, function () { document.querySelector('app-shell').closeToast(); }, 'Close', null, 10000); + } + }); + }); + } + // this._fetchJson('scanned-list-for-sponsor', 'speakers', true); + } + + _renderDate (d) { + var date = d; + if (typeof d === 'object' && d.value) { + date = d.value; + } + var nd = new Date(date); + return nd.toLocaleDateString() + ' - ' + nd.toLocaleTimeString(); + } +} + +window.customElements.define(DevfestScannedListPage.is, DevfestScannedListPage); + +export default DevfestScannedListPage; diff --git a/src/modules/devfest-module/pages/devfest-scanned-list-page/devfest-scanned-list-page.scss b/src/modules/devfest-module/pages/devfest-scanned-list-page/devfest-scanned-list-page.scss new file mode 100644 index 0000000..38f0fed --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-scanned-list-page/devfest-scanned-list-page.scss @@ -0,0 +1,29 @@ +@import '../../styles/components/host.scss'; +@import '../../styles/components/typography.scss'; +@import '../../styles/components/section.scss'; + +.table { + padding: 20px; + width: 100%; +} + +.table-body { + text-align: left; +} + +.table-cell { + padding: 5px; + border-bottom: 1px solid grey; +} + +.hide-on-small { + @media screen and (max-width: 700px){ + display: none; + } +} + +.make-small { + @media screen and (max-width: 700px){ + font-size: 10px; + } +} \ No newline at end of file diff --git a/src/modules/devfest-module/pages/devfest-scores-page/devfest-scores-page.html b/src/modules/devfest-module/pages/devfest-scores-page/devfest-scores-page.html new file mode 100644 index 0000000..3ff8b70 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-scores-page/devfest-scores-page.html @@ -0,0 +1,10 @@ + + + diff --git a/src/modules/devfest-module/pages/devfest-scores-page/devfest-scores-page.js b/src/modules/devfest-module/pages/devfest-scores-page/devfest-scores-page.js new file mode 100644 index 0000000..596a14e --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-scores-page/devfest-scores-page.js @@ -0,0 +1,48 @@ +import 'polymer/polymer-element.html'; +import 'polymer/lib/elements/dom-repeat.html'; +import 'iron-icon/iron-icon.html'; +import 'iron-flex-layout/iron-flex-layout.html'; +import 'shadycss/apply-shim.html'; +import 'marked-element/marked-element.html'; +import '../../fonts/devfest-fonts.html'; +import '../../icons/devfest-icons.html'; +import '../../components/devfest-footer/devfest-footer.js'; +import '../../components/devfest-button/devfest-button.js'; +import './devfest-scores-page.html'; +import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js'; +import marked from 'marked'; +window.marked = window.marked || marked; + +const {Polymer} = window; + +class DevfestScoresPage extends contentLoaderMixin(Polymer.Element) { + static get is () { return 'devfest-scores-page'; } + + static get properties () { + return { + perks: { + type: Array, + value: [] + }, + details: { + type: Array, + value: [] + }, + payment: { + type: Array, + value: [] + } + }; + } + + connectedCallback () { + super.connectedCallback(); + this.reload(); + } + + reload () {} +} + +window.customElements.define(DevfestScoresPage.is, DevfestScoresPage); + +export default DevfestScoresPage; diff --git a/src/modules/devfest-module/pages/devfest-scores-page/devfest-scores-page.scss b/src/modules/devfest-module/pages/devfest-scores-page/devfest-scores-page.scss new file mode 100644 index 0000000..4c50add --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-scores-page/devfest-scores-page.scss @@ -0,0 +1,3 @@ +@import '../../styles/components/host.scss'; +@import '../../styles/components/typography.scss'; +@import '../../styles/components/section.scss'; diff --git a/src/modules/devfest-module/pages/devfest-session-page/devfest-session-page.js b/src/modules/devfest-module/pages/devfest-session-page/devfest-session-page.js index 6720e7f..e874285 100644 --- a/src/modules/devfest-module/pages/devfest-session-page/devfest-session-page.js +++ b/src/modules/devfest-module/pages/devfest-session-page/devfest-session-page.js @@ -1,16 +1,17 @@ -import 'polymer/polymer-element.html' -import 'marked-element/marked-element.html' -import '../../fonts/devfest-fonts.html' -import '../../icons/devfest-icons.html' -import '../../components/devfest-footer/devfest-footer.js' -import './devfest-session-page.html' -import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js' -import app from '../../../../app' -import marked from 'marked' -window.marked = window.marked || marked +import 'polymer/polymer-element.html'; +import 'marked-element/marked-element.html'; +import '../../fonts/devfest-fonts.html'; +import '../../icons/devfest-icons.html'; +import '../../components/devfest-footer/devfest-footer.js'; +import './devfest-session-page.html'; +import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js'; +import app from '../../../../app'; +import marked from 'marked'; +window.marked = window.marked || marked; +const {Polymer} = window; class DevfestSessionPage extends contentLoaderMixin(Polymer.Element) { - static get is () { return 'devfest-session-page' } + static get is () { return 'devfest-session-page'; } static get properties () { return { @@ -25,56 +26,56 @@ class DevfestSessionPage extends contentLoaderMixin(Polymer.Element) { type: Object, value: {} } - } + }; } static get observers () { return [ 'reload(params.id)' - ] + ]; } constructor () { - super() - this._app = app + super(); + this._app = app; } connectedCallback () { - super.connectedCallback() + super.connectedCallback(); if (this.params && this.params.id) { - this.reload() + this.reload(); } // this._fetchContent('pages/speakers.md') } - reload() { + reload () { if (this.params.id) { - this._fetchContent(`sessions/session-description/${this.params.id}.md`) + this._fetchContent(`sessions/session-description/${this.params.id}.md`); } - this._fetchJson('speakers/speakers.json', 'speakers') - this._fetchJson('sessions/sessions.json', 'sessions') - this._fetchJson('sessions/sessions-type.json', 'sessionsType') - this._fetchJson('schedule/schedule.json', 'schedule') + this._fetchJson('speakers/speakers.json', 'speakers'); + this._fetchJson('sessions/sessions.json', 'sessions'); + this._fetchJson('sessions/sessions-type.json', 'sessionsType'); + this._fetchJson('schedule/schedule.json', 'schedule'); } - _getInfo(id, attribute) { + _getInfo (id, attribute) { if (this.sessions[id]) { - return this.sessions[id][attribute] + return this.sessions[id][attribute]; } } - _getSession(id, attribute) { + _getSession (id, attribute) { if (this.sessions[id]) { - return this.sessions[id][attribute] + return this.sessions[id][attribute]; } } - _getTime(id) { + _getTime (id) { if (this.schedule && this.sessions[id]) { - var schedule = this.sessions[id].schedule + var schedule = this.sessions[id].schedule; for (var i in this.schedule) { if (this.schedule[i].id === schedule) { - return (this.schedule[i].start.substr(0, 2) + ':' + this.schedule[i].start.substr(2, 2)) + ' - ' + (this.schedule[i].end.substr(0, 2) + ':' + this.schedule[i].end.substr(2, 2)) + return (this.schedule[i].start.substr(0, 2) + ':' + this.schedule[i].start.substr(2, 2)) + ' - ' + (this.schedule[i].end.substr(0, 2) + ':' + this.schedule[i].end.substr(2, 2)); } } } @@ -83,7 +84,7 @@ class DevfestSessionPage extends contentLoaderMixin(Polymer.Element) { _getSpeakerId (id) { if (this.sessions && id && this.sessions[id] && this.speakers) { if (this.sessions[id].speaker) { - return this.sessions[id].speaker + return this.sessions[id].speaker; } // return this.sessions[id].title @@ -93,7 +94,7 @@ class DevfestSessionPage extends contentLoaderMixin(Polymer.Element) { _getSpeakerInfo (id, attribute) { if (this.sessions && id && this.sessions[id] && this.speakers) { if (this.speakers[this.sessions[id].speaker]) { - return this.speakers[this.sessions[id].speaker][attribute] + return this.speakers[this.sessions[id].speaker][attribute]; } // return this.sessions[id].title @@ -101,6 +102,6 @@ class DevfestSessionPage extends contentLoaderMixin(Polymer.Element) { } } -window.customElements.define(DevfestSessionPage.is, DevfestSessionPage) +window.customElements.define(DevfestSessionPage.is, DevfestSessionPage); -export default DevfestSessionPage \ No newline at end of file +export default DevfestSessionPage; diff --git a/src/modules/devfest-module/pages/devfest-session-page/devfest-session-page.test.js b/src/modules/devfest-module/pages/devfest-session-page/devfest-session-page.test.js new file mode 100644 index 0000000..1411583 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-session-page/devfest-session-page.test.js @@ -0,0 +1,14 @@ +import { expect } from 'chai' +import page from './devfest-session-page' + +describe('Devfest session page', () => { + + it('should exist', () => { + expect(page).to.exist + }) + + it('should work', () => { + const el = document.createElement('devfest-session-page') + expect(el.constructor.is).to.equal('devfest-session-page') + }) +}) \ No newline at end of file diff --git a/src/modules/devfest-module/pages/devfest-sessions-page/devfest-sessions-page.html b/src/modules/devfest-module/pages/devfest-sessions-page/devfest-sessions-page.html index 05874f3..193389c 100644 --- a/src/modules/devfest-module/pages/devfest-sessions-page/devfest-sessions-page.html +++ b/src/modules/devfest-module/pages/devfest-sessions-page/devfest-sessions-page.html @@ -32,6 +32,9 @@

diff --git a/src/modules/devfest-module/pages/devfest-sessions-page/devfest-sessions-page.js b/src/modules/devfest-module/pages/devfest-sessions-page/devfest-sessions-page.js index 4e54c17..aaa5436 100644 --- a/src/modules/devfest-module/pages/devfest-sessions-page/devfest-sessions-page.js +++ b/src/modules/devfest-module/pages/devfest-sessions-page/devfest-sessions-page.js @@ -25,7 +25,6 @@ class DevfestSessionsPage extends contentLoaderMixin(Polymer.Element) { connectedCallback () { super.connectedCallback() this.reload() - console.log(document.referrer) } reload () { diff --git a/src/modules/devfest-module/pages/devfest-sessions-page/devfest-sessions-page.scss b/src/modules/devfest-module/pages/devfest-sessions-page/devfest-sessions-page.scss index c5e8a55..51366e4 100644 --- a/src/modules/devfest-module/pages/devfest-sessions-page/devfest-sessions-page.scss +++ b/src/modules/devfest-module/pages/devfest-sessions-page/devfest-sessions-page.scss @@ -22,6 +22,12 @@ padding: 20px; // border-right: 1px solid #666; width: 100px; + + @media screen and (max-width: 800px){ + padding-left: 0px; + width: auto; + border-bottom: 1px solid rgba(0,0,0, .2) + } } .time-number { @@ -39,6 +45,10 @@ .schedule-item { @apply --layout-flex; + + @media screen and (max-width: 800px){ + padding-left: 20px; + } } .session-item { diff --git a/src/modules/devfest-module/pages/devfest-sessions-page/devfest-sessions-page.test.js b/src/modules/devfest-module/pages/devfest-sessions-page/devfest-sessions-page.test.js new file mode 100644 index 0000000..23f1451 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-sessions-page/devfest-sessions-page.test.js @@ -0,0 +1,14 @@ +import { expect } from 'chai' +import page from './devfest-sessions-page' + +describe('Devfest sessions page', () => { + + it('should exist', () => { + expect(page).to.exist + }) + + it('should work', () => { + const el = document.createElement('devfest-sessions-page') + expect(el.constructor.is).to.equal('devfest-sessions-page') + }) +}) \ No newline at end of file diff --git a/src/modules/devfest-module/pages/devfest-speaker-page/devfest-speaker-page.test.js b/src/modules/devfest-module/pages/devfest-speaker-page/devfest-speaker-page.test.js new file mode 100644 index 0000000..72fb01a --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-speaker-page/devfest-speaker-page.test.js @@ -0,0 +1,20 @@ +import { expect } from 'chai' +import page from './devfest-speaker-page' + +describe('Devfest speaker page', () => { + + it('should exist', () => { + expect(page).to.exist + }) + + it('should work', () => { + const el = document.createElement('devfest-speaker-page') + expect(el.constructor.is).to.equal('devfest-speaker-page') + }) + + it('back button should exist', () => { + const el = document.createElement('devfest-speaker-page') + const ret = el.shadowRoot.querySelector("section.back-section devfest-button[href='/speakers']") + expect(ret).to.exist + }) +}) \ No newline at end of file diff --git a/src/modules/devfest-module/pages/devfest-speakers-page/devfest-speakers-page.test.js b/src/modules/devfest-module/pages/devfest-speakers-page/devfest-speakers-page.test.js new file mode 100644 index 0000000..0f26252 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-speakers-page/devfest-speakers-page.test.js @@ -0,0 +1,14 @@ +import { expect } from 'chai' +import page from './devfest-speakers-page' + +describe('Devfest speakers page', () => { + + it('should exist', () => { + expect(page).to.exist + }) + + it('should work', () => { + const el = document.createElement('devfest-speakers-page') + expect(el.constructor.is).to.equal('devfest-speakers-page') + }) +}) \ No newline at end of file diff --git a/src/modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.html b/src/modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.html index a09d997..a15edd1 100644 --- a/src/modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.html +++ b/src/modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.html @@ -1,26 +1,38 @@ - + diff --git a/src/modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.js b/src/modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.js index 09fb27f..324fcd9 100644 --- a/src/modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.js +++ b/src/modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.js @@ -1,20 +1,22 @@ -import 'polymer/polymer.html' -import 'paper-ripple/paper-ripple.html' -import 'iron-flex-layout/iron-flex-layout.html' -import 'shadycss/apply-shim.html' -import 'iron-icon/iron-icon.html' -import 'marked-element/marked-element.html' -import '../../fonts/devfest-fonts.html' -import './devfest-sponsors-page.html' -import '../../components/devfest-footer/devfest-footer.js' -import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js' -import marked from 'marked' -import firebaseConfig from '../../../../firebase.js' -import app from '../../../../app.js' -window.marked = window.marked || marked +import 'polymer/polymer.html'; +import 'paper-ripple/paper-ripple.html'; +import 'iron-flex-layout/iron-flex-layout.html'; +import 'shadycss/apply-shim.html'; +import 'iron-icon/iron-icon.html'; +import 'marked-element/marked-element.html'; +import '../../fonts/devfest-fonts.html'; +import './devfest-sponsors-page.html'; +import '../../components/devfest-footer/devfest-footer.js'; +import '../../components/devfest-button-only/devfest-button-only.js'; +import User from '../../models/user-model'; +import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js'; +import marked from 'marked'; +import app from '../../../../app.js'; +window.marked = window.marked || marked; +const {Polymer} = window; -class DevfestSponsorsPage extends contentLoaderMixin(Polymer.Element) { - static get is () { return 'devfest-sponsors-page' } +class DevfestSponsorsPage extends User(contentLoaderMixin(Polymer.Element)) { + static get is () { return 'devfest-sponsors-page'; } static get properties () { return { @@ -35,25 +37,24 @@ class DevfestSponsorsPage extends contentLoaderMixin(Polymer.Element) { type: Array, value: [] } - } + }; } constructor () { - super() - this._apiKey = firebaseConfig[0].apiKey - this._app = app + super(); + this._app = app; } connectedCallback () { - super.connectedCallback() - this.reload() + super.connectedCallback(); + this.reload(); } - reload() { - this._fetchContent('pages/sponsors.md') + reload () { + this._fetchContent('pages/sponsors.md'); } } -window.customElements.define(DevfestSponsorsPage.is, DevfestSponsorsPage) +window.customElements.define(DevfestSponsorsPage.is, DevfestSponsorsPage); -export default DevfestSponsorsPage \ No newline at end of file +export default DevfestSponsorsPage; diff --git a/src/modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.scss b/src/modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.scss index 5d77897..ef3b82f 100644 --- a/src/modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.scss +++ b/src/modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.scss @@ -16,6 +16,10 @@ @apply --layout-center; max-width: 1200px; margin: 0 auto; + + @media screen and (max-width: 500px) { + display: block; + } } .flex { @@ -65,4 +69,9 @@ .media-partners { max-width: 150px; min-width: 125px; +} + +.sponsor-question { + margin: 20px auto 60px; + max-width: 600px; } \ No newline at end of file diff --git a/src/modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.test.js b/src/modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.test.js new file mode 100644 index 0000000..296aeca --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.test.js @@ -0,0 +1,14 @@ +import { expect } from 'chai' +import page from './devfest-sponsors-page' + +describe('Devfest sponsors page', () => { + + it('should exist', () => { + expect(page).to.exist + }) + + it('should work', () => { + const el = document.createElement('devfest-sponsors-page') + expect(el.constructor.is).to.equal('devfest-sponsors-page') + }) +}) \ No newline at end of file diff --git a/src/modules/devfest-module/pages/devfest-tickets-page/devfest-tickets-page.js b/src/modules/devfest-module/pages/devfest-tickets-page/devfest-tickets-page.js index 3c3f500..0f7b822 100644 --- a/src/modules/devfest-module/pages/devfest-tickets-page/devfest-tickets-page.js +++ b/src/modules/devfest-module/pages/devfest-tickets-page/devfest-tickets-page.js @@ -1,20 +1,22 @@ -import 'polymer/polymer-element.html' -import 'polymer/lib/elements/dom-repeat.html' -import 'iron-icon/iron-icon.html' -import 'iron-flex-layout/iron-flex-layout.html' -import 'shadycss/apply-shim.html' -import 'marked-element/marked-element.html' -import '../../fonts/devfest-fonts.html' -import '../../icons/devfest-icons.html' -import '../../components/devfest-footer/devfest-footer.js' -import '../../components/devfest-button/devfest-button.js' -import './devfest-tickets-page.html' -import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js' -import marked from 'marked' -window.marked = window.marked || marked +import 'polymer/polymer-element.html'; +import 'polymer/lib/elements/dom-repeat.html'; +import 'iron-icon/iron-icon.html'; +import 'iron-flex-layout/iron-flex-layout.html'; +import 'shadycss/apply-shim.html'; +import 'marked-element/marked-element.html'; +import '../../fonts/devfest-fonts.html'; +import '../../icons/devfest-icons.html'; +import '../../components/devfest-footer/devfest-footer.js'; +import '../../components/devfest-button/devfest-button.js'; +import './devfest-tickets-page.html'; +import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js'; +import marked from 'marked'; +window.marked = window.marked || marked; + +const {Polymer} = window; class DevfestTicketsPage extends contentLoaderMixin(Polymer.Element) { - static get is () { return 'devfest-tickets-page' } + static get is () { return 'devfest-tickets-page'; } static get properties () { return { @@ -30,20 +32,20 @@ class DevfestTicketsPage extends contentLoaderMixin(Polymer.Element) { type: Array, value: [] } - } + }; } connectedCallback () { - super.connectedCallback() - this.reload() + super.connectedCallback(); + this.reload(); } - reload() { - this._fetchContent('pages/tickets.md') + reload () { + this._fetchContent('pages/tickets.md'); // this._fetchJson('speakers/speakers.json', 'speakers') } } -window.customElements.define(DevfestTicketsPage.is, DevfestTicketsPage) +window.customElements.define(DevfestTicketsPage.is, DevfestTicketsPage); -export default DevfestTicketsPage \ No newline at end of file +export default DevfestTicketsPage; diff --git a/src/modules/devfest-module/pages/devfest-tickets-page/devfest-tickets-page.test.js b/src/modules/devfest-module/pages/devfest-tickets-page/devfest-tickets-page.test.js new file mode 100644 index 0000000..6b1ee3e --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-tickets-page/devfest-tickets-page.test.js @@ -0,0 +1,14 @@ +import { expect } from 'chai' +import page from './devfest-tickets-page' + +describe('Devfest tickets page', () => { + + it('should exist', () => { + expect(page).to.exist + }) + + it('should work', () => { + const el = document.createElement('devfest-tickets-page') + expect(el.constructor.is).to.equal('devfest-tickets-page') + }) +}) \ No newline at end of file diff --git a/src/modules/devfest-module/pages/devfest-tnc-page/devfest-tnc-page.html b/src/modules/devfest-module/pages/devfest-tnc-page/devfest-tnc-page.html new file mode 100644 index 0000000..c654984 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-tnc-page/devfest-tnc-page.html @@ -0,0 +1,16 @@ + + + diff --git a/src/modules/devfest-module/pages/devfest-tnc-page/devfest-tnc-page.js b/src/modules/devfest-module/pages/devfest-tnc-page/devfest-tnc-page.js new file mode 100644 index 0000000..54e5ec8 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-tnc-page/devfest-tnc-page.js @@ -0,0 +1,51 @@ +import 'polymer/polymer-element.html'; +import 'polymer/lib/elements/dom-repeat.html'; +import 'iron-icon/iron-icon.html'; +import 'iron-flex-layout/iron-flex-layout.html'; +import 'shadycss/apply-shim.html'; +import 'marked-element/marked-element.html'; +import '../../fonts/devfest-fonts.html'; +import '../../icons/devfest-icons.html'; +import '../../components/devfest-footer/devfest-footer.js'; +import '../../components/devfest-button/devfest-button.js'; +import './devfest-tnc-page.html'; +import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js'; +import marked from 'marked'; +window.marked = window.marked || marked; + +const {Polymer} = window; + +class DevfestTncPage extends contentLoaderMixin(Polymer.Element) { + static get is () { return 'devfest-tnc-page'; } + + static get properties () { + return { + perks: { + type: Array, + value: [] + }, + details: { + type: Array, + value: [] + }, + payment: { + type: Array, + value: [] + } + }; + } + + connectedCallback () { + super.connectedCallback(); + this.reload(); + } + + reload () { + this._fetchContent('pages/tnc.md'); + // this._fetchJson('speakers/speakers.json', 'speakers') + } +} + +window.customElements.define(DevfestTncPage.is, DevfestTncPage); + +export default DevfestTncPage; diff --git a/src/modules/devfest-module/pages/devfest-tnc-page/devfest-tnc-page.scss b/src/modules/devfest-module/pages/devfest-tnc-page/devfest-tnc-page.scss new file mode 100644 index 0000000..d366ac3 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-tnc-page/devfest-tnc-page.scss @@ -0,0 +1,7 @@ +@import '../../styles/components/host.scss'; +@import '../../styles/components/typography.scss'; +@import '../../styles/components/section.scss'; + +.section { + text-align: left; +} diff --git a/src/modules/devfest-module/pages/devfest-verify-page/devfest-verify-page.html b/src/modules/devfest-module/pages/devfest-verify-page/devfest-verify-page.html new file mode 100644 index 0000000..74e4781 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-verify-page/devfest-verify-page.html @@ -0,0 +1,12 @@ + + + diff --git a/src/modules/devfest-module/pages/devfest-verify-page/devfest-verify-page.js b/src/modules/devfest-module/pages/devfest-verify-page/devfest-verify-page.js new file mode 100644 index 0000000..b43d120 --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-verify-page/devfest-verify-page.js @@ -0,0 +1,48 @@ +import 'polymer/polymer-element.html'; +import 'polymer/lib/elements/dom-repeat.html'; +import 'iron-icon/iron-icon.html'; +import 'iron-flex-layout/iron-flex-layout.html'; +import 'shadycss/apply-shim.html'; +import 'marked-element/marked-element.html'; +import '../../fonts/devfest-fonts.html'; +import '../../icons/devfest-icons.html'; +import '../../components/devfest-footer/devfest-footer.js'; +import '../../components/devfest-button/devfest-button.js'; +import './devfest-verify-page.html'; +import contentLoaderMixin from '../../../content-loader/content-loader-mixin.js'; +import marked from 'marked'; +window.marked = window.marked || marked; + +const {Polymer} = window; + +class DevfestVerifyPage extends contentLoaderMixin(Polymer.Element) { + static get is () { return 'devfest-verify-page'; } + + static get properties () { + return { + perks: { + type: Array, + value: [] + }, + details: { + type: Array, + value: [] + }, + payment: { + type: Array, + value: [] + } + }; + } + + connectedCallback () { + super.connectedCallback(); + this.reload(); + } + + reload () {} +} + +window.customElements.define(DevfestVerifyPage.is, DevfestVerifyPage); + +export default DevfestVerifyPage; diff --git a/src/modules/devfest-module/pages/devfest-verify-page/devfest-verify-page.scss b/src/modules/devfest-module/pages/devfest-verify-page/devfest-verify-page.scss new file mode 100644 index 0000000..4c50add --- /dev/null +++ b/src/modules/devfest-module/pages/devfest-verify-page/devfest-verify-page.scss @@ -0,0 +1,3 @@ +@import '../../styles/components/host.scss'; +@import '../../styles/components/typography.scss'; +@import '../../styles/components/section.scss'; diff --git a/src/modules/firebase/index.js b/src/modules/firebase/index.js new file mode 100644 index 0000000..11bd190 --- /dev/null +++ b/src/modules/firebase/index.js @@ -0,0 +1,135 @@ +let firebase = null; +const listeners = {}; +import(/* webpackChunkName: 'firebase' */ 'firebase').then(sdk => { + if (sdk) { + firebase = sdk; + } + window.firebase = sdk; +}); + +const updateAttrSnapshot = (store, attr, type, snapshot) => { + if (snapshot.exists()) { + setTimeout(() => { + store.dispatch({ + type, // USER_ACTION.PROFILE, + value: snapshot.val(), + attr + }); + }, 100); + } +}; + +const updateModelTypeSnapshot = (store, modelType, type, snapshot) => { + if (snapshot.exists()) { + const attrs = []; + snapshot.forEach(child => { + attrs.push({ + attr: child.key, + value: child.val() + }); + }); + setTimeout(() => { + store.dispatch({ + type, // USER_ACTION.PROFILE, + attrs + }); + }, 100); + } +}; + +export const firebaseRemoveListeners = () => { + for (var path in listeners) { + if (listeners[path]) { + listeners[path].off(); + listeners[path] = null; + } + } +}; + +export const firebaseDocumentLoader = (modelPath, key, action, store, profileModel, type) => { + // console.log(modelPath, key, action, profileModel, type) + const sourcePath = `${modelPath}/source/${key}`; + if (action.modelType) { + const modelType = `${sourcePath}/${action.modelType}`; + if (!action.attr) { + for (var i in profileModel) { + if (i === action.modelType) { + for (var j in profileModel[i]) { + if (listeners[modelType + '/' + j]) { + listeners[modelType + '/' + j].off(); + listeners[modelType + '/' + j] = null; + } + } + + listeners[modelType] = listeners[modelType] || firebase.database().ref(modelType); + listeners[modelType].on('value', updateModelTypeSnapshot.bind(this, store, action.modelType, type)); + break; + } + } + } else if (!listeners[modelType]) { + const attr = `${modelType}/${action.attr}`; + listeners[attr] = listeners[attr] || firebase.database().ref(attr); + listeners[attr].on('value', updateAttrSnapshot.bind(this, store, action.attr, type)); + } + } +}; + +export const updateFirebase = (updates) => { + return firebase.database().ref().update(updates); +}; + +export const login = (name) => { + var provider = null; + if (name === 'google') { + provider = new firebase.auth.GoogleAuthProvider(); + } else if (name === 'facebook') { + provider = new firebase.auth.FacebookAuthProvider(); + } else if (name === 'github') { + provider = new firebase.auth.GithubAuthProvider(); + // provider.addScope('repo'); + } + + return firebase.auth().signInWithPopup(provider); +}; + +export const link = (user, name) => { + var provider = null; + if (name === 'google') { + provider = new firebase.auth.GoogleAuthProvider(); + } else if (name === 'facebook') { + provider = new firebase.auth.FacebookAuthProvider(); + } else if (name === 'github') { + provider = new firebase.auth.GithubAuthProvider(); + // provider.addScope('repo'); + } + + return user.linkWithPopup(provider); +}; + +export const unlink = (user, name) => { + var provider = name + '.com'; + + return user.unlink(provider); +}; + +export const reloadUser = () => { + return firebase.auth().currentUser; +}; + +export const logout = () => { + return firebase.auth().signOut(); +}; + +export const observeAuth = (dispatch) => { + if (firebase) { + firebase.auth().onAuthStateChanged(dispatch); + } else if (window.firebase) { + window.firebase.auth().onAuthStateChanged(dispatch); + firebase = window.firebase; + } else { + window.addEventListener('firebase-initialized', event => { + firebase = window.firebase || event.detail; + firebase.auth().onAuthStateChanged(dispatch); + }); + } +}; diff --git a/src/routing.js b/src/routing.js index d21e5a3..7444c5f 100644 --- a/src/routing.js +++ b/src/routing.js @@ -8,6 +8,14 @@ '/sessions/:id': () => { return import(/* webpackChunkName: "devfest-session-page" */ './modules/devfest-module/pages/devfest-session-page/devfest-session-page.js') }, '/tickets': () => { return import(/* webpackChunkName: "devfest-tickets-page" */ './modules/devfest-module/pages/devfest-tickets-page/devfest-tickets-page.js') }, '/sponsors': () => { return import(/* webpackChunkName: "devfest-sponsors-page" */ './modules/devfest-module/pages/devfest-sponsors-page/devfest-sponsors-page.js') }, +'/tnc': () => { return import(/* webpackChunkName: "devfest-tnc-page" */ './modules/devfest-module/pages/devfest-tnc-page/devfest-tnc-page.js') }, +'/login': () => { return import(/* webpackChunkName: "devfest-login-page" */ './modules/devfest-module/pages/devfest-login-page/devfest-login-page.js') }, +'/profile': () => { return import(/* webpackChunkName: "devfest-profile-page" */ './modules/devfest-module/pages/devfest-profile-page/devfest-profile-page.js') }, +'/codelabs/:type?/:id?/:page?': () => { return import(/* webpackChunkName: "devfest-codelabs-page" */ './modules/devfest-module/pages/devfest-codelabs-page/devfest-codelabs-page.js') }, +'/connect-ticket': () => { return import(/* webpackChunkName: "devfest-connect-page" */ './modules/devfest-module/pages/devfest-connect-page/devfest-connect-page.js') }, +'/scan': () => { return import(/* webpackChunkName: "devfest-scan-page" */ './modules/devfest-module/pages/devfest-scan-page/devfest-scan-page.js') }, +'/scanned-list': () => { return import(/* webpackChunkName: "devfest-scanned-list-page" */ './modules/devfest-module/pages/devfest-scanned-list-page/devfest-scanned-list-page.js') }, +'/are-you-a-sponsor': () => { return import(/* webpackChunkName: "devfest-not-sponsor-page" */ './modules/devfest-module/pages/devfest-not-sponsor-page/devfest-not-sponsor-page.js') }, '/auth-check': () => { return import(/* webpackChunkName: "devfest-authorized-page" */ './modules/devfest-module/pages/devfest-authorized-page/devfest-authorized-page.js') } } \ No newline at end of file diff --git a/storage.rules b/storage.rules new file mode 100644 index 0000000..d494542 --- /dev/null +++ b/storage.rules @@ -0,0 +1,7 @@ +service firebase.storage { + match /b/{bucket}/o { + match /{allPaths=**} { + allow read, write: if request.auth!=null; + } + } +} diff --git a/yarn.lock b/yarn.lock index 9de0760..861f84d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,20 +2,42 @@ # yarn lockfile v1 +"@firebase/webchannel-wrapper@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.1.tgz#2c4dbc15edd1de4f656d543a6f512ded7978ef72" + abbrev@1: version "1.1.0" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" -ajv@^4.9.1: +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@5.1.2, acorn@^3.0.4, acorn@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" + +ajv-keywords@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" + +ajv@^4.7.0, ajv@^4.9.1: version "4.11.8" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" dependencies: co "^4.6.0" json-stable-stringify "^1.0.1" -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@3.0.0, ansi-regex@^2.0.0, ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" ansi-styles@^2.2.1: version "2.2.1" @@ -32,10 +54,37 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + argsarray@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/argsarray/-/argsarray-0.0.1.tgz#6e7207b4ecdb39b0af88303fa5ae22bda8df61cb" +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array.prototype.find@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c08648323ddaeb9de9d14bc1864c90" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" @@ -56,7 +105,7 @@ aws4@^1.2.1: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: +babel-code-frame@^6.16.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: @@ -489,6 +538,10 @@ balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" +base64url@2.0.0, base64url@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64url/-/base64url-2.0.0.tgz#eac16e03ea1438eff9423d69baa36262ed1f70bb" + bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" @@ -521,6 +574,24 @@ browserslist@^2.1.2: caniuse-lite "^1.0.30000718" electron-to-chromium "^1.3.18" +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + +builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + caniuse-lite@^1.0.30000718: version "1.0.30000726" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000726.tgz#966a753fa107a09d4131cf8b3d616723a06ccf7e" @@ -529,7 +600,7 @@ caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" -chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -539,6 +610,20 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + +cli-cursor@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + dependencies: + restore-cursor "^1.0.1" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -557,10 +642,22 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" +concat-stream@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + core-js@^2.4.0: version "2.5.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" @@ -575,15 +672,25 @@ cryptiles@2.x.x: dependencies: boom "2.x.x" +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" dependencies: assert-plus "^1.0.0" -debug@^2.2.0, debug@^2.6.8: - version "2.6.8" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" +debug-log@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" + +debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" @@ -595,6 +702,10 @@ deep-extend@~0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + define-properties@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" @@ -606,6 +717,29 @@ defined@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" +deglob@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/deglob/-/deglob-2.1.0.tgz#4d44abe16ef32c779b4972bd141a80325029a14a" + dependencies: + find-root "^1.0.0" + glob "^7.0.5" + ignore "^3.0.9" + pkg-config "^1.1.0" + run-parallel "^1.1.2" + uniq "^1.0.1" + +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -614,6 +748,13 @@ delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" +doctrine@1.5.0, doctrine@2.0.0, doctrine@^1.2.2, doctrine@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + dom-serializer@0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" @@ -621,6 +762,14 @@ dom-serializer@0: domelementtype "~1.1.1" entities "~1.1.1" +dom-storage@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dom-storage/-/dom-storage-2.0.2.tgz#ed17cbf68abd10e0aef8182713e297c5e4b500b0" + +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + domelementtype@1, domelementtype@1.3.0, domelementtype@^1.3.0, domelementtype@~1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" @@ -644,6 +793,13 @@ ecc-jsbn@~0.1.1: dependencies: jsbn "~0.1.0" +ecdsa-sig-formatter@1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz#4bc926274ec3b5abb5016e7e1d60921ac262b2a1" + dependencies: + base64url "^2.0.0" + safe-buffer "^5.0.1" + electron-to-chromium@^1.3.18: version "1.3.21" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.21.tgz#a967ebdcfe8ed0083fc244d1894022a8e8113ea2" @@ -652,9 +808,15 @@ entities@^1.1.1, entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" -es-abstract@^1.5.0: - version "1.8.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.8.2.tgz#25103263dc4decbda60e0c737ca32313518027ee" +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +es-abstract@1.9.0, es-abstract@^1.5.0, es-abstract@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.9.0.tgz#690829a07cae36b222e7fd9b75c0d0573eb25227" dependencies: es-to-primitive "^1.1.1" function-bind "^1.1.1" @@ -670,10 +832,98 @@ es-to-primitive@^1.1.1: is-date-object "^1.0.1" is-symbol "^1.0.1" -escape-string-regexp@^1.0.2: +es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.31" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.31.tgz#7bb938c95a7f1b9f728092dc09c41edcc398eefe" + dependencies: + es6-iterator "~2.0.1" + es6-symbol "~3.1.1" + +es6-iterator@^2.0.1, es6-iterator@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-symbol "^3.1" + +es6-map@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-config-semistandard@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-semistandard/-/eslint-config-semistandard-11.0.0.tgz#44eef7cfdfd47219e3a7b81b91b540e880bb2615" + +eslint-config-standard-jsx@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-4.0.1.tgz#cd4e463d0268e2d9e707f61f42f73f5b3333c642" + +eslint-config-standard@^10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz#c061e4d066f379dc17cd562c64e819b4dd454591" + +eslint-import-resolver-node@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz#5add8106e8c928db2cba232bcd9efa846e3da16c" + dependencies: + debug "^2.2.0" + object-assign "^4.0.1" + resolve "^1.1.6" + +eslint-module-utils@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz#abaec824177613b8a95b299639e1b6facf473449" + dependencies: + debug "^2.6.8" + pkg-dir "^1.0.0" + eslint-plugin-html@^3.2.0: version "3.2.1" resolved "https://registry.yarnpkg.com/eslint-plugin-html/-/eslint-plugin-html-3.2.1.tgz#4289d38245f3d95134d22c17b1894d78db92c572" @@ -681,10 +931,132 @@ eslint-plugin-html@^3.2.0: htmlparser2 "^3.8.2" semver "^5.4.1" +eslint-plugin-import@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz#72ba306fad305d67c4816348a4699a4229ac8b4e" + dependencies: + builtin-modules "^1.1.1" + contains-path "^0.1.0" + debug "^2.2.0" + doctrine "1.5.0" + eslint-import-resolver-node "^0.2.0" + eslint-module-utils "^2.0.0" + has "^1.0.1" + lodash.cond "^4.3.0" + minimatch "^3.0.3" + pkg-up "^1.0.0" + +eslint-plugin-node@~4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-4.2.3.tgz#c04390ab8dbcbb6887174023d6f3a72769e63b97" + dependencies: + ignore "^3.0.11" + minimatch "^3.0.2" + object-assign "^4.0.1" + resolve "^1.1.7" + semver "5.3.0" + +eslint-plugin-promise@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.5.0.tgz#78fbb6ffe047201627569e85a6c5373af2a68fca" + +eslint-plugin-react@~6.10.0: + version "6.10.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz#c5435beb06774e12c7db2f6abaddcbf900cd3f78" + dependencies: + array.prototype.find "^2.0.1" + doctrine "^1.2.2" + has "^1.0.1" + jsx-ast-utils "^1.3.4" + object.assign "^4.0.4" + +eslint-plugin-standard@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz#34d0c915b45edc6f010393c7eef3823b08565cf2" + +eslint@~3.19.0: + version "3.19.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" + dependencies: + babel-code-frame "^6.16.0" + chalk "^1.1.3" + concat-stream "^1.5.2" + debug "^2.1.1" + doctrine "^2.0.0" + escope "^3.6.0" + espree "^3.4.0" + esquery "^1.0.0" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + glob "^7.0.3" + globals "^9.14.0" + ignore "^3.2.0" + imurmurhash "^0.1.4" + inquirer "^0.12.0" + is-my-json-valid "^2.10.0" + is-resolvable "^1.0.0" + js-yaml "^3.5.1" + json-stable-stringify "^1.0.0" + levn "^0.3.0" + lodash "^4.0.0" + mkdirp "^0.5.0" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.1" + pluralize "^1.2.1" + progress "^1.1.8" + require-uncached "^1.0.2" + shelljs "^0.7.5" + strip-bom "^3.0.0" + strip-json-comments "~2.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + +espree@^3.4.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.1.tgz#0c988b8ab46db53100a1954ae4ba995ddd27d87e" + dependencies: + acorn "^5.1.1" + acorn-jsx "^3.0.0" + +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +esquery@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + dependencies: + estraverse "^4.1.0" + object-assign "^4.0.1" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + dependencies: + d "1" + es5-ext "~0.10.14" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + extend@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" @@ -693,6 +1065,60 @@ extsprintf@1.3.0, extsprintf@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +faye-websocket@0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.9.3.tgz#482a505b0df0ae626b969866d3bd740cdb962e83" + dependencies: + websocket-driver ">=0.5.1" + +figures@^1.3.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +find-root@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + +find-up@2.1.0, find-up@^1.0.0, find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +firebase@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/firebase/-/firebase-4.5.0.tgz#e0973a9803b74c4c9d73d19f874712e6e9d16ba7" + dependencies: + "@firebase/webchannel-wrapper" "^0.2.1" + dom-storage "^2.0.2" + faye-websocket "0.9.3" + jsonwebtoken "^7.3.0" + promise-polyfill "^6.0.2" + xmlhttprequest "^1.8.0" + +flat-cache@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + for-each@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" @@ -744,7 +1170,7 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: mkdirp ">=0.5 0" rimraf "2" -function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.0: +function-bind@^1.0.2, function-bind@^1.1.0, function-bind@^1.1.1, function-bind@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -761,13 +1187,27 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-stdin@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" dependencies: assert-plus "^1.0.0" -glob@^7.0.5, glob@^7.1.1, glob@~7.1.2: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@~7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -778,10 +1218,28 @@ glob@^7.0.5, glob@^7.1.1, glob@~7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^9.18.0: +global@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + dependencies: + min-document "^2.19.0" + process "~0.5.1" + +globals@^9.14.0, globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -837,6 +1295,10 @@ htmlparser2@^3.8.2: inherits "^2.0.1" readable-stream "^2.0.2" +http-parser-js@>=0.4.0: + version "0.4.9" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.9.tgz#ea1a04fb64adff0242e9974f297dd4c3cad271e1" + http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" @@ -845,10 +1307,18 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" +ignore@^3.0.11, ignore@^3.0.9, ignore@^3.2.0: + version "3.3.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6" + immediate@^3.2.2: version "3.2.3" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + indexeddbshim@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/indexeddbshim/-/indexeddbshim-3.0.4.tgz#b4d9a4fb3fce7532b66e19790a15692f9b2c7b56" @@ -863,7 +1333,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -871,6 +1341,28 @@ ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" +inquirer@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" + dependencies: + ansi-escapes "^1.1.0" + ansi-regex "^2.0.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + figures "^1.3.5" + lodash "^4.3.0" + readline2 "^1.0.1" + run-async "^0.1.0" + rx-lite "^3.1.2" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + +interpret@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0" + intersection-observer@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.4.2.tgz#24100ed620baf6a427072996d4d73366e9ec93ef" @@ -881,6 +1373,10 @@ invariant@^2.2.2: dependencies: loose-envify "^1.0.0" +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + is-callable@^1.1.1, is-callable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" @@ -889,22 +1385,55 @@ is-date-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" +is-fullwidth-code-point@2.0.0, is-fullwidth-code-point@^1.0.0, is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" is-function@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" +is-my-json-valid@^2.10.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz#5a846777e2c2620d1e69104e5d3a03b1f6088f11" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" dependencies: has "^1.0.1" +is-resolvable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" + dependencies: + tryit "^1.0.1" + is-symbol@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" @@ -913,18 +1442,38 @@ is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" -isarray@0.0.1, isarray@1.0.0, isarray@~1.0.0: +isarray@0.0.1, isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" +isemail@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-1.2.0.tgz#be03df8cc3e29de4d2c5df6501263f1fa4595e9a" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" +joi@^6.10.1: + version "6.10.1" + resolved "https://registry.yarnpkg.com/joi/-/joi-6.10.1.tgz#4d50c318079122000fe5f16af1ff8e1917b77e06" + dependencies: + hoek "2.x.x" + isemail "1.x.x" + moment "2.x.x" + topo "1.x.x" + js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" +js-yaml@^3.5.1: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -937,7 +1486,7 @@ json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" -json-stable-stringify@^1.0.1: +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" dependencies: @@ -957,6 +1506,20 @@ jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" +jsonpointer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + +jsonwebtoken@^7.3.0: + version "7.4.3" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz#77f5021de058b605a1783fa1283e99812e645638" + dependencies: + joi "^6.10.1" + jws "^3.1.4" + lodash.once "^4.0.0" + ms "^2.0.0" + xtend "^4.0.1" + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -966,6 +1529,50 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jsx-ast-utils@^1.3.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" + +jwa@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.5.tgz#a0552ce0220742cd52e153774a32905c30e756e5" + dependencies: + base64url "2.0.0" + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.9" + safe-buffer "^5.0.1" + +jws@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.4.tgz#f9e8b9338e8a847277d6444b1464f61880e050a2" + dependencies: + base64url "^2.0.0" + jwa "^1.1.4" + safe-buffer "^5.0.1" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + lodash-es@^4.2.1: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7" @@ -974,6 +1581,14 @@ lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" +lodash.cond@^4.3.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + lodash.template@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" @@ -987,7 +1602,7 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "~3.0.0" -lodash@^4.17.4, lodash@^4.2.1: +lodash@^4.0.0, lodash@^4.17.4, lodash@^4.2.1, lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -1001,6 +1616,10 @@ marked@^0.3.6: version "0.3.6" resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" +md-gum-polyfill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/md-gum-polyfill/-/md-gum-polyfill-1.0.0.tgz#829a512d25ed0318c0c49a961048b505f670a2db" + mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" @@ -1011,30 +1630,48 @@ mime-types@^2.1.12, mime-types@~2.1.7: dependencies: mime-db "~1.30.0" -minimatch@^3.0.0, minimatch@^3.0.4: +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + dependencies: + dom-walk "^0.1.0" + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: brace-expansion "^1.1.7" -minimist@0.0.8, minimist@1.2.0, minimist@^1.2.0, minimist@~1.2.0: +minimist@0.0.8, minimist@1.2.0, minimist@^1.1.0, minimist@^1.2.0, minimist@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -"mkdirp@>=0.5 0", mkdirp@^0.5.1: +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" -ms@2.0.0: +moment@2.x.x: + version "2.18.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" + +ms@2.0.0, ms@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" +mute-stream@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" + nan@~2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + node-pre-gyp@~0.6.36: version "0.6.37" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.37.tgz#3c872b236b2e266e4140578fe1ee88f693323a05" @@ -1078,7 +1715,7 @@ oauth-sign@~0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" -object-assign@^4.1.0: +object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -1086,16 +1723,39 @@ object-inspect@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.3.0.tgz#5b1eb8e6742e2ee83342a637034d844928ba2f6d" -object-keys@^1.0.8: +object-keys@^1.0.10, object-keys@^1.0.8: version "1.0.11" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" +object.assign@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.0.4.tgz#b1c9cc044ef1b9fe63606fc141abbb32e14730cc" + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.0" + object-keys "^1.0.10" + once@^1.3.0, once@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: wrappy "1" +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + +optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -1111,10 +1771,34 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +path-exists@3.0.0, path-exists@^2.0.0, path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" @@ -1129,10 +1813,59 @@ performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-conf@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.0.0.tgz#071c87650403bccfb9c627f58751bfe47c067279" + dependencies: + find-up "^2.0.0" + load-json-file "^2.0.0" + +pkg-config@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pkg-config/-/pkg-config-1.1.1.tgz#557ef22d73da3c8837107766c52eadabde298fe4" + dependencies: + debug-log "^1.0.0" + find-root "^1.0.0" + xtend "^4.0.1" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + dependencies: + find-up "^1.0.0" + +pkg-up@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" + dependencies: + find-up "^1.0.0" + +pluralize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + pouchdb-collections@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/pouchdb-collections/-/pouchdb-collections-1.0.1.tgz#fe63a17da977611abef7cb8026cb1a9553fd8359" +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + private@^0.1.6: version "0.1.7" resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" @@ -1141,10 +1874,26 @@ process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +promise-polyfill@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-6.0.2.tgz#d9c86d3dc4dc2df9016e88946defd69b49b41162" + punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" +qrcode-reader@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/qrcode-reader/-/qrcode-reader-1.0.3.tgz#42985ac4751c134e056132e250970d69795d138c" + qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" @@ -1158,7 +1907,7 @@ rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: +readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -1170,6 +1919,20 @@ readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: string_decoder "~1.0.3" util-deprecate "~1.0.1" +readline2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + mute-stream "0.0.5" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + redux@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" @@ -1240,29 +2003,76 @@ request@^2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" -resolve@~1.4.0: +require-uncached@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve@^1.1.6, resolve@^1.1.7, resolve@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" dependencies: path-parse "^1.0.5" +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + resumer@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" dependencies: through "~2.3.4" -rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" +rimraf@2, rimraf@2.6.2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: glob "^7.0.5" +run-async@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" + dependencies: + once "^1.3.0" + +run-parallel@^1.1.2: + version "1.1.6" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.6.tgz#29003c9a2163e01e2d2dfc90575f2c6c1d61a039" + +rx-lite@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" + safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" -semver@^5.3.0, semver@^5.4.1: +semistandard@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/semistandard/-/semistandard-11.0.0.tgz#d2d9fc8ac393de21312195e006e50c8861391c47" + dependencies: + eslint "~3.19.0" + eslint-config-semistandard "^11.0.0" + eslint-config-standard "^10.2.1" + eslint-config-standard-jsx "4.0.1" + eslint-plugin-import "~2.2.0" + eslint-plugin-node "~4.2.2" + eslint-plugin-promise "~3.5.0" + eslint-plugin-react "~6.10.0" + eslint-plugin-standard "~3.0.1" + standard-engine "~7.0.0" + +semver@5.3.0, semver@5.4.1, semver@^5.3.0, semver@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" @@ -1270,16 +2080,32 @@ set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" +shelljs@^0.7.5: + version "0.7.8" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + signal-exit@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" dependencies: hoek "2.x.x" +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + sqlite3@^3.1.3: version "3.1.9" resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-3.1.9.tgz#b2e7fbaa348380318d3834323918c3c351b8bf18" @@ -1301,13 +2127,21 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" -string-width@^1.0.1, string-width@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" +standard-engine@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-7.0.0.tgz#ebb77b9c8fc2c8165ffa353bd91ba0dff41af690" dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" + deglob "^2.1.0" + get-stdin "^5.0.1" + minimist "^1.1.0" + pkg-conf "^2.0.0" + +string-width@2.1.1, string-width@^1.0.1, string-width@^1.0.2, string-width@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" string.prototype.trim@~1.1.2: version "1.1.2" @@ -1327,11 +2161,15 @@ stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" +strip-ansi@4.0.0, strip-ansi@^3.0.0, strip-ansi@^3.0.1, strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" dependencies: - ansi-regex "^2.0.0" + ansi-regex "^3.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" strip-json-comments@~2.0.1: version "2.0.1" @@ -1345,6 +2183,17 @@ symbol-observable@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" +table@^3.7.8: + version "3.8.3" + resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" + dependencies: + ajv "^4.7.0" + ajv-keywords "^1.0.0" + chalk "^1.1.1" + lodash "^4.0.0" + slice-ansi "0.0.4" + string-width "^2.0.0" + tape@^4.6.3: version "4.8.0" resolved "https://registry.yarnpkg.com/tape/-/tape-4.8.0.tgz#f6a9fec41cc50a1de50fa33603ab580991f6068e" @@ -1384,7 +2233,11 @@ tar@^2.2.1: fstream "^1.0.2" inherits "2" -through@~2.3.4, through@~2.3.8: +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +through@^2.3.6, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -1396,12 +2249,22 @@ to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" +topo@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/topo/-/topo-1.1.0.tgz#e9d751615d1bb87dc865db182fa1ca0a5ef536d5" + dependencies: + hoek "2.x.x" + tough-cookie@~2.3.0: version "2.3.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" dependencies: punycode "^1.4.1" +tryit@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -1412,14 +2275,34 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + universalify@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" +user-home@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" + dependencies: + os-homedir "^1.0.0" + util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -1436,6 +2319,17 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +websocket-driver@>=0.5.1: + version "0.7.0" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + dependencies: + http-parser-js ">=0.4.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.2.tgz#0e18781de629a18308ce1481650f67ffa2693a5d" + "websql@https://github.com/brettz9/node-websql#configurable": version "0.4.4" resolved "https://github.com/brettz9/node-websql#c9828a34c92eced64858fc19151ec099fd60e8dd" @@ -1453,6 +2347,10 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2" +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + workbox-build@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-2.0.0.tgz#3f3b3591dcab71c39a64be1dce7445f0190acb72" @@ -1475,3 +2373,17 @@ workbox-sw@2.0.1, workbox-sw@^1.1.0, workbox-sw@^2.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + +xmlhttprequest@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" + +xtend@^4.0.0, xtend@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"