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 @@
-
-
-
-
-
-
-
-
-
-
- [[action]]
-
-
-
-
-
-
-
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}}
-
-
-
-
- Please enable JavaScript to view this website.
-
-
-
-
-
-
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 @@
-
-
-
-
-
-
-
-
- GDG Philippines
-
-
-
-
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 @@
-
-
-
-
-
-
-
-
-
-
- Speaker Perks
-
- Selected Speakers will be given the following perks:
-
-
-
-
-
- Topic Proposal Guidelines
-
-
- Your topic proposal can fall into one of the categories:
-
-
-
- [[item.category]]
-
-
-
-
-
- Topic for the conference should fall into one of the key topics below:
-
-
-
- [[main.topic]]
-
-
- [[topic.topic]]
-
-
- [[subtopic.topic]]
-
-
-
-
-
-
-
-
-
-
- Topic Submission will be a single-speaker session only. Click below to submit your proposal:
-
-
-
- Call for Speakers
-
-
-
- Important dates to remember
-
- Please be reminded of these important dates in submitting your proposal.
-
-
-
-
-
-
-
-
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 %>>
+ <<%= node %> route="<%= i %>" <% if (htmlWebpackPlugin.options.config.routing[i].auth) { %> auth="<%= htmlWebpackPlugin.options.config.routing[i].auth %>" <% } %>><%= node %>>
<% } %>
<% for (var i in htmlWebpackPlugin.options.config.httpCodes) { var node = htmlWebpackPlugin.options.config.httpCodes[i].name || htmlWebpackPlugin.options.config.httpCodes[i] %>
<<%= node %> route="<%= i %>"><%= node %>>
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Submit your Project
+
+ To get points, make sure you have connected your Github account and submit your Github repo by typing the repo name here:
+ (If your repo is in https://github.com/[account-name]/my-repo, then you'll need to put "my-repo" without the double-quotations).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ [[title]]
+
+
+
+
+
+
+
+
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 @@
[[item.text]]
+
+
+ Codelabs
+ Profile
+ Logout
+
+
+
+ Login
+
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 @@
[[item.text]]
+
+
+ Codelabs
+ Profile
+ Logout
+
+
+
+ Login
+
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 @@
+
+
+
+
+
+
+
+
Welcome to Codelabs!
+
+ GDG Devfest 2017 Codelabs is a curated list of a guided, tutorial, hands-on coding experience handpicked by volunteers from the Google Developers Codelabs.
+ Most codelabs will step you through the process of building a small application, or adding a new feature to an existing application.
+ Connect your Github account , if you haven't, to be eligible to our raffle at the end of the event.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+ You need a camera for this: (might not work for iPhone/iOS users)...
+ Scan the ticket here:
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+ Please register/login using any of your accounts below.
+ (Please note if you are playing for the codelabs activity, your Github account is needed. You can still link other accounts later)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
[[profile.displayName]]
+
+
+
+ Score: [[profile.score]]
+
+
+
+
+
+ Link Accounts
+
+
+
+
+
+
+
+
+ [[_getProviderName(item.providerId)]]
+
+
+
+
+
+
+
+ Unlink Accounts
+
+ Note: Unlinking your Github account will reset your score.
+
+
+
+
+
+
+
+
+
+ [[_getProviderName(item.providerId)]]
+
+
+
+
+
+
+
+ Link Ticket
+
+ Connect your ticket to qualify to the codelabs contest and to join to the event raffle.
+
+
+ By connecting your ticket, you agree to the terms and conditions.
+
+
+
+ Link your Eventbrite Ticket
+
+
+
+
+
+ Ticket Connected
+
+
+ Ticket#: [[profile.ticketNumber]]
+ Name: [[profile.ticketName]]
+ Email: [[profile.ticketEmail]]
+
+
+
+ If your name and email is different from the one above, you may have scanned a wrong ticket. You can rescan it here.
+
+
+
+ Rescan you eventbrite ticket.
+
+
+
+
+ Disconnect Ticket.
+
+
+
+
+
+
+ Welcome Sponsor!
+
+
+
+ Go to Sponsor page
+
+
+
+
+
+
+
+
+
+
+
+ Are you sure you want to disconnect your ticket from your account? (You will not be eligible to be part of the raffle prizes and will reset your score)
+
+
+
+ Disconnect Ticket.
+
+
+
+ Cancel
+
+
+
+
+
+
+
+ Are you sure you want to unlink [[_unlinkId]] from your account? (You will not be eligible to be part of the raffle prizes and will reset your score)
+
+
+
+ Disconnect [[_unlinkId]]
+
+
+
+ Cancel
+
+
+
+
+
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 @@
+
+
+
+
+
+
+ You need a camera for this: (might not work for iPhone/iOS users)...
+ Scan the ticket here:
+
+
+
+
+
+
+
+
+ Go back
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+ List for attendees scanned by: [[profile.sponsorId]]
+
+
+
+
+
+ Name
+
+
+ Email
+
+
+ Scanned by
+
+
+ Scanned date
+
+
+
+
+
+
+
+ [[item.displayName]]
+
+
+ [[item.email]]
+
+
+ [[item.scannedBy]]
+
+
+ [[_renderDate(item.dateScanned)]]
+
+
+
+
+
+
+
+
+ Go back
+
+
+
+
+
+
+
+
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 @@
[[_getSpeaker(session.session, sessions, speakers)]]
+
+ Room: [[session.room]]
+
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 @@