├── .eslintignore ├── .npmrc ├── .stylelintrc ├── src ├── favicon_source.png ├── _static │ ├── meta │ │ ├── favicon.ico │ │ ├── coast-228x228.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── mstile-70x70.png │ │ ├── mstile-144x144.png │ │ ├── mstile-150x150.png │ │ ├── mstile-310x150.png │ │ ├── mstile-310x310.png │ │ ├── apple-touch-icon.png │ │ ├── firefox_app_60x60.png │ │ ├── android-chrome-36x36.png │ │ ├── android-chrome-48x48.png │ │ ├── android-chrome-72x72.png │ │ ├── android-chrome-96x96.png │ │ ├── firefox_app_128x128.png │ │ ├── firefox_app_512x512.png │ │ ├── yandex-browser-50x50.png │ │ ├── android-chrome-144x144.png │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-256x256.png │ │ ├── android-chrome-384x384.png │ │ ├── android-chrome-512x512.png │ │ ├── apple-touch-icon-57x57.png │ │ ├── apple-touch-icon-60x60.png │ │ ├── apple-touch-icon-72x72.png │ │ ├── apple-touch-icon-76x76.png │ │ ├── apple-touch-icon-114x114.png │ │ ├── apple-touch-icon-120x120.png │ │ ├── apple-touch-icon-144x144.png │ │ ├── apple-touch-icon-152x152.png │ │ ├── apple-touch-icon-167x167.png │ │ ├── apple-touch-icon-180x180.png │ │ ├── apple-touch-icon-precomposed.png │ │ ├── apple-touch-startup-image-320x460.png │ │ ├── apple-touch-startup-image-640x920.png │ │ ├── apple-touch-startup-image-1182x2208.png │ │ ├── apple-touch-startup-image-1242x2148.png │ │ ├── apple-touch-startup-image-1496x2048.png │ │ ├── apple-touch-startup-image-1536x2008.png │ │ ├── apple-touch-startup-image-640x1096.png │ │ ├── apple-touch-startup-image-748x1024.png │ │ ├── apple-touch-startup-image-750x1294.png │ │ ├── apple-touch-startup-image-768x1004.png │ │ ├── yandex-browser-manifest.json │ │ ├── manifest.webapp │ │ ├── browserconfig.xml │ │ ├── manifest.json │ │ └── head_meta.html │ ├── sounds │ │ ├── card.mp3 │ │ ├── card.ogg │ │ ├── hover.mp3 │ │ ├── hover.ogg │ │ ├── tick.mp3 │ │ └── tick.ogg │ ├── robots.txt │ ├── humans.txt │ └── index.html ├── view │ ├── icons │ │ ├── done.svg │ │ ├── dashboard.svg │ │ ├── pay.svg │ │ ├── logout.svg │ │ ├── group.svg │ │ ├── plugin.svg │ │ ├── tasks_ok.svg │ │ ├── tasks.svg │ │ └── settings.svg │ ├── components │ │ ├── utils │ │ │ ├── raw.tag │ │ │ ├── icon.tag │ │ │ └── lang.tag │ │ ├── screens │ │ │ ├── dashboard.tag │ │ │ ├── settings.tag │ │ │ └── groups.tag │ │ ├── topbar.tag │ │ ├── app.tag │ │ ├── drawer │ │ │ ├── swipe.js │ │ │ └── drawer.tag │ │ └── misc │ │ │ └── spinner.tag │ ├── styles │ │ ├── base.less │ │ ├── components │ │ │ ├── groups.less │ │ │ └── drawer.less │ │ ├── ripple.less │ │ ├── reset │ │ │ ├── reset.less │ │ │ └── reset-reset.less │ │ └── app.less │ ├── sounds.js │ └── app.view.js ├── index.SW.js ├── model │ ├── ServiceWorker │ │ ├── background.sw.js │ │ ├── push.sw.js │ │ ├── cache.sw.js │ │ └── SW.js │ └── demo.api.js ├── index.web.js ├── index.html └── favicon_source.svg ├── scripts ├── tools │ ├── metainfo │ │ ├── .gitignore │ │ ├── package.json │ │ ├── generate.js │ │ └── config.js │ ├── deploy_firebase │ │ ├── .firebaserc │ │ ├── .gitignore │ │ ├── firebase.json │ │ ├── deploy.sh │ │ └── package.json │ ├── deploy_ssh │ │ ├── .gitignore │ │ ├── package.json │ │ ├── index.js │ │ └── yarn.lock │ └── deploy_ipfs │ │ ├── .gitignore │ │ ├── docker-compose.yml │ │ ├── package.json │ │ └── index.js └── webpack │ ├── sourceMap.js │ ├── devserver.js │ ├── js.lint.js │ ├── less.lint.js │ ├── env.js │ ├── images.js │ ├── riot.js │ ├── css.js │ ├── babel.js │ ├── favicon.js │ ├── minify.js │ └── config.js ├── .codeclimate.yml ├── .travis.yml ├── .flowconfig ├── .env ├── .env.production ├── .gitignore ├── .editorconfig ├── firebase.json ├── .eslintrc.js ├── LICENSE ├── README.md └── package.json /.eslintignore: -------------------------------------------------------------------------------- 1 | dist/* 2 | src/index.html -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | prefer-offline=true 2 | save-exact=true 3 | package-lock=true 4 | -------------------------------------------------------------------------------- /.stylelintrc: -------------------------------------------------------------------------------- 1 | { 2 | "syntax":"less", 3 | "rules": { 4 | 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/favicon_source.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/favicon_source.png -------------------------------------------------------------------------------- /scripts/tools/metainfo/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | 3 | package-lock.json 4 | npm-debug.log 5 | yarn-error.log -------------------------------------------------------------------------------- /scripts/tools/deploy_firebase/.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "survay-3eb6c" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /src/_static/meta/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/favicon.ico -------------------------------------------------------------------------------- /src/_static/sounds/card.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/sounds/card.mp3 -------------------------------------------------------------------------------- /src/_static/sounds/card.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/sounds/card.ogg -------------------------------------------------------------------------------- /src/_static/sounds/hover.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/sounds/hover.mp3 -------------------------------------------------------------------------------- /src/_static/sounds/hover.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/sounds/hover.ogg -------------------------------------------------------------------------------- /src/_static/sounds/tick.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/sounds/tick.mp3 -------------------------------------------------------------------------------- /src/_static/sounds/tick.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/sounds/tick.ogg -------------------------------------------------------------------------------- /src/_static/robots.txt: -------------------------------------------------------------------------------- 1 | # www.robotstxt.org/ 2 | 3 | # Allow crawling of all content 4 | User-agent: * 5 | Disallow: 6 | -------------------------------------------------------------------------------- /scripts/webpack/sourceMap.js: -------------------------------------------------------------------------------- 1 | module.exports = function () { 2 | return { 3 | devtool: 'eval-sourcemap' 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /src/_static/meta/coast-228x228.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/coast-228x228.png -------------------------------------------------------------------------------- /src/_static/meta/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/favicon-16x16.png -------------------------------------------------------------------------------- /src/_static/meta/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/favicon-32x32.png -------------------------------------------------------------------------------- /src/_static/meta/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/mstile-70x70.png -------------------------------------------------------------------------------- /scripts/tools/deploy_ssh/.gitignore: -------------------------------------------------------------------------------- 1 | config.js 2 | 3 | /node_modules 4 | 5 | package-lock.json 6 | npm-debug.log 7 | yarn-error.log -------------------------------------------------------------------------------- /src/_static/meta/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/mstile-144x144.png -------------------------------------------------------------------------------- /src/_static/meta/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/mstile-150x150.png -------------------------------------------------------------------------------- /src/_static/meta/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/mstile-310x150.png -------------------------------------------------------------------------------- /src/_static/meta/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/mstile-310x310.png -------------------------------------------------------------------------------- /scripts/tools/deploy_firebase/.gitignore: -------------------------------------------------------------------------------- 1 | /public 2 | /node_modules 3 | package-lock.json 4 | npm-debug.log 5 | yarn-error.log 6 | yarn.lock -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-icon.png -------------------------------------------------------------------------------- /src/_static/meta/firefox_app_60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/firefox_app_60x60.png -------------------------------------------------------------------------------- /src/_static/meta/android-chrome-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/android-chrome-36x36.png -------------------------------------------------------------------------------- /src/_static/meta/android-chrome-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/android-chrome-48x48.png -------------------------------------------------------------------------------- /src/_static/meta/android-chrome-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/android-chrome-72x72.png -------------------------------------------------------------------------------- /src/_static/meta/android-chrome-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/android-chrome-96x96.png -------------------------------------------------------------------------------- /src/_static/meta/firefox_app_128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/firefox_app_128x128.png -------------------------------------------------------------------------------- /src/_static/meta/firefox_app_512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/firefox_app_512x512.png -------------------------------------------------------------------------------- /src/_static/meta/yandex-browser-50x50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/yandex-browser-50x50.png -------------------------------------------------------------------------------- /src/_static/meta/android-chrome-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/android-chrome-144x144.png -------------------------------------------------------------------------------- /src/_static/meta/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/android-chrome-192x192.png -------------------------------------------------------------------------------- /src/_static/meta/android-chrome-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/android-chrome-256x256.png -------------------------------------------------------------------------------- /src/_static/meta/android-chrome-384x384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/android-chrome-384x384.png -------------------------------------------------------------------------------- /src/_static/meta/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/android-chrome-512x512.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-icon-57x57.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-icon-72x72.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-icon-114x114.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-icon-144x144.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-icon-167x167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-icon-167x167.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-icon-180x180.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-icon-precomposed.png -------------------------------------------------------------------------------- /scripts/tools/deploy_ipfs/.gitignore: -------------------------------------------------------------------------------- 1 | # Folders 2 | /node_modules 3 | 4 | # log 5 | *.log 6 | 7 | # Lock 8 | *.lock 9 | 10 | package-lock.json 11 | links.json -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-startup-image-320x460.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-startup-image-320x460.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-startup-image-640x920.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-startup-image-640x920.png -------------------------------------------------------------------------------- /.codeclimate.yml: -------------------------------------------------------------------------------- 1 | engines: 2 | eslint: 3 | enabled: true 4 | 5 | ratings: 6 | paths: 7 | - "src/**.js" 8 | 9 | exclude_paths: 10 | - "scripts/**" 11 | -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-startup-image-1182x2208.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-startup-image-1182x2208.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-startup-image-1242x2148.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-startup-image-1242x2148.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-startup-image-1496x2048.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-startup-image-1496x2048.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-startup-image-1536x2008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-startup-image-1536x2008.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-startup-image-640x1096.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-startup-image-640x1096.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-startup-image-748x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-startup-image-748x1024.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-startup-image-750x1294.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-startup-image-750x1294.png -------------------------------------------------------------------------------- /src/_static/meta/apple-touch-startup-image-768x1004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alexstep/create-riot-app/HEAD/src/_static/meta/apple-touch-startup-image-768x1004.png -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 10 4 | cache: 5 | directories: 6 | - node_modules 7 | script: 8 | - npm run build 9 | env: 10 | - TRAVIS_BUILD=true 11 | -------------------------------------------------------------------------------- /.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | .*/node_modules/ 3 | 4 | [include] 5 | 6 | [libs] 7 | 8 | [options] 9 | esproposal.class_static_fields=enable 10 | esproposal.class_instance_fields=enable 11 | -------------------------------------------------------------------------------- /src/view/icons/done.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/view/icons/dashboard.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /scripts/tools/deploy_firebase/firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "public": "public", 4 | "ignore": [ 5 | "firebase.json", 6 | "**/.*", 7 | "**/node_modules/**" 8 | ] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | # Custom app vars 2 | APP_OPTION = some_option 3 | APP_AVATAR_URL = https://avatars1.githubusercontent.com/u/1881684?v=3&s=100 4 | 5 | # Service worker settings 6 | APP_SW_ACTIVE = 1 7 | #APP_SW_CACHE = 1 8 | APP_SW_SCOPE = / 9 | -------------------------------------------------------------------------------- /src/_static/meta/yandex-browser-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.1.1", 3 | "api_version": 1, 4 | "layout": { 5 | "logo": "/static/meta/yandex-browser-50x50.png", 6 | "color": "#1c2026", 7 | "show_title": true 8 | } 9 | } -------------------------------------------------------------------------------- /src/_static/humans.txt: -------------------------------------------------------------------------------- 1 | # humanstxt.org/ 2 | # The humans responsible & technology colophon 3 | 4 | # TEAM 5 | 6 | -- -- 7 | 8 | # THANKS 9 | 10 | 11 | 12 | # TECHNOLOGY COLOPHON 13 | 14 | HTML5, CSS3 15 | -------------------------------------------------------------------------------- /src/view/icons/pay.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /scripts/tools/deploy_ipfs/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "2.1" 2 | 3 | services: 4 | dc_ipfs: 5 | image: ipfs/go-ipfs 6 | container_name: "ipfs_deployer" 7 | labels: 8 | - "IPFS node for Deploy DApp" 9 | volumes: 10 | - ../../../build:/go/target 11 | 12 | -------------------------------------------------------------------------------- /scripts/webpack/devserver.js: -------------------------------------------------------------------------------- 1 | module.exports = function () { 2 | return { 3 | devServer: { 4 | historyApiFallback: { 5 | index: 'index.html' 6 | }, 7 | port: 9999, 8 | stats: 'errors-only', 9 | overlay: true 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /.env.production: -------------------------------------------------------------------------------- 1 | # Custom app vars 2 | APP_OPTION = some_option 3 | APP_AVATAR_URL = https://avatars1.githubusercontent.com/u/1881684?v=3&s=100 4 | 5 | # Service worker settings 6 | APP_SW_ACTIVE = 1 7 | APP_SW_CACHE = 1 8 | APP_SW_SCOPE = / 9 | 10 | # Custom app vars 11 | APP_OPTION1 = some_option1 12 | -------------------------------------------------------------------------------- /scripts/webpack/js.lint.js: -------------------------------------------------------------------------------- 1 | module.exports = function () { 2 | return { 3 | module: { 4 | rules: [ 5 | { 6 | test: /\.js$/, 7 | // include: paths, 8 | enforce: 'pre', 9 | loader: 'eslint-loader' 10 | } 11 | ] 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/index.SW.js: -------------------------------------------------------------------------------- 1 | // import 'babel-polyfill' 2 | 3 | // Cache static 4 | if (process.env.APP_SW_CACHE) { 5 | require('ServiceWorker/cache.sw.js')() 6 | } 7 | 8 | // Push-notifications 9 | require('ServiceWorker/push.sw.js')() 10 | 11 | // Background tasks 12 | require('ServiceWorker/background.sw.js')() 13 | -------------------------------------------------------------------------------- /src/view/icons/logout.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/view/components/utils/raw.tag: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 |
13 | 14 |
15 | -------------------------------------------------------------------------------- /scripts/webpack/less.lint.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const StyleLintPlugin = require('stylelint-webpack-plugin') 3 | 4 | module.exports = function () { 5 | return { 6 | plugins: [ 7 | new StyleLintPlugin({ 8 | configFile: path.resolve('./') + '.stylelintrc' 9 | }) 10 | ] 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/view/components/utils/icon.tag: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/_static/meta/manifest.webapp: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.1.1", 3 | "name": "RiotJS App", 4 | "description": "App description", 5 | "icons": { 6 | "60": "/static/meta/firefox_app_60x60.png", 7 | "128": "/static/meta/firefox_app_128x128.png", 8 | "512": "/static/meta/firefox_app_512x512.png" 9 | }, 10 | "developer": { 11 | "name": null, 12 | "url": null 13 | } 14 | } -------------------------------------------------------------------------------- /scripts/tools/metainfo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "metainfo", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "config.js", 6 | "scripts": { 7 | "start": "node generate.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "devDependencies": { 14 | "favicons": "^5.1.1" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /scripts/webpack/env.js: -------------------------------------------------------------------------------- 1 | const dotenv = require('dotenv') 2 | const path = require('path') 3 | 4 | const DefinePlugin = require('webpack').DefinePlugin 5 | 6 | module.exports = function (file) { 7 | dotenv.config({ path: path.resolve(file) }) 8 | 9 | return { 10 | plugins: [ 11 | new DefinePlugin({ 12 | 'process.env': JSON.stringify(process.env) 13 | }) 14 | ] 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/model/ServiceWorker/background.sw.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | module.exports = function () { 4 | self.addEventListener('message', event => { 5 | if (!event.data || !event.ports || !event.ports[0]) return 6 | 7 | console.groupCollapsed('SW::Message event') 8 | 9 | console.log(event.data) 10 | 11 | event.ports[0].postMessage({ my_data_recived:event.data }) 12 | console.groupEnd() 13 | }) 14 | } 15 | -------------------------------------------------------------------------------- /scripts/tools/deploy_ssh/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "deploy_ssh", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "deploy": "node index.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "devDependencies": { 14 | "ssh-deploy-release": "^2.1.9" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/view/components/screens/dashboard.tag: -------------------------------------------------------------------------------- 1 | 2 | 7 |
8 | 9 |

Dashboard !!!

10 |
11 | 12 | 19 |
20 | -------------------------------------------------------------------------------- /scripts/webpack/images.js: -------------------------------------------------------------------------------- 1 | module.exports = function () { 2 | return { 3 | module: { 4 | rules: [ 5 | { 6 | test: /\.(jpg|png)$/, 7 | loader: 'file-loader', 8 | options: { 9 | name: 'img/[name].[ext]' 10 | } 11 | }, 12 | { 13 | test: /\.svg$/, 14 | loader: 'svg-inline-loader' 15 | } 16 | ] 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/view/icons/group.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/view/icons/plugin.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/view/components/screens/settings.tag: -------------------------------------------------------------------------------- 1 | 2 | 6 |
7 | 8 |
9 | 10 | 18 |
19 | -------------------------------------------------------------------------------- /src/view/styles/base.less: -------------------------------------------------------------------------------- 1 | @import 'reset/reset.less'; 2 | @import 'ripple.less'; 3 | 4 | body * { 5 | font-family: -apple-system,BlinkMacSystemFont,Roboto,Open Sans,Helvetica Neue,sans-serif, sans-serif; 6 | font-weight:400; 7 | 8 | -webkit-font-smoothing: antialiased; 9 | text-rendering: optimizeLegibility; 10 | -webkit-user-select: none; 11 | } 12 | 13 | body.desktop-font-roboto * { 14 | font-family:'Roboto', sans-serif; 15 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # secret data 4 | # /scripts/ssh_deploy.js 5 | 6 | # dependencies 7 | /node_modules 8 | package-lock.json 9 | 10 | # production 11 | /dist 12 | 13 | /src/static/meta 14 | 15 | # misc 16 | .DS_Store 17 | # .env.local 18 | .env.development.local 19 | .env.test.local 20 | .env.production.local 21 | 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | 26 | changelog.txt -------------------------------------------------------------------------------- /scripts/tools/deploy_firebase/deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash -e 2 | 3 | firebase="$PWD/node_modules/.bin/firebase" 4 | 5 | $firebase login 6 | 7 | file="./node_modules/firebaseinitied.txt" 8 | if [ -f "$file" ] 9 | then 10 | echo "" 11 | else 12 | echo "firebaseinitied" > $file 13 | clear 14 | $firebase init || exit 1 15 | fi 16 | 17 | rm -rf "$PWD/./public" 18 | cp -r "$PWD/../../../build" "$PWD/./public" 19 | 20 | $firebase deploy 21 | 22 | rm -rf `$PWD`./public -------------------------------------------------------------------------------- /src/view/icons/tasks_ok.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /scripts/tools/deploy_firebase/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "deploy_firebase", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "postintall":"npm run login", 8 | "login":"firebase login", 9 | "start":"firebase init", 10 | "deploy":"sh ./deploy.sh", 11 | "reset":"rm ./node_modules/firebaseinitied.txt" 12 | }, 13 | "keywords": [], 14 | "author": "", 15 | "license": "ISC", 16 | "devDependencies": { 17 | "firebase-tools": "^4.0.3" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /scripts/webpack/riot.js: -------------------------------------------------------------------------------- 1 | // https://github.com/riot/tag-loader#usage-in-webpack--4 2 | module.exports = function () { 3 | return { 4 | module: { 5 | rules: [ 6 | { 7 | test: /\.tag$/, 8 | exclude: /node_modules/, 9 | use: [{ 10 | loader: 'riot-tag-loader', 11 | options: { 12 | debug : true, 13 | type : 'es6', 14 | hot : false 15 | } 16 | }] 17 | } 18 | ] 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /scripts/tools/deploy_ipfs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "deploy_ipscend", 3 | "version": "1.0.0", 4 | "description": "deploy files to ipfs tool", 5 | "repository": "https://github.com/ipfs-shipyard/ipscend", 6 | "main": "index.js", 7 | "scripts": { 8 | "start_ipfs_node":"docker-compose up -d .", 9 | "stop_ipfs_node":"docker-compose down .", 10 | "deploy": "npm run start_ipfs_node && node ./index.js && sleep 10 && npm run stop_ipfs_node " 11 | }, 12 | "keywords": [], 13 | "author": "", 14 | "license": "ISC" 15 | } 16 | -------------------------------------------------------------------------------- /src/view/components/utils/lang.tag: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 21 | {text} 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/_static/meta/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | #1c2026 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/index.web.js: -------------------------------------------------------------------------------- 1 | import SW from 'ServiceWorker/SW' 2 | 3 | // riot route base url set in ./src/view/app.view.js line 47 4 | import View from './view/app.view.js' 5 | 6 | 7 | const App = {} 8 | window.App = App 9 | 10 | // window.onerror = function(a,b,c){ 11 | // alert(JSON.stringify({a:a,b:b,c:c})) 12 | // } 13 | 14 | document.addEventListener('DOMContentLoaded', () => { 15 | App.view = new View() 16 | App.view.start() 17 | 18 | console.log('ENV:', process.env) 19 | 20 | console.log('') 21 | }) 22 | 23 | // Register Service Worker 24 | if (process.env.DAPP_SW_ACTIVE) SW.register() 25 | -------------------------------------------------------------------------------- /src/view/icons/tasks.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Файл с настройками для редактора. 2 | # 3 | # Если вы разрабатываете в редакторе от JetBrains, BBEdit, Coda или SourceLair 4 | # этот файл уже поддерживается и не нужно производить никаких дополнительных действий. 5 | # 6 | # Если вы ведёте разработку в другом редакторе, зайдите на http://editorconfig.org 7 | # и в разделе "Download a Plugin" скачайте дополнение для вашего редактора. 8 | root = true 9 | 10 | [*] 11 | charset = utf-8 12 | indent_style = space 13 | indent_size = 2 14 | end_of_line = lf 15 | trim_trailing_whitespace = true 16 | insert_final_newline = true 17 | -------------------------------------------------------------------------------- /src/model/demo.api.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jsonplaceholder.typicode.com 3 | * Fake Online REST API for Testing and Prototyping 4 | */ 5 | 6 | const demo_api_url = 'https://jsonplaceholder.typicode.com/' 7 | 8 | export default new class API { 9 | constructor () { 10 | this.api_url = demo_api_url 11 | } 12 | 13 | get (method_name = false, params = {}) { 14 | if (!method_name) return 15 | 16 | let query = Object.keys(params) 17 | .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(params[k])) 18 | .join('&') 19 | 20 | return fetch(this.api_url + method_name + '?' + query).then(r => { 21 | return r.json() 22 | }) 23 | } 24 | }() 25 | -------------------------------------------------------------------------------- /src/view/components/topbar.tag: -------------------------------------------------------------------------------- 1 | 2 |
3 |

{opts.title}

4 |
5 | 6 | 28 |
29 | -------------------------------------------------------------------------------- /src/view/styles/components/groups.less: -------------------------------------------------------------------------------- 1 | 2 | // Desktop 3 | #screen_groups { 4 | @media only screen and (min-width: 680px) { 5 | .groups-list { 6 | background: #f0f0f0; min-height: 100vh; 7 | text-align: center; 8 | .group { 9 | text-align: left; 10 | background: #fff; 11 | margin:10px; 12 | border-radius: 1px; 13 | box-shadow: 1px 1px 2px rgba(0,0,0,0.1); 14 | 15 | padding: 20px; 16 | height: 200px; width: 320px; 17 | display: inline-block; 18 | b { max-width: 200px; white-space: inherit;} 19 | 20 | &:hover { 21 | background: #f9f9f9; 22 | box-shadow: 1px 1px 0px rgba(0,0,0,0.1); 23 | } 24 | } 25 | } 26 | }// media only screen and (max-width: 600px) { 27 | } -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "public": "build", 4 | "rewrites": [ 5 | { 6 | "source": "**", 7 | "destination": "/index.html" 8 | } 9 | ], 10 | "headers": [ { 11 | "source" : "**/*.@(eot|otf|ttf|ttc|woff|font.css)", 12 | "headers" : [ { 13 | "key" : "Access-Control-Allow-Origin", 14 | "value" : "*" 15 | } ] 16 | }, { 17 | "source" : "**/*.@(jpg|jpeg|gif|png|svg)", 18 | "headers" : [ { 19 | "key" : "Access-Control-Allow-Origin", 20 | "value" : "*" 21 | }, 22 | { 23 | "key" : "Cache-Control", 24 | "value" : "max-age=7200" 25 | } ] 26 | } 27 | ] 28 | 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/view/components/app.tag: -------------------------------------------------------------------------------- 1 | 2 | 21 | 22 |
23 | 24 | 25 | 26 |
27 |
28 | 29 | 30 |
31 | -------------------------------------------------------------------------------- /scripts/webpack/css.js: -------------------------------------------------------------------------------- 1 | module.exports = function (paths) { 2 | return { 3 | module: { 4 | rules: [ 5 | { 6 | test: /\.css$/, 7 | include: paths, 8 | use: [ 9 | 'style-loader', 10 | 'css-loader' 11 | ] 12 | }, 13 | { 14 | test: /\.less$/, 15 | include: paths, 16 | use: [ 17 | 'style-loader', 18 | 'css-loader', 19 | 'less-loader' 20 | ] 21 | }, 22 | { 23 | test: /\.styl$/, 24 | include: paths, 25 | use: [ 26 | 'style-loader', 27 | 'css-loader', 28 | 'stylus-loader' 29 | ] 30 | } 31 | ] 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/view/icons/settings.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /scripts/webpack/babel.js: -------------------------------------------------------------------------------- 1 | module.exports = function () { 2 | return { 3 | module: { 4 | rules: [ 5 | { 6 | test: /\.js$/, 7 | // include : ['./src'], 8 | exclude: /(node_modules|bower_components)/, 9 | loader: 'babel-loader', 10 | options: { 11 | presets: [ 12 | [ 13 | '@babel/preset-env', 14 | { 15 | targets: { 16 | esmodules: true, 17 | browsers: [ 18 | 'last 2 versions' 19 | ] 20 | }, 21 | modules: false // Needed for tree shaking to work. 22 | } 23 | ] 24 | ] 25 | } 26 | } 27 | ] 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/view/styles/ripple.less: -------------------------------------------------------------------------------- 1 | /* 2 | * Pure CSS ripple effect (no JavaScript) 3 | * CSS-only implementation of Android Material design "ripple" animation on click event 4 | * 5 | * https://github.com/mladenplavsic/css-ripple-effect/ 6 | */ 7 | 8 | .ripple { 9 | position: relative; 10 | overflow: hidden; 11 | 12 | &:after { 13 | content: ""; 14 | display: block; 15 | position: absolute; 16 | width: 100%; 17 | height: 100%; 18 | top: 0; 19 | left: 0; 20 | pointer-events: none; 21 | background-image: radial-gradient(circle, #000 10%, transparent 10.01%); 22 | background-repeat: no-repeat; 23 | background-position: 50%; 24 | // transform: scale3d(10,10,10); 25 | opacity: 0; 26 | transition: all .4s, opacity 1s; 27 | background-size: 1000%; 28 | } 29 | 30 | &:active:after { 31 | 32 | background-size: 0; 33 | // transform: scale3d(0,0,0); 34 | opacity: .2; 35 | transition: 0s; 36 | } 37 | } -------------------------------------------------------------------------------- /scripts/webpack/favicon.js: -------------------------------------------------------------------------------- 1 | const FaviconsWebpackPlugin = require('favicons-webpack-plugin') 2 | module.exports = function () { 3 | return { 4 | plugins: [ 5 | new FaviconsWebpackPlugin({ 6 | logo: './src/favicon_source.svg', 7 | persistentCache: true, 8 | // Inject the html into the html-webpack-plugin 9 | inject: true, 10 | // favicon background color (see https://github.com/haydenbleasel/favicons#usage) 11 | background: '#fff', 12 | // favicon app title (see https://github.com/haydenbleasel/favicons#usage) 13 | title: 'Webpack App', 14 | 15 | // which icons should be generated (see https://github.com/haydenbleasel/favicons#usage) 16 | icons: { 17 | android: true, 18 | appleIcon: true, 19 | appleStartup: true, 20 | coast: false, 21 | favicons: true, 22 | firefox: true, 23 | opengraph: false, 24 | twitter: false, 25 | yandex: false, 26 | windows: false 27 | } 28 | }) 29 | ] 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /scripts/tools/deploy_ssh/index.js: -------------------------------------------------------------------------------- 1 | /***************************************** 2 | IMPORTANT! 3 | add this file to .gitignore 4 | 5 | read more about deploy - https://www.npmjs.com/package/ssh-deploy-release 6 | *****************************************/ 7 | 8 | console.log('') 9 | console.log('') 10 | console.log('---------------------------------------------') 11 | console.log(' Please config this scripts manualy for your server') 12 | console.log(' ./scrpts/tools/deploy_ssh/config.js') 13 | console.log(' ./scrpts/tools/deploy_ssh/index.js') 14 | console.log('') 15 | console.log(' docs: https://www.npmjs.com/package/ssh-deploy-release ') 16 | console.log('---------------------------------------------') 17 | console.log('') 18 | console.log('') 19 | process.exit() 20 | 21 | // npm i ssh-deploy-release 22 | const Deployer = require('ssh-deploy-release') 23 | 24 | const options = require('config.js') 25 | 26 | console.log() 27 | console.log('Deploy to ' + options.host + ' in ' + options.deployPath) 28 | console.log() 29 | 30 | const deployer = new Deployer(options) 31 | 32 | deployer.deployRelease(() => { 33 | console.log('Succefull deployed!') 34 | }) 35 | -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | <%= htmlWebpackPlugin.options.metaHtml %> 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 32 | 33 | -------------------------------------------------------------------------------- /src/view/sounds.js: -------------------------------------------------------------------------------- 1 | // @flow weak 2 | 3 | // 4 | // ♬ Simple module to make sound effects 5 | // 6 | module.exports = function (conf) { 7 | let sounds_path = conf.sounds_path ? conf.sounds_path : '/sounds/' 8 | 9 | let sounds = {} 10 | 11 | function play (filename = false, volume = 0.3) { 12 | volume = volume || 0.3 13 | 14 | if (!filename) { return } 15 | 16 | if (typeof sounds[filename] === 'undefined') { 17 | // $FlowFixMe 18 | sounds[filename] = new Audio() 19 | sounds[filename].src = sounds_path + filename 20 | } 21 | 22 | sounds[filename].volume = volume 23 | sounds[filename].pause() 24 | sounds[filename].currentTime = 0 25 | 26 | setTimeout(() => { 27 | if (sounds[filename].paused) { 28 | sounds[filename].play() 29 | } 30 | }, 1) 31 | } 32 | 33 | return { 34 | play:play, 35 | 36 | tick (volume = 0.1) { 37 | let filename = 'tick.ogg' 38 | 39 | if (sounds[filename]) { 40 | sounds[filename].volume = volume 41 | sounds[filename].pause() 42 | sounds[filename].currentTime = 0.02 43 | 44 | sounds[filename].play() 45 | } else { 46 | play('tick.ogg', volume) 47 | } 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: 'standard', 3 | plugins:['riot'], 4 | 5 | 'globals': { 6 | 'riot' : true , 7 | '__dirname' : true , 8 | 'process' : true , 9 | 'App' : true , 10 | '$' : true 11 | }, 12 | 13 | 'env': { 14 | 'browser' : true , 15 | 'commonjs' : true , 16 | 'es6' : true 17 | }, 18 | 19 | 'parserOptions': { 20 | 'ecmaVersion' : 8, 21 | 'ecmaFeatures' : { 22 | 'jsx': true 23 | }, 24 | 'sourceType': 'module' 25 | }, 26 | 27 | 28 | rules: { 29 | // fot vertical aligment 30 | 'no-multi-spaces' : 'off' , 31 | 'comma-spacing' : 'off' , 32 | 'no-multiple-empty-lines' : 'off' , 33 | 'key-spacing' : 'off' , 34 | 35 | // not error 36 | 'indent' : 'warn', 37 | 'no-tabs' : 'warn', 38 | 'arrow-spacing' : 'warn', 39 | 'padded-blocks' : 'warn', 40 | 41 | 'camelcase' : /*fuck*/'off', 42 | 43 | 'space-infix-ops' : 'warn', 44 | 'space-before-blocks' : 'warn', 45 | 'object-curly-spacing' : 'warn', 46 | 'space-before-function-paren' : 'warn', 47 | } 48 | }; -------------------------------------------------------------------------------- /scripts/webpack/minify.js: -------------------------------------------------------------------------------- 1 | const MinifyJSPlugin = require('babel-minify-webpack-plugin') 2 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 3 | const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') 4 | 5 | module.exports = function (paths) { 6 | return { 7 | module: { 8 | rules: [ 9 | { 10 | test: /\.less$/, 11 | include: paths, 12 | use: ExtractTextPlugin.extract({ 13 | publicPath: '../', 14 | fallback: 'style-loader', 15 | use: ['css-loader','less-loader'] 16 | }) 17 | }, 18 | { 19 | test: /\.styl$/, 20 | include: paths, 21 | use: ExtractTextPlugin.extract({ 22 | publicPath: '../', 23 | fallback: 'style-loader', 24 | use: ['css-loader','stylus-loader'] 25 | }) 26 | }, 27 | { 28 | test: /\.css$/, 29 | include: paths, 30 | use: ExtractTextPlugin.extract({ 31 | fallback: 'style-loader', 32 | use: 'css-loader' 33 | }) 34 | } 35 | ] 36 | }, 37 | 38 | plugins: [ 39 | new ExtractTextPlugin('./css/[name].css'), 40 | new MinifyJSPlugin() 41 | ], 42 | 43 | optimization: { 44 | minimizer:[ 45 | new OptimizeCSSPlugin({ 46 | removeConsole: true, 47 | removeDebugger: true 48 | },{ 49 | comments:false 50 | }) 51 | ] 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2017, Alex 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /src/_static/meta/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "RiotJS App", 3 | "short_name": "RiotJS App", 4 | "description": "App description", 5 | "dir": "auto", 6 | "lang": "en-US", 7 | "display": "standalone", 8 | "orientation": "portrait", 9 | "start_url": "/", 10 | "background_color": "#1c2026", 11 | "theme_color": "#1c2026", 12 | "icons": [ 13 | { 14 | "src": "/static/meta/android-chrome-36x36.png", 15 | "sizes": "36x36", 16 | "type": "image/png" 17 | }, 18 | { 19 | "src": "/static/meta/android-chrome-48x48.png", 20 | "sizes": "48x48", 21 | "type": "image/png" 22 | }, 23 | { 24 | "src": "/static/meta/android-chrome-72x72.png", 25 | "sizes": "72x72", 26 | "type": "image/png" 27 | }, 28 | { 29 | "src": "/static/meta/android-chrome-96x96.png", 30 | "sizes": "96x96", 31 | "type": "image/png" 32 | }, 33 | { 34 | "src": "/static/meta/android-chrome-144x144.png", 35 | "sizes": "144x144", 36 | "type": "image/png" 37 | }, 38 | { 39 | "src": "/static/meta/android-chrome-192x192.png", 40 | "sizes": "192x192", 41 | "type": "image/png" 42 | }, 43 | { 44 | "src": "/static/meta/android-chrome-256x256.png", 45 | "sizes": "256x256", 46 | "type": "image/png" 47 | }, 48 | { 49 | "src": "/static/meta/android-chrome-384x384.png", 50 | "sizes": "384x384", 51 | "type": "image/png" 52 | }, 53 | { 54 | "src": "/static/meta/android-chrome-512x512.png", 55 | "sizes": "512x512", 56 | "type": "image/png" 57 | } 58 | ] 59 | } -------------------------------------------------------------------------------- /src/model/ServiceWorker/push.sw.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Push-notifictaions 3 | */ 4 | 5 | /* global clients */ 6 | 7 | module.exports = function () { 8 | self.addEventListener('message', (event) => { 9 | if (event.data && event.data.pushEnabled) { 10 | self.registration.showNotification( 11 | 'Notifications enbaled', 12 | { 13 | body: 'Now we can notify you about DApp status', 14 | icon: '/static/meta/android-chrome-192x192.png', 15 | tag: 'push' 16 | }) 17 | } 18 | }) 19 | 20 | self.addEventListener('notificationclick', function (event) { 21 | let url = self.location.hostname 22 | event.notification.close() 23 | event.waitUntil( 24 | clients.matchAll({ type: 'window' }).then(windowClients => { 25 | for (let i = 0; i < windowClients.length; i++) { 26 | let client = windowClients[i] 27 | 28 | if (client.url === url && 'focus' in client) { 29 | return client.focus() 30 | } 31 | } 32 | 33 | if (clients.openWindow) { 34 | return clients.openWindow(url) 35 | } 36 | }) 37 | ) 38 | }) 39 | 40 | // self.addEventListener('push', function(event) { 41 | // console.log('Received a push message', event) 42 | 43 | // let title = 'Yay a message.' 44 | // let body = 'We have received a push message.' 45 | // let icon = '/images/icon-192x192.png' 46 | // let tag = 'simple-push-demo-notification-tag' 47 | 48 | // event.waitUntil( 49 | // self.registration.showNotification(title, { 50 | // body: body, 51 | // icon: icon, 52 | // tag: tag 53 | // }) 54 | // ) 55 | // }) 56 | 57 | return true 58 | } 59 | -------------------------------------------------------------------------------- /src/_static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | %META_INFORMATION% 18 | 19 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /scripts/tools/metainfo/generate.js: -------------------------------------------------------------------------------- 1 | const config = require('./config.js') 2 | 3 | const favicons = require('favicons') 4 | const fs = require('fs') 5 | const chalk = require('chalk') 6 | const clearConsole = require('react-dev-utils/clearConsole') 7 | 8 | 9 | const mkdirSync = function (dirPath) { 10 | try { 11 | fs.mkdirSync(dirPath) 12 | } catch (err) { 13 | if (err.code !== 'EEXIST') throw err 14 | } 15 | } 16 | 17 | mkdirSync(config.files_dest) 18 | 19 | 20 | favicons(config.source_img, config.settings, function (error, response) { 21 | if (error) { 22 | console.log(error.status) // HTTP error code (e.g. `200`) or `null` 23 | console.log(error.name) // Error name e.g. "API Error" 24 | console.log(error.message) // Error description e.g. "An unknown error has occurred" 25 | return 26 | } 27 | clearConsole() 28 | console.log('Generated ' + response.images.length + ' images\n') 29 | 30 | response.images.forEach( img => { 31 | fs.writeFileSync(config.files_dest + img.name, img.contents) 32 | }) 33 | 34 | response.files.forEach( file => { 35 | console.log('Write ' + config.files_dest + file.name) 36 | fs.writeFileSync(config.files_dest + file.name, file.contents) 37 | }) 38 | 39 | let metahtml = ` 40 | ${config.settings.appName} 41 | 42 | ${response.html.join('\n')} 43 | ` 44 | fs.writeFileSync(config.files_dest + config.html_filename, metahtml) 45 | 46 | // console.log(response.images) // Array of { name: string, contents: } 47 | // console.log(response.files) // Array of { name: string, contents: } 48 | // console.log(response.html) // Array of strings (html elements) 49 | }) 50 | 51 | 52 | clearConsole() 53 | console.log(chalk.cyan('Generate favicons...\n')) 54 | -------------------------------------------------------------------------------- /src/view/styles/components/drawer.less: -------------------------------------------------------------------------------- 1 | 2 | #drawer { 3 | @text_color: #0a0e14; 4 | @icon_color: #abafb4; 5 | @selected_bg: #f0f1f2; 6 | @selected_icon: #658fbf; 7 | @selected_text: #4c7eb7; 8 | 9 | header { 10 | background:lighten(@main_bg, 30%) no-repeat; 11 | background-size: cover; 12 | width: 100%; height: 170px; 13 | padding: 0px; 14 | 15 | &:before { 16 | display: block; content: ''; width: 100%; height: 100%; 17 | background: rgba(0,0,0,0.7); 18 | } 19 | .user-info { 20 | position: absolute; top:0; z-index: 2; 21 | display: block; 22 | .avatar { 23 | background-size: cover; 24 | width: 70px; height: 70px; 25 | border-radius: 50%; 26 | display: block; 27 | position: absolute; top:30px; left:0px; 28 | } 29 | em { 30 | color:#fff; display: block; 31 | position: absolute; 32 | top:60px; left:130px; width: 130px; 33 | line-height: 21px; 34 | } 35 | } 36 | } 37 | 38 | ul.menu-items { 39 | margin:0; 40 | li { 41 | display: block; width: 100%; 42 | color: @text_color; font-size: 14px; 43 | a { 44 | .ripple(); 45 | font-weight: 600; line-height: 1px; 46 | display: block; width: 100%; 47 | padding: 10px 10px 25px 10px; 48 | color: inherit; 49 | icon svg { 50 | display: inline-block; 51 | margin:0 15px 0 30px; 52 | position: relative; top: 7px; 53 | fill:@icon_color; 54 | transition:color 0.2s linear; 55 | } 56 | } // a 57 | 58 | transition:all 0.2s linear; 59 | &.selected { 60 | background-color: @selected_bg; 61 | color: @selected_text; 62 | icon { fill:@selected_icon; } 63 | } 64 | } // li 65 | } //ul.menu-items { 66 | } 67 | -------------------------------------------------------------------------------- /scripts/tools/deploy_ipfs/index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const fs = require('fs') 4 | const path = require('path') 5 | const spawn = require('child_process').spawn 6 | const openBrowser = require('react-dev-utils/openBrowser') 7 | 8 | const pathToVersions = path.join(__dirname, './links.json') 9 | 10 | function start () { 11 | const log = [] 12 | const cmd = spawn('docker exec ipfs_deployer ipfs add -r -Q /go/target', { 13 | shell: true, 14 | cwd: path.resolve(process.env.PWD, '../../..', '_env') 15 | }) 16 | 17 | cmd.stderr.on('data', errData => log.push(`${errData}`)) 18 | cmd.stdout.on('data', Data => log.push(`${Data}`)) 19 | 20 | cmd 21 | .on('exit', code => { 22 | if (code === 0 ) { 23 | output(log) 24 | } else { 25 | console.error(log.join('\n')) 26 | process.exit() 27 | } 28 | }) 29 | .on('error', err => { 30 | console.error(err) 31 | process.exit(1) 32 | }) 33 | } 34 | 35 | function output (log) { 36 | const hash = log.join('\n').replace(/\n/g, '') 37 | const res = { 38 | hash : hash, 39 | link : `https://ipfs.io/ipfs/${hash}`, 40 | timestamp : new Date() 41 | } 42 | 43 | if (fs.existsSync(pathToVersions)) { 44 | const output = require(pathToVersions) 45 | const open = fs.openSync(pathToVersions, 'w') 46 | 47 | for (let ver of output) { 48 | if (res.hash !== ver.hash) { 49 | output.push(res) 50 | } 51 | } 52 | 53 | fs.writeSync(open, JSON.stringify(output, null, ' '), 0, 'utf-8') 54 | } else { 55 | fs.writeFileSync(pathToVersions, JSON.stringify([res], null, ' '), 56 | err => { 57 | console.error(err.message) 58 | process.exit() 59 | }) 60 | } 61 | 62 | openBrowser(res.link.replace(/\s/g, '')) 63 | 64 | console.log('') 65 | console.log('Deploy success! your DApp, is available for viewing on: ') 66 | console.log(res.link) 67 | } 68 | 69 | start() -------------------------------------------------------------------------------- /src/view/styles/reset/reset.less: -------------------------------------------------------------------------------- 1 | @import 'reset-reset'; 2 | 3 | * { box-sizing: border-box; } 4 | 5 | html, body { margin:0; padding: 0; 6 | -webkit-font-smoothing: antialiased; 7 | text-rendering: optimizeLegibility; 8 | -webkit-user-select: none; 9 | overflow: hidden; 10 | } 11 | 12 | // Скрываем скролл бары 13 | *::-webkit-scrollbar { display: none;} 14 | html { overflow: -moz-scrollbars-none; } 15 | 16 | 17 | // http://maxogden.com/fast-webview-applications.html 18 | * { 19 | /* prevent callout when holding tap on links (the native dialog that comes up) */ 20 | -webkit-touch-callout: none; 21 | 22 | /* prevent webkit from resizing text to fit */ 23 | -webkit-text-size-adjust: none; 24 | 25 | /* make transparent link selection, adjust last value opacity 0 to 1.0 */ 26 | -webkit-tap-highlight-color: rgba(0,0,0,0); 27 | 28 | /* prevent copy paste, to allow, change 'none' to 'text' */ 29 | -webkit-user-select: none; 30 | } 31 | 32 | // turn off webkit checkbox style, works for other inputs too 33 | input[type="checkbox"] { -webkit-appearance: none; } 34 | 35 | // placeholder text opacity 36 | input::-webkit-input-placeholder { opacity:0; } 37 | 38 | *:active, *:focus { outline:none; } 39 | 40 | 41 | 42 | .no-select { 43 | -webkit-tap-highlight-color: rgba(255, 255, 255, 0); 44 | -webkit-focus-ring-color: rgba(255, 255, 255, 0); 45 | outline: none; 46 | 47 | -moz-user-select: none; 48 | -o-user-select: none; 49 | -khtml-user-select: none; 50 | -webkit-user-select: none; 51 | user-select: none; 52 | 53 | resize: none; 54 | 55 | -webkit-text-size-adjust: none; 56 | } 57 | 58 | html, body { .no-select(); } 59 | 60 | .text-select { 61 | -moz-user-select: text; 62 | -o-user-select: text; 63 | -khtml-user-select: text; 64 | -webkit-user-select: text; 65 | user-select: text; 66 | resize: none; 67 | } 68 | 69 | 70 | img { 71 | border: 0; 72 | vertical-align: top; 73 | } 74 | 75 | a { text-decoration: none; 76 | &:focus, &:active { outline:none; } 77 | } 78 | 79 | 80 | -------------------------------------------------------------------------------- /src/view/styles/app.less: -------------------------------------------------------------------------------- 1 | @import 'base.less'; 2 | 3 | @topbar_height: 58px; 4 | @main_bg: #5181b8; 5 | @text_color: #ffffff; 6 | 7 | .fullscreen { 8 | min-height: 100vh; height: 100%; 9 | }; 10 | 11 | 12 | html, body { 13 | overflow: hidden; //min-height: 100vh; height: 100vh; max-height: 100vh; 14 | &.scroll { 15 | overflow: auto; max-height: inherit; height: auto; 16 | } 17 | } 18 | 19 | 20 | #splash { 21 | .fullscreen(); 22 | position: fixed; z-index: 9999; 23 | top:0; left:0; right: 0; bottom: 0; 24 | 25 | background: url('/img/logo.svg') @main_bg no-repeat center; 26 | background-size: 150px auto; 27 | @media only screen and (max-width: 680px) { 28 | background-size: 30% auto; 29 | } 30 | &:before { 31 | content: 'Загрузка...'; 32 | color: @text_color; 33 | text-transform: uppercase; font-weight: 200; 34 | font-size: 21px; 35 | 36 | text-align: center; 37 | display: block; width: 100%; 38 | position: absolute; bottom: 30%; margin-left: 5px; 39 | transition:opacity 0.4s linear; 40 | } 41 | 42 | transition:opacity 0.7s linear; 43 | &.hide { 44 | &:before { opacity: 0; } 45 | 46 | @media only screen and (min-width: 680px) { 47 | opacity: 0; 48 | } 49 | 50 | @media only screen and (max-width: 680px) { 51 | animation: hide_splash 1s linear; 52 | 53 | @keyframes hide_splash { 54 | 0% { 55 | } 56 | 40% { 57 | background-position:center 122px; 58 | opacity: 1; 59 | } 60 | 80% { 61 | background-position:center 122px; 62 | background-size: 45% auto; 63 | } 64 | 90% { 65 | background-position:center 122px; 66 | background-size: 45% auto; 67 | opacity: 0; 68 | } 69 | 100% { 70 | background-position:center 122px; 71 | background-size: 45% auto; 72 | opacity: 0; 73 | } 74 | } 75 | } 76 | 77 | } // hide 78 | 79 | } 80 | 81 | 82 | 83 | #app { 84 | .fullscreen(); 85 | min-height: 100vh; 86 | background: #fff; 87 | position: relative; 88 | } 89 | 90 | .screen { 91 | height: calc(100vh ~"-" @topbar_height); 92 | width: 100vw; 93 | overflow: scroll; 94 | } 95 | 96 | 97 | @import './components/drawer.less'; 98 | @import './components/groups.less'; 99 | 100 | 101 | -------------------------------------------------------------------------------- /src/view/components/screens/groups.tag: -------------------------------------------------------------------------------- 1 | 2 | 3 | 27 | 28 |
29 | 30 | 31 | 38 | 39 |
40 |
41 | No content...

42 | Create 43 |
44 |
45 |
46 | 47 | 88 |
89 | -------------------------------------------------------------------------------- /src/view/components/drawer/swipe.js: -------------------------------------------------------------------------------- 1 | import Hammer from 'hammerjs' 2 | import 'jquery' 3 | 4 | export default class Swipe { 5 | constructor (params) { 6 | this.wrapper = params.wrapper 7 | this.drawer = params.drawer 8 | this.overlay = params.overlay 9 | this.drawer_width = params.drawer_width || 240 10 | this.handler_width = params.handler_width || 50 11 | 12 | this.onOpenCallback = params.onOpen 13 | this.onCloseCallback = params.onClose 14 | 15 | this.panning = false 16 | this.start_x = 0 17 | 18 | if (this.drawer.width() > 0) { 19 | this.drawer_width = this.drawer.width() 20 | } 21 | } 22 | 23 | init () { 24 | new Hammer(this.wrapper[0], { prevent_default: false }) 25 | .on('panstart' , e => this.start(e)) 26 | .on('pan' , e => this.pan(e)) 27 | .on('panend' , e => this.end(e)) 28 | } 29 | 30 | 31 | start (e) { 32 | if (e.center.x > 0 && this.drawer_open && e.center.x > 0) { 33 | this.start_x = e.center.x 34 | } else { 35 | this.start_x = false 36 | } 37 | } 38 | 39 | pan (e) { 40 | if (e.pointerType !== 'touch' || e.center.x <= 0 || [2,4].indexOf(e.direction) < 0) { 41 | return 42 | } 43 | if (!this.panning && e.pointers[0].clientX > this.handler_width && !this.drawer_open) { 44 | return 45 | } 46 | 47 | this.panning = true 48 | 49 | let x = e.center.x 50 | 51 | if (this.start_x) { 52 | x += this.drawer_width - this.start_x 53 | } 54 | 55 | if (x > this.drawer_width) { x = this.drawer_width } 56 | if (x < 0) { x = 0 } 57 | 58 | 59 | if (e.direction === 4) { 60 | if (x < this.drawer_width * 0.3) { 61 | this.drawer_open = false 62 | } 63 | if (x >= this.drawer_width * 0.3) { 64 | this.drawer_open = true 65 | } 66 | } 67 | 68 | if (e.direction === 2) { 69 | if (x < this.drawer_width * 0.7) { 70 | this.drawer_open = false 71 | } 72 | if (x >= this.drawer_width * 0.7) { 73 | this.drawer_open = true 74 | } 75 | } 76 | 77 | if ((x - this.drawer_width) !== 0) { 78 | this.drawer.css('transform', 'translate3d(' + (x - this.drawer_width) + 'px,0,0)') 79 | } 80 | 81 | this.wrapper.addClass('pan') 82 | this.overlay.css({ opacity: (x / this.drawer_width) }) 83 | } 84 | 85 | end (e) { 86 | this.wrapper.removeClass('pan') 87 | 88 | this.drawer.removeAttr('style') 89 | this.overlay.removeAttr('style') 90 | 91 | if (this.drawer_open) { 92 | this.wrapper.addClass('show') 93 | this.onOpenCallback() 94 | } else { 95 | this.wrapper.removeClass('show') 96 | this.onCloseCallback() 97 | } 98 | if (e.pointerType === 'touch') { 99 | this.panning = false 100 | } 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /src/view/components/misc/spinner.tag: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 | 6 | 7 | 8 |
9 |
10 | 11 |
{opts.text}
12 |
13 | 14 | 115 | 116 |
117 | -------------------------------------------------------------------------------- /scripts/tools/metainfo/config.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Settings for favicons and webapp manifest generator 3 | * https://www.npmjs.com/package/favicons 4 | * see ./scripts/favicons.js 5 | */ 6 | 7 | const {meta,version} = require('../../../package.json') 8 | 9 | const source_img = '../../../src/favicon_source.svg' 10 | const files_dest = '../../../src/_static/meta/' 11 | const icons_path = '/static/meta/' 12 | 13 | module.exports = { 14 | 15 | source_img: source_img, 16 | files_dest: files_dest, 17 | 18 | 19 | settings: { 20 | path : icons_path, // Path for overriding default icons path. `string` 21 | appName : meta.appName, // Your application's name. `string` 22 | appDescription : meta.appDescription, // Your application's description. `string` 23 | developerName : null, // Your (or your developer's) name. `string` 24 | developerURL : null, // Your (or your developer's) URL. `string` 25 | version : version, // Your application's version number. `number` 26 | logging : true, // Print logs to console? `boolean` 27 | online : false, // Use RealFaviconGenerator to create favicons? `boolean` 28 | preferOnline : false, // Use offline generation, if online generation has failed. `boolean` 29 | background : meta.background, // Background colour for flattened icons. `string` 30 | theme_color : meta.theme_color, // Theme color for browser chrome. `string` 31 | display : meta.display, // Android display: "browser" or "standalone". `string` 32 | orientation : meta.orientation, // Android orientation: "portrait" or "landscape". `string` 33 | start_url : meta.start_url, // Android start application's URL. `string` 34 | 35 | icons: { 36 | // Platform Options: 37 | // - offset - offset in percentage 38 | // - shadow - drop shadow for Android icons, available online only 39 | // - background: 40 | // * false - use default 41 | // * true - force use default, e.g. set background for Android icons 42 | // * color - set background for the specified icons 43 | // 44 | android: true, // Create Android homescreen icon. `boolean` or `{ offset, background, shadow }` 45 | appleIcon: true, // Create Apple touch icons. `boolean` or `{ offset, background }` 46 | appleStartup: true, // Create Apple startup images. `boolean` or `{ offset, background }` 47 | favicons: true, // Create regular favicons. `boolean` 48 | firefox: true, // Create Firefox OS icons. `boolean` or `{ offset, background }` 49 | windows: true, // Create Windows 8 tile icons. `boolean` or `{ background }` 50 | yandex: true, // Create Yandex browser icon. `boolean` or `{ background }` 51 | 52 | // Create Opera Coast icon with offset 25%. `boolean` or `{ offset, background }` 53 | coast: { offset: 25 } 54 | } 55 | }, 56 | 57 | html_filename: 'head_meta.html' 58 | } 59 | -------------------------------------------------------------------------------- /src/favicon_source.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scripts/webpack/config.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const path = require('path') 3 | const webpack = require('webpack') 4 | const merge = require('webpack-merge') 5 | 6 | const HtmlWebpackPlugin = require('html-webpack-plugin') 7 | const ServiceWorkerWebpackPlugin = require('serviceworker-webpack-plugin') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | 10 | const setEnv = require('./env') 11 | const devserver = require('./devserver') 12 | const sourceMap = require('./sourceMap') 13 | const babel = require('./babel') 14 | const riot = require('./riot') 15 | const images = require('./images') 16 | const css = require('./css') 17 | const minify = require('./minify') 18 | const lintCSS = require('./less.lint') 19 | const lintJS = require('./js.lint') 20 | // const favicon = require('./favicon') 21 | 22 | 23 | let metaHtml = '' 24 | try { 25 | const metaconf = require('../meta/config.js') 26 | metaHtml = fs.readFileSync(metaconf.files_dest + metaconf.html_filename) 27 | } catch (e) {} 28 | 29 | 30 | const paths = { 31 | source : path.resolve('src') + '/', 32 | build : path.resolve('dist') + '/' 33 | } 34 | 35 | const base = merge([ 36 | { 37 | node: { 38 | fs : 'empty', 39 | tls: 'empty', 40 | net: 'empty' 41 | }, 42 | 43 | entry: { 44 | index: paths.source + 'index.web.js' 45 | }, 46 | output: { 47 | path: paths.build, 48 | filename:'bundle.js', 49 | publicPath: '/' 50 | }, 51 | 52 | resolve: { 53 | modules: [ 54 | path.resolve('node_modules'), 55 | paths.source, 56 | paths.source + 'model/' 57 | ], 58 | extensions: ['.js', '.json', '.tag'] 59 | }, 60 | 61 | plugins: [ 62 | new webpack.ProvidePlugin({ 63 | riot: 'riot' 64 | }), 65 | 66 | new HtmlWebpackPlugin({ 67 | inject: true, 68 | metaHtml: metaHtml, 69 | testHtml:'test', 70 | filename: 'index.html', 71 | template: paths.source + 'index.html' 72 | }), 73 | 74 | new CopyWebpackPlugin( 75 | [ 76 | { from: paths.source + '/_static/', to: paths.build + '/' } 77 | ], 78 | { 79 | cache: true 80 | } 81 | ), 82 | 83 | new ServiceWorkerWebpackPlugin({ 84 | entry: paths.source + '/index.SW.js' 85 | }) 86 | ], 87 | 88 | optimization: { 89 | splitChunks: { 90 | cacheGroups: { 91 | vendors: { 92 | priority: -10, 93 | test: /[\\/]node_modules[\\/]/ 94 | } 95 | }, 96 | 97 | chunks: 'async', 98 | minChunks: 1, 99 | minSize: 30000, 100 | name: true 101 | } 102 | } 103 | }, 104 | 105 | images(), 106 | babel(), 107 | riot(), 108 | lintJS(), 109 | lintCSS() 110 | ]) 111 | 112 | 113 | module.exports = function (env, argv) { 114 | if (argv.mode === 'production') { 115 | return merge([ 116 | base, setEnv('.env.production'), 117 | minify() 118 | // favicon(), 119 | ]) 120 | } 121 | if (argv.mode === 'development') { 122 | return merge([ 123 | base, setEnv('.env'), 124 | devserver(), sourceMap(), 125 | css() 126 | ]) 127 | } 128 | } 129 | 130 | 131 | -------------------------------------------------------------------------------- /src/view/app.view.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Init client/window 3 | * mount tags 4 | */ 5 | 6 | // Enable HMR in dev mode 7 | import riot from 'riot' 8 | import route from 'riot-route' 9 | 10 | import $ from 'jquery' 11 | 12 | import './styles/app.less' 13 | 14 | import 'riot-hot-reload' 15 | 16 | export default class View { 17 | start () { 18 | // create observable App.view.state 19 | this.state = {} 20 | riot.observable(this.state) 21 | 22 | // import and mount all tags 23 | this.importTags() 24 | riot.mount('*') 25 | 26 | // enable router 27 | this.routing() 28 | 29 | // Init sounds 30 | this.sound = require('./sounds.js')({ sounds_path:'/sounds/' }) 31 | 32 | // append roboto font if not avaible 33 | if (!this.isFontAvaible('Roboto')) { 34 | $('body').append('') 35 | } 36 | } 37 | 38 | importTags () { 39 | let tc = require.context('./components/', true, /\.tag$/) 40 | tc.keys().forEach(function (path) { tc(path) }) 41 | } 42 | 43 | routing () { 44 | route.base('#') 45 | // route.base('/') 46 | if (['http:','https:'].indexOf(window.location.protocol) === -1) { 47 | alert('Riot route base is "/" - you need run app on server url for correct routing. or change riot base(and links) to # ') 48 | } 49 | 50 | route.start(true) 51 | } 52 | 53 | isFontAvaible (font) { 54 | let width 55 | let body = document.body 56 | 57 | let container = document.createElement('span') 58 | container.innerHTML = Array(100).join('wi') 59 | container.style.cssText = [ 60 | 'position:absolute', 61 | 'width:auto', 62 | 'font-size:128px', 63 | 'left:-99999px' 64 | ].join(' !important;') 65 | 66 | let getWidth = function (fontFamily) { 67 | container.style.fontFamily = fontFamily 68 | 69 | body.appendChild(container) 70 | width = container.clientWidth 71 | body.removeChild(container) 72 | 73 | return width 74 | } 75 | 76 | // Pre compute the widths of monospace, serif & sans-serif 77 | // to improve performance. 78 | let monoWidth = getWidth('monospace') 79 | let serifWidth = getWidth('serif') 80 | let sansWidth = getWidth('sans-serif') 81 | 82 | 83 | return monoWidth !== getWidth(font + ',monospace') || 84 | sansWidth !== getWidth(font + ',sans-serif') || 85 | serifWidth !== getWidth(font + ',serif') 86 | } 87 | 88 | 89 | topbarScrollHide () { 90 | $(window).scrollTop(0) 91 | 92 | if ($(window).width() > 800) { 93 | return false 94 | } 95 | 96 | setTimeout(() => { 97 | let $scroll_screen = $('.screen[data-topbar="scroll"]') 98 | if ($scroll_screen.length === 0) { 99 | $('body').removeClass('scroll') 100 | return 101 | } 102 | 103 | $scroll_screen.css({ height:'calc(100vh + ' + $('#topbar').height() + 'px)' }) 104 | $('body').addClass('scroll') 105 | 106 | let $w = $(window) 107 | let prev_scroll = 0 108 | 109 | $scroll_screen.off('scroll').on('scroll',(e) => { 110 | let st = $w.scrollTop() 111 | let delta = e.currentTarget.scrollTop - prev_scroll 112 | 113 | if ((delta > 0 && st < 58) || delta < 0) { 114 | if (st > 0) { 115 | $(e.currentTarget).scrollTop(prev_scroll) 116 | } 117 | $w.scrollTop(st + delta) 118 | e.preventDefault() 119 | } 120 | prev_scroll = e.currentTarget.scrollTop 121 | }) 122 | },500) 123 | } 124 | } 125 | 126 | 127 | -------------------------------------------------------------------------------- /src/model/ServiceWorker/cache.sw.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Caching resources 3 | */ 4 | 5 | /* global URL location */ 6 | 7 | module.exports = function () { 8 | console.groupCollapsed('SW::Cache') 9 | const CACHE_NAME = '_cache_' + ((new Date()).toISOString()) 10 | 11 | console.log('SW::Cache CACHE_NAME:', CACHE_NAME) 12 | 13 | // caching assets list 14 | const { assets } = global.serviceWorkerOption 15 | 16 | let assetsToCache = [ 17 | ...assets, 18 | './', '/index.html' 19 | ] 20 | 21 | assetsToCache = assetsToCache.map(path => { 22 | return new URL(path, global.location).toString() 23 | }) 24 | 25 | console.log('assetsToCache', assetsToCache) 26 | 27 | console.groupEnd() 28 | 29 | self.addEventListener('install', (event) => { 30 | console.log('Cache [SW] Install event ' + CACHE_NAME) 31 | 32 | event.waitUntil(self.skipWaiting()) 33 | 34 | // Add core website files to cache during serviceworker installation. 35 | event.waitUntil( 36 | global.caches 37 | .open(CACHE_NAME) 38 | .then((cache) => { 39 | return cache.addAll(assetsToCache) 40 | }) 41 | .then(() => { 42 | console.log('Cached assets: main', assetsToCache) 43 | }) 44 | .catch((error) => { 45 | console.error(error) 46 | throw error 47 | }) 48 | ) 49 | }) 50 | 51 | 52 | // After the install event. 53 | self.addEventListener('activate', (event) => { 54 | console.log('Cache [SW] Activate event') 55 | 56 | event.waitUntil(self.clients.claim()) 57 | 58 | // Clean the caches 59 | event.waitUntil( 60 | global.caches.keys().then((cacheNames) => { 61 | return Promise.all( 62 | cacheNames.map((cacheName) => { 63 | if (cacheName.indexOf(CACHE_NAME) === 0) { 64 | return null 65 | } 66 | 67 | return global.caches.delete(cacheName) 68 | }) 69 | ) 70 | }) 71 | ) 72 | }) 73 | 74 | 75 | self.addEventListener('fetch', (event) => { 76 | const request = event.request 77 | 78 | if (request.method !== 'GET') { 79 | console.log(`Cache [SW] Ignore non GET request ${request.method}`) 80 | return 81 | } 82 | 83 | const requestUrl = new URL(request.url) 84 | 85 | 86 | if (requestUrl.origin !== location.origin) { 87 | console.log(`Cache [SW] Ignore difference origin ${requestUrl.origin}`) 88 | return 89 | } 90 | 91 | const resource = global.caches.match(request) 92 | .then((response) => { 93 | if (response) { 94 | console.log(`Cache [SW] fetch URL ${requestUrl.href} from cache`) 95 | 96 | return response 97 | } 98 | 99 | return fetch(request) 100 | .then((responseNetwork) => { 101 | if (!responseNetwork || !responseNetwork.ok) { 102 | console.log(`[SW] URL [${ 103 | requestUrl.toString()}] wrong responseNetwork: ${ 104 | responseNetwork.status} ${responseNetwork.type}`) 105 | 106 | return responseNetwork 107 | } 108 | 109 | console.log(`Cache [SW] URL ${requestUrl.href} fetched`) 110 | 111 | const responseCache = responseNetwork.clone() 112 | 113 | global.caches 114 | .open(CACHE_NAME) 115 | .then((cache) => { 116 | return cache.put(request, responseCache) 117 | }) 118 | .then(() => { 119 | console.log(`[SW] Cache asset: ${requestUrl.href}`) 120 | }) 121 | 122 | return responseNetwork 123 | }) 124 | .catch(() => { 125 | if (event.request.mode === 'navigate') { 126 | return global.caches.match('./') 127 | } 128 | 129 | return null 130 | }) 131 | }) 132 | event.respondWith(resource) 133 | }) 134 | 135 | return global.caches 136 | } 137 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ⏏ create-riot-app 2 | [![travis](https://travis-ci.org/alexstep/create-riot-app.svg?branch=master)](https://travis-ci.org/alexstep/create-riot-app-ejected/) 3 | [![Code Climate](https://codeclimate.com/github/alexstep/create-riot-app-ejected.png)](https://codeclimate.com/github/alexstep/create-riot-app-ejected) 4 | [![npm](https://img.shields.io/npm/v/npm.svg)]() 5 | [![Dependencies](https://david-dm.org/alexstep/create-riot-app-ejected/dev-status.svg)](https://david-dm.org/alexstep/create-riot-app-ejected?type=dev) 6 | [![Join the chat at https://gitter.im/create-riot-app/](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/create-riot-app/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) 7 | 8 | [RiotJS](https://github.com/riot/riot) startkit, based on [create-react-app](https://github.com/facebookincubator/create-react-app) and [react-scripts](https://github.com/facebookincubator/create-react-app/tree/master/packages/react-scripts). 9 | 10 | [DEMO](https://ipfs.infura.io/ipfs/QmeYf7fabpUcEtUzb3Xsf5SJPbGGigPE9GTkwhrSS6cgDG/) 11 | 12 | Package included simple app example, webpack dev server with **riot hot reload** and less, sass, stylus support. ES6 features available too. Jest with riot support for testing. ES6 and eslint in riot tag. 13 | 14 | Just read https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md but replace all "react" word to "riot" :) 15 | 16 | [![See the video](https://j.gifs.com/VmEVBB.gif)](https://www.youtube.com/watch?v=dU2TsHzQA60) 17 | 18 | ## Features 19 | * Hot .tag reload 20 | * Realtime code linting 21 | * Async/await (ES2017). 22 | * Exponentiation Operator (ES2016). 23 | * Object Rest/Spread Properties (stage 3 proposal). 24 | * Dynamic import() (stage 3 proposal) 25 | * Jest for .tag testing 26 | * Generate all favicons and manifest.json 27 | * Pre-commit testing 28 | 29 | ## Requirements 30 | nodejs 10 31 | and optionaly docker-compose, for deploy to ipfs 32 | 33 | ## ⚡ Start dev-server 34 | ``` 35 | git clone --depth=1 https://github.com/alexstep/create-riot-dapp my-riot-app 36 | cd my-riot-app 37 | rm -rf .git 38 | ``` 39 | 40 | ``` 41 | npm install 42 | npm start 43 | ``` 44 | go to http://localhost:9999 45 | 46 | ### Note 47 | Riot route base url set in ./src/view/app.view.js line 47 48 | 49 | 50 | ## ⚛ Favicons and meta-information 51 | Edit "meta" section in package.json ([see manifest format description](https://developer.mozilla.org/en-US/docs/Web/Manifest)) 52 | Put your app icon in ./src/favicon_source.svg or .png or other image format 53 | and run 54 | ``` 55 | npm run meta:generate 56 | ``` 57 | manifest.json , browserconfig.xml, favicons and other meta-files will be generated and put to ./public/static/meta/ folder. 58 | 59 | Also you can change some options in ./scripts/tools/metainfo/config.js 60 | 61 | 62 | 63 | ## ⚗ Build for production 64 | ``` 65 | npm run build 66 | ``` 67 | 68 | Check build result 69 | ``` 70 | npm run check_build 71 | ``` 72 | 73 | 74 | ## ☁ Deploy 75 | 76 | 77 | ### Firebase 78 | ``` 79 | npm run deploy 80 | ``` 81 | For example you can deploy app to [firebase](firebase.google.com) 82 | ``` 83 | npm install -g firebase-tools 84 | firebase login 85 | firebase init 86 | firebase deploy 87 | ``` 88 | 89 | ### Your server 90 | Change settings in scripts/tools/deploy_ssh 91 | Add this file to .gitignore 92 | ``` 93 | npm run deploy:ssh 94 | ``` 95 | [About tool](https://www.npmjs.com/package/ssh-deploy-release) 96 | 97 | 98 | # IPFS 99 | ``` 100 | npm run deploy:ipfs 101 | ``` 102 | Publish ./dist folder to [IPFS](https://ipfs.io) by defaults. 103 | Need insatlled docker-composes/tools/deploy_ipfs/docker-compose.yml 104 | 105 | 106 | ### ⚙ Configuration options 107 | 108 | Modify the ```.env``` file in the root of the generated project, and add any of the configuration options below 👇 to enable that feature. 109 | 110 | 111 | ## ☺ Contribute 112 | 113 | Fork and send pull-request. Thank you! 114 | 115 | 116 | -------------------------------------------------------------------------------- /src/_static/meta/head_meta.html: -------------------------------------------------------------------------------- 1 | 2 | RiotJS App 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-riot-app", 3 | "description": "RiotJS application", 4 | "version": "1.0.1", 5 | "author": "name ", 6 | "private": true, 7 | "engines": { 8 | "node": ">=10.0.0", 9 | "npm": ">=6.0.0" 10 | }, 11 | "meta": { 12 | "_": "It used for generate manifest.json in ./scripts/favicons.js", 13 | "start_url" : "/", 14 | "appName" : "RiotJS App", 15 | "appDescription" : "App description", 16 | "background" : "#1c2026", 17 | "theme_color" : "#1c2026", 18 | "display" : "standalone", 19 | "orientation" : "portrait" 20 | }, 21 | "scripts": { 22 | "preinstall" : "clear && echo '\n' && echo ' >> Install create-riot-app project ;)' && echo '\n\n' ", 23 | "macos_fixes" : "sudo ulimit -n 2200 && brew install watchman", 24 | 25 | "start" : "webpack-dev-server --mode development --config scripts/webpack/config.js --open --hot --history-api-fallback", 26 | 27 | "lesslint" : "lessc --lint src/view/styles/app.less ", 28 | "eslint_fix" : "eslint --fix --ext=.js,.tag ./src", 29 | "eslint" : "eslint --ext=.js,.tag ./src", 30 | 31 | "lint-staged" : "npx lint-staged", 32 | 33 | "test" : "", 34 | 35 | "meta:generate" : "cd ./scripts/tools/metainfo && npm i && npm start", 36 | "meta:clean" : "rm -rf ./src/_static/meta", 37 | 38 | "build" : "webpack --mode production --config scripts/webpack/config.js", 39 | "check_build" : "npx serve -s build -p 9000", 40 | 41 | "predeploy" : "npm run eslint", 42 | "deploy" : "npm run deploy:firebase", 43 | "deploy:firebase" : "cd ./scripts/tools/deploy_firebase && npm i && npm run deploy", 44 | "deploy:ssh" : "cd ./scripts/tools/deploy_ssh && npm i && npm run deploy", 45 | "deploy:ipfs" : "cd ./scripts/tools/deploy_ipfs && npm run deploy" 46 | }, 47 | 48 | "pre-commit": [ 49 | "lint-staged" 50 | ], 51 | "lint-staged": { 52 | "*.js": [ 53 | "eslint" 54 | ], 55 | "*.tag": [ 56 | "eslint" 57 | ], 58 | "*.less": [ 59 | "stylelint --syntax less" 60 | ], 61 | "*.scss": [ 62 | "stylelint --syntax scss" 63 | ], 64 | "*.css": [ 65 | "stylelint" 66 | ] 67 | }, 68 | 69 | "dependencies": { 70 | "hammerjs" : "^2.0.8", 71 | "jquery" : "^3.2.1", 72 | "riot" : "^3.12.0", 73 | "riot-route" : "^3.1.3" 74 | }, 75 | 76 | "devDependencies": { 77 | "@babel/core": "7.2.2", 78 | "@babel/preset-env": "7.2.3", 79 | "babel-loader": "8.0.5", 80 | "babel-minify-webpack-plugin": "0.3.1", 81 | "babel-plugin-syntax-dynamic-import": "6.18.0", 82 | "copy-webpack-plugin": "4.6.0", 83 | "css-loader": "2.1.0", 84 | "dotenv": "6.2.0", 85 | "pre-commit": "1.2.2", 86 | "eslint": "5.12.0", 87 | "eslint-config-standard": "12.0.0", 88 | "eslint-loader": "2.1.1", 89 | "eslint-plugin-import": "2.14.0", 90 | "eslint-plugin-node": "8.0.1", 91 | "eslint-plugin-promise": "4.0.1", 92 | "eslint-plugin-riot": "0.1.8", 93 | "eslint-plugin-standard": "4.0.0", 94 | "extract-text-webpack-plugin": "4.0.0-beta.0", 95 | "favicons-webpack-plugin": "0.0.9", 96 | "file-loader": "3.0.1", 97 | "html-webpack-plugin": "3.2.0", 98 | "less": "3.9.0", 99 | "less-loader": "4.1.0", 100 | "optimize-css-assets-webpack-plugin": "5.0.1", 101 | "riot-compiler": "3.5.3", 102 | "riot-hot-reload": "1.0.0", 103 | "riot-tag-loader": "2.1.0", 104 | "serviceworker-webpack-plugin": "1.0.1", 105 | "style-loader": "0.23.1", 106 | "stylelint": "9.9.0", 107 | "stylelint-webpack-plugin": "0.10.5", 108 | "stylus": "0.54.5", 109 | "stylus-loader": "3.0.2", 110 | "svg-inline-loader": "0.8.0", 111 | "uglifyjs-webpack-plugin": "2.1.1", 112 | "webpack": "4.28.4", 113 | "webpack-cli": "3.2.1", 114 | "webpack-dev-server": "3.1.14", 115 | "webpack-merge": "4.2.1" 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /src/model/ServiceWorker/SW.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Wrap for using service worker 3 | * https://github.com/oliviertassinari/serviceworker-webpack-plugin 4 | */ 5 | 6 | /* global ServiceWorkerRegistration Notification MessageChannel */ 7 | import runtime from 'serviceworker-webpack-plugin/lib/runtime' 8 | import registerEvents from 'serviceworker-webpack-plugin/lib/browser/registerEvents' 9 | import applyUpdate from 'serviceworker-webpack-plugin/lib/browser/applyUpdate' 10 | 11 | let SWReady 12 | 13 | let SW_supported = ('serviceWorker' in navigator) 14 | 15 | export default new class SW { 16 | constructor () { 17 | SW_supported = ('serviceWorker' in navigator) 18 | 19 | if (!SW_supported) { 20 | console.warn('Browser not support serviceWorkers') 21 | } 22 | } 23 | 24 | enabled () { 25 | return (navigator.serviceWorker && navigator.serviceWorker.controller) 26 | } 27 | 28 | register () { 29 | if (!SW_supported) return 30 | console.groupCollapsed('SW::register') 31 | 32 | SWReady = runtime.register({ scope: (process.env.APP_SW_SCOPE || '/') }) 33 | 34 | // let _this = this 35 | registerEvents(SWReady, { 36 | onInstalled () { 37 | console.log('SW onInstalled') 38 | setTimeout(window.location.reload, 999) 39 | }, 40 | onUpdateReady () { 41 | console.log('SW onUpdateReady') 42 | applyUpdate().then(() => { 43 | window.location.reload() 44 | }) 45 | }, 46 | onUpdating () { 47 | console.log('SW onUpdating') 48 | }, 49 | onUpdateFailed () { 50 | console.log('SW onUpdateFailed') 51 | }, 52 | onUpdated () { 53 | console.log('SW onUpdated') 54 | } 55 | }) 56 | 57 | console.groupEnd('SW::register') 58 | } 59 | 60 | delete () { 61 | if (!SW_supported) return 62 | 63 | return SWReady.then(serviceWorkerRegistration => { 64 | return serviceWorkerRegistration.unregister() 65 | }) 66 | } 67 | 68 | enablePush (callback) { 69 | if (!SW_supported) return 70 | 71 | if (!('showNotification' in ServiceWorkerRegistration.prototype)) { 72 | console.warn('Notifications aren\'t supported.') 73 | return 74 | } 75 | 76 | if (Notification.permission === 'denied') { 77 | console.warn('The user has blocked notifications.') 78 | return 79 | } 80 | 81 | if (!('PushManager' in window)) { 82 | console.warn('Push messaging isn\'t supported.') 83 | return 84 | } 85 | 86 | SWReady.then((serviceWorkerRegistration) => { 87 | serviceWorkerRegistration.pushManager.getSubscription().then((subscription) => { 88 | if (subscription) { 89 | return subscription 90 | } 91 | return serviceWorkerRegistration.pushManager.subscribe({ 92 | userVisibleOnly: true 93 | }) 94 | }).then(function (push_data) { 95 | callback(push_data) 96 | }) 97 | }) 98 | } 99 | 100 | /** 101 | * send msg to service worker 102 | * @param {[type]} message [description] 103 | * @param {Boolean} callback [description] 104 | * @return {[type]} [description] 105 | */ 106 | request (data, callback = false) { 107 | if (!this.enabled()) return false 108 | 109 | return new Promise(function (resolve, reject) { 110 | var messageChannel = new MessageChannel() 111 | messageChannel.port1.onmessage = function (event) { 112 | if (event.data.error) { 113 | reject(event.data.error) 114 | return 115 | } 116 | 117 | resolve(event.data) 118 | if (callback) callback(event.data) 119 | } 120 | 121 | navigator.serviceWorker.controller.postMessage(data, [messageChannel.port2]) 122 | }) 123 | } 124 | 125 | sendMessage (data) { 126 | if (!this.enabled()) return false 127 | 128 | var messageChannel = new MessageChannel() 129 | navigator.serviceWorker.controller.postMessage(data, [messageChannel.port2]) 130 | } 131 | onMessage (callback) { 132 | if (!SW_supported) return false 133 | 134 | navigator.serviceWorker.addEventListener('message', callback) 135 | } 136 | }() 137 | -------------------------------------------------------------------------------- /src/view/styles/reset/reset-reset.less: -------------------------------------------------------------------------------- 1 | /* Reset.less 2 | * Props to Eric Meyer (meyerweb.com) for his CSS reset file. We're using an adapted version here that cuts out some of the reset HTML elements we will never need here (i.e., dfn, samp, etc). 3 | * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */ 4 | 5 | // ERIC MEYER RESET 6 | // -------------------------------------------------- 7 | 8 | html, body { margin: 0; padding: 0; } 9 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, cite, code, del, dfn, em, img, q, s, samp, small, strike, strong, sub, sup, tt, var, dd, dl, dt, li, ol, ul, fieldset, form, label, legend, button, table, caption, tbody, tfoot, thead, tr, th, td { margin: 0; padding: 0; border: 0; font-weight: normal; font-style: normal; font-size: 100%; 10 | } 11 | table { border-collapse: collapse; border-spacing: 0; } 12 | ol, ul { list-style: none; } 13 | q:before, q:after, blockquote:before, blockquote:after { content: ""; } 14 | 15 | * { 16 | border-radius: 0; 17 | } 18 | 19 | // Normalize.css 20 | // Pulling in select resets form the normalize.css project 21 | // -------------------------------------------------- 22 | 23 | // Display in IE6-9 and FF3 24 | // ------------------------- 25 | // Source: http://github.com/necolas/normalize.css 26 | html { 27 | overflow-y: scroll; 28 | font-size: 100%; 29 | -webkit-text-size-adjust: 100%; 30 | -ms-text-size-adjust: 100%; 31 | } 32 | // Focus states 33 | a:focus { 34 | outline: thin dotted; 35 | } 36 | // Hover & Active 37 | a:hover, 38 | a:active { 39 | outline: 0; 40 | } 41 | 42 | // Display in IE6-9 and FF3 43 | // ------------------------- 44 | // Source: http://github.com/necolas/normalize.css 45 | article, 46 | aside, 47 | details, 48 | figcaption, 49 | figure, 50 | footer, 51 | header, 52 | hgroup, 53 | nav, 54 | section { 55 | display: block; 56 | } 57 | 58 | // Display block in IE6-9 and FF3 59 | // ------------------------- 60 | // Source: http://github.com/necolas/normalize.css 61 | audio, 62 | canvas, 63 | video { 64 | display: inline-block; 65 | display: inline; 66 | zoom: 1; 67 | } 68 | 69 | // Prevents modern browsers from displaying 'audio' without controls 70 | // ------------------------- 71 | // Source: http://github.com/necolas/normalize.css 72 | audio:not([controls]) { 73 | display: none; 74 | } 75 | 76 | // Prevents sub and sup affecting line-height in all browsers 77 | // ------------------------- 78 | // Source: http://github.com/necolas/normalize.css 79 | sub, 80 | sup { 81 | font-size: 75%; 82 | line-height: 0; 83 | position: relative; 84 | vertical-align: baseline; 85 | } 86 | sup { 87 | top: -0.5em; 88 | } 89 | sub { 90 | bottom: -0.25em; 91 | } 92 | 93 | // Img border in a's and image quality 94 | // ------------------------- 95 | // Source: http://github.com/necolas/normalize.css 96 | img { 97 | border: 0; 98 | -ms-interpolation-mode: bicubic; 99 | } 100 | 101 | // Forms 102 | // ------------------------- 103 | // Source: http://github.com/necolas/normalize.css 104 | 105 | // Font size in all browsers, margin changes, misc consistency 106 | button, 107 | input, 108 | select, 109 | textarea { 110 | font-size: 100%; 111 | margin: 0; 112 | vertical-align: baseline; 113 | } 114 | button, 115 | input { 116 | line-height: normal; // FF3/4 have !important on line-height in UA stylesheet 117 | } 118 | button::-moz-focus-inner, 119 | input::-moz-focus-inner { // Inner padding and border oddities in FF3/4 120 | border: 0; 121 | padding: 0; 122 | } 123 | button, 124 | input[type="button"], 125 | input[type="reset"], 126 | input[type="submit"] { 127 | cursor: pointer; // Cursors on all buttons applied consistently 128 | -webkit-appearance: button; // Style clicable inputs in iOS 129 | } 130 | input[type="search"] { // Appearance in Safari/Chrome 131 | -webkit-appearance: textfield; 132 | -webkit-box-sizing: content-box; 133 | -moz-box-sizing: content-box; 134 | box-sizing: content-box; 135 | } 136 | input[type="search"]::-webkit-search-decoration { 137 | -webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5 138 | } 139 | textarea { 140 | overflow: auto; // Remove vertical scrollbar in IE6-9 141 | vertical-align: top; // Readability and alignment cross-browser 142 | } 143 | 144 | -------------------------------------------------------------------------------- /src/view/components/drawer/drawer.tag: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 |
64 | 65 | 66 | 109 |
110 |
111 | 112 | 192 |
193 | -------------------------------------------------------------------------------- /scripts/tools/deploy_ssh/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | ansi-regex@^2.0.0: 6 | version "2.1.1" 7 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 8 | 9 | ansi-styles@^2.2.1: 10 | version "2.2.1" 11 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 12 | 13 | ansi-styles@^3.2.1: 14 | version "3.2.1" 15 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 16 | dependencies: 17 | color-convert "^1.9.0" 18 | 19 | archiver-utils@^1.3.0: 20 | version "1.3.0" 21 | resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174" 22 | dependencies: 23 | glob "^7.0.0" 24 | graceful-fs "^4.1.0" 25 | lazystream "^1.0.0" 26 | lodash "^4.8.0" 27 | normalize-path "^2.0.0" 28 | readable-stream "^2.0.0" 29 | 30 | archiver@^1.1.0: 31 | version "1.3.0" 32 | resolved "https://registry.yarnpkg.com/archiver/-/archiver-1.3.0.tgz#4f2194d6d8f99df3f531e6881f14f15d55faaf22" 33 | dependencies: 34 | archiver-utils "^1.3.0" 35 | async "^2.0.0" 36 | buffer-crc32 "^0.2.1" 37 | glob "^7.0.0" 38 | lodash "^4.8.0" 39 | readable-stream "^2.0.0" 40 | tar-stream "^1.5.0" 41 | walkdir "^0.0.11" 42 | zip-stream "^1.1.0" 43 | 44 | asn1@0.1.11: 45 | version "0.1.11" 46 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.1.11.tgz#559be18376d08a4ec4dbe80877d27818639b2df7" 47 | 48 | asn1@~0.2.0: 49 | version "0.2.4" 50 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 51 | dependencies: 52 | safer-buffer "~2.1.0" 53 | 54 | assertion-error@^1.0.1: 55 | version "1.1.0" 56 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 57 | 58 | async@^2.0.0, async@^2.1.4: 59 | version "2.6.1" 60 | resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" 61 | dependencies: 62 | lodash "^4.17.10" 63 | 64 | async@~0.2.9: 65 | version "0.2.10" 66 | resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" 67 | 68 | balanced-match@^1.0.0: 69 | version "1.0.0" 70 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 71 | 72 | base64-js@^1.0.2: 73 | version "1.3.0" 74 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" 75 | 76 | bl@^1.0.0: 77 | version "1.2.2" 78 | resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" 79 | dependencies: 80 | readable-stream "^2.3.5" 81 | safe-buffer "^5.1.1" 82 | 83 | brace-expansion@^1.1.7: 84 | version "1.1.11" 85 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 86 | dependencies: 87 | balanced-match "^1.0.0" 88 | concat-map "0.0.1" 89 | 90 | buffer-alloc-unsafe@^1.1.0: 91 | version "1.1.0" 92 | resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" 93 | 94 | buffer-alloc@^1.1.0: 95 | version "1.2.0" 96 | resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" 97 | dependencies: 98 | buffer-alloc-unsafe "^1.1.0" 99 | buffer-fill "^1.0.0" 100 | 101 | buffer-crc32@^0.2.1: 102 | version "0.2.13" 103 | resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" 104 | 105 | buffer-fill@^1.0.0: 106 | version "1.0.0" 107 | resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" 108 | 109 | buffer@^5.1.0: 110 | version "5.2.0" 111 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.0.tgz#53cf98241100099e9eeae20ee6d51d21b16e541e" 112 | dependencies: 113 | base64-js "^1.0.2" 114 | ieee754 "^1.1.4" 115 | 116 | chai@^3.5.0: 117 | version "3.5.0" 118 | resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" 119 | dependencies: 120 | assertion-error "^1.0.1" 121 | deep-eql "^0.1.3" 122 | type-detect "^1.0.0" 123 | 124 | chalk@^1.1.3: 125 | version "1.1.3" 126 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 127 | dependencies: 128 | ansi-styles "^2.2.1" 129 | escape-string-regexp "^1.0.2" 130 | has-ansi "^2.0.0" 131 | strip-ansi "^3.0.0" 132 | supports-color "^2.0.0" 133 | 134 | chalk@^2.0.1, chalk@^2.1.0: 135 | version "2.4.1" 136 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 137 | dependencies: 138 | ansi-styles "^3.2.1" 139 | escape-string-regexp "^1.0.5" 140 | supports-color "^5.3.0" 141 | 142 | cli-cursor@^2.1.0: 143 | version "2.1.0" 144 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 145 | dependencies: 146 | restore-cursor "^2.0.0" 147 | 148 | cli-spinners@^1.0.1: 149 | version "1.3.1" 150 | resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" 151 | 152 | color-convert@^1.9.0: 153 | version "1.9.2" 154 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" 155 | dependencies: 156 | color-name "1.1.1" 157 | 158 | color-name@1.1.1: 159 | version "1.1.1" 160 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" 161 | 162 | compress-commons@^1.2.0: 163 | version "1.2.2" 164 | resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f" 165 | dependencies: 166 | buffer-crc32 "^0.2.1" 167 | crc32-stream "^2.0.0" 168 | normalize-path "^2.0.0" 169 | readable-stream "^2.0.0" 170 | 171 | concat-map@0.0.1: 172 | version "0.0.1" 173 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 174 | 175 | core-util-is@~1.0.0: 176 | version "1.0.2" 177 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 178 | 179 | crc32-stream@^2.0.0: 180 | version "2.0.0" 181 | resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4" 182 | dependencies: 183 | crc "^3.4.4" 184 | readable-stream "^2.0.0" 185 | 186 | crc@^3.4.4: 187 | version "3.8.0" 188 | resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" 189 | dependencies: 190 | buffer "^5.1.0" 191 | 192 | deep-eql@^0.1.3: 193 | version "0.1.3" 194 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" 195 | dependencies: 196 | type-detect "0.1.1" 197 | 198 | end-of-stream@^1.0.0: 199 | version "1.4.1" 200 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" 201 | dependencies: 202 | once "^1.4.0" 203 | 204 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 205 | version "1.0.5" 206 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 207 | 208 | extend@^3.0.0: 209 | version "3.0.2" 210 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 211 | 212 | filesize@^3.3.0: 213 | version "3.6.1" 214 | resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" 215 | 216 | fs-constants@^1.0.0: 217 | version "1.0.0" 218 | resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" 219 | 220 | fs.realpath@^1.0.0: 221 | version "1.0.0" 222 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 223 | 224 | glob@^7.0.0: 225 | version "7.1.2" 226 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 227 | dependencies: 228 | fs.realpath "^1.0.0" 229 | inflight "^1.0.4" 230 | inherits "2" 231 | minimatch "^3.0.4" 232 | once "^1.3.0" 233 | path-is-absolute "^1.0.0" 234 | 235 | glob@~3.2.6: 236 | version "3.2.11" 237 | resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" 238 | dependencies: 239 | inherits "2" 240 | minimatch "0.3" 241 | 242 | graceful-fs@^4.1.0: 243 | version "4.1.11" 244 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 245 | 246 | has-ansi@^2.0.0: 247 | version "2.0.0" 248 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 249 | dependencies: 250 | ansi-regex "^2.0.0" 251 | 252 | has-flag@^3.0.0: 253 | version "3.0.0" 254 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 255 | 256 | ieee754@^1.1.4: 257 | version "1.1.12" 258 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" 259 | 260 | inflight@^1.0.4: 261 | version "1.0.6" 262 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 263 | dependencies: 264 | once "^1.3.0" 265 | wrappy "1" 266 | 267 | inherits@2, inherits@~2.0.3: 268 | version "2.0.3" 269 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 270 | 271 | isarray@~1.0.0: 272 | version "1.0.0" 273 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 274 | 275 | lazystream@^1.0.0: 276 | version "1.0.0" 277 | resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" 278 | dependencies: 279 | readable-stream "^2.0.5" 280 | 281 | lodash@^4.17.10, lodash@^4.17.4, lodash@^4.8.0: 282 | version "4.17.10" 283 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" 284 | 285 | lodash@~2.0.0: 286 | version "2.0.0" 287 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.0.0.tgz#9dcf9e3fac04ad0a38c9e2db69c9fb7ce26dabc2" 288 | 289 | log-symbols@^2.1.0: 290 | version "2.2.0" 291 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" 292 | dependencies: 293 | chalk "^2.0.1" 294 | 295 | lru-cache@2: 296 | version "2.7.3" 297 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" 298 | 299 | mimic-fn@^1.0.0: 300 | version "1.2.0" 301 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 302 | 303 | minimatch@0.3: 304 | version "0.3.0" 305 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" 306 | dependencies: 307 | lru-cache "2" 308 | sigmund "~1.0.0" 309 | 310 | minimatch@^3.0.4: 311 | version "3.0.4" 312 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 313 | dependencies: 314 | brace-expansion "^1.1.7" 315 | 316 | moment@^2.6.0: 317 | version "2.22.2" 318 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" 319 | 320 | normalize-path@^2.0.0: 321 | version "2.1.1" 322 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 323 | dependencies: 324 | remove-trailing-separator "^1.0.1" 325 | 326 | once@^1.3.0, once@^1.4.0: 327 | version "1.4.0" 328 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 329 | dependencies: 330 | wrappy "1" 331 | 332 | onetime@^2.0.0: 333 | version "2.0.1" 334 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 335 | dependencies: 336 | mimic-fn "^1.0.0" 337 | 338 | ora@^1.1.0: 339 | version "1.4.0" 340 | resolved "https://registry.yarnpkg.com/ora/-/ora-1.4.0.tgz#884458215b3a5d4097592285f93321bb7a79e2e5" 341 | dependencies: 342 | chalk "^2.1.0" 343 | cli-cursor "^2.1.0" 344 | cli-spinners "^1.0.1" 345 | log-symbols "^2.1.0" 346 | 347 | path-is-absolute@^1.0.0: 348 | version "1.0.1" 349 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 350 | 351 | process-nextick-args@~2.0.0: 352 | version "2.0.0" 353 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 354 | 355 | readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.3.0, readable-stream@^2.3.5: 356 | version "2.3.6" 357 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 358 | dependencies: 359 | core-util-is "~1.0.0" 360 | inherits "~2.0.3" 361 | isarray "~1.0.0" 362 | process-nextick-args "~2.0.0" 363 | safe-buffer "~5.1.1" 364 | string_decoder "~1.1.1" 365 | util-deprecate "~1.0.1" 366 | 367 | remove-trailing-separator@^1.0.1: 368 | version "1.1.0" 369 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 370 | 371 | restore-cursor@^2.0.0: 372 | version "2.0.0" 373 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 374 | dependencies: 375 | onetime "^2.0.0" 376 | signal-exit "^3.0.2" 377 | 378 | safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 379 | version "5.1.2" 380 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 381 | 382 | safer-buffer@~2.1.0: 383 | version "2.1.2" 384 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 385 | 386 | scp2@^0.1.4: 387 | version "0.1.4" 388 | resolved "https://registry.yarnpkg.com/scp2/-/scp2-0.1.4.tgz#1d747d8f9b1026191f76ae2cd864803cc48c0e0a" 389 | dependencies: 390 | async "~0.2.9" 391 | glob "~3.2.6" 392 | lodash "~2.0.0" 393 | ssh2 "~0.2.12" 394 | 395 | semver@^5.1.0: 396 | version "5.5.0" 397 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" 398 | 399 | sigmund@~1.0.0: 400 | version "1.0.1" 401 | resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" 402 | 403 | signal-exit@^3.0.2: 404 | version "3.0.2" 405 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 406 | 407 | ssh-deploy-release@^2.1.9: 408 | version "2.1.9" 409 | resolved "https://registry.yarnpkg.com/ssh-deploy-release/-/ssh-deploy-release-2.1.9.tgz#9a37e450614dd0fd8081839c55782f29fc1f6aab" 410 | dependencies: 411 | archiver "^1.1.0" 412 | async "^2.1.4" 413 | chai "^3.5.0" 414 | chalk "^1.1.3" 415 | extend "^3.0.0" 416 | filesize "^3.3.0" 417 | lodash "^4.17.4" 418 | moment "^2.6.0" 419 | ora "^1.1.0" 420 | scp2 "^0.1.4" 421 | ssh2 "^0.5.4" 422 | 423 | ssh2-streams@~0.1.18: 424 | version "0.1.20" 425 | resolved "https://registry.yarnpkg.com/ssh2-streams/-/ssh2-streams-0.1.20.tgz#51118d154555df5469ee1f67e0cf1e7e8a2c0e3a" 426 | dependencies: 427 | asn1 "~0.2.0" 428 | semver "^5.1.0" 429 | streamsearch "~0.1.2" 430 | 431 | ssh2@^0.5.4: 432 | version "0.5.5" 433 | resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-0.5.5.tgz#c7781ecd2ece7304a253cf620fab5a5c22bb2235" 434 | dependencies: 435 | ssh2-streams "~0.1.18" 436 | 437 | ssh2@~0.2.12: 438 | version "0.2.25" 439 | resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-0.2.25.tgz#2ed344a85e1ffea4d83ab2de85265e84b81691e5" 440 | dependencies: 441 | asn1 "0.1.11" 442 | streamsearch "0.1.2" 443 | 444 | streamsearch@0.1.2, streamsearch@~0.1.2: 445 | version "0.1.2" 446 | resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" 447 | 448 | string_decoder@~1.1.1: 449 | version "1.1.1" 450 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 451 | dependencies: 452 | safe-buffer "~5.1.0" 453 | 454 | strip-ansi@^3.0.0: 455 | version "3.0.1" 456 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 457 | dependencies: 458 | ansi-regex "^2.0.0" 459 | 460 | supports-color@^2.0.0: 461 | version "2.0.0" 462 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 463 | 464 | supports-color@^5.3.0: 465 | version "5.4.0" 466 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" 467 | dependencies: 468 | has-flag "^3.0.0" 469 | 470 | tar-stream@^1.5.0: 471 | version "1.6.1" 472 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395" 473 | dependencies: 474 | bl "^1.0.0" 475 | buffer-alloc "^1.1.0" 476 | end-of-stream "^1.0.0" 477 | fs-constants "^1.0.0" 478 | readable-stream "^2.3.0" 479 | to-buffer "^1.1.0" 480 | xtend "^4.0.0" 481 | 482 | to-buffer@^1.1.0: 483 | version "1.1.1" 484 | resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" 485 | 486 | type-detect@0.1.1: 487 | version "0.1.1" 488 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" 489 | 490 | type-detect@^1.0.0: 491 | version "1.0.0" 492 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" 493 | 494 | util-deprecate@~1.0.1: 495 | version "1.0.2" 496 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 497 | 498 | walkdir@^0.0.11: 499 | version "0.0.11" 500 | resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532" 501 | 502 | wrappy@1: 503 | version "1.0.2" 504 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 505 | 506 | xtend@^4.0.0: 507 | version "4.0.1" 508 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 509 | 510 | zip-stream@^1.1.0: 511 | version "1.2.0" 512 | resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04" 513 | dependencies: 514 | archiver-utils "^1.3.0" 515 | compress-commons "^1.2.0" 516 | lodash "^4.8.0" 517 | readable-stream "^2.0.0" 518 | --------------------------------------------------------------------------------