From c962909c0e5214fc34ab95e3561d65a463cf50fe Mon Sep 17 00:00:00 2001 From: Robin Linus Date: Wed, 22 Jun 2016 14:10:27 -0600 Subject: [PATCH] Cleanup unused files --- .travis.yml | 26 -- CONTRIBUTING.md | 72 ------ LICENSE.md | 2 +- app/elements/buddy-finder/buddy-avatar.html | 11 - app/elements/buddy-finder/buddy-finder.html | 1 - app/elements/elements.html | 4 +- .../file-sharing/file-selection-behavior.html | 1 - app/elements/p2p-network/binaryjs.html | 227 ------------------ app/elements/p2p-network/p2p-network.html | 1 - app/elements/p2p-network/web-socket.html | 1 - app/elements/routing.html | 38 --- app/elements/text-sharing/demo/index.html | 47 ---- app/elements/text-sharing/text-sharing.html | 0 app/elements/x-cards/settings-page.html | 6 - app/images/touch/JZH3ff5.png | Bin 33411 -> 0 bytes app/images/touch/snapdrop-icon copy.png | Bin 33411 -> 0 bytes app/index.html | 14 -- app/scripts/app.js | 12 +- app/styles/main.css | 26 -- app/sw-import.js | 9 - app/test/index.html | 32 --- app/test/my-greeting-basic.html | 50 ---- app/test/my-list-basic.html | 65 ----- docs/README.md | 8 - docs/add-es2015-support-babel.md | 129 ---------- docs/chrome-dev-editor.md | 52 ---- docs/deploy-to-firebase-pretty-urls.md | 67 ------ docs/deploy-to-github-pages.md | 23 -- docs/mobile-chrome-apps.md | 131 ---------- docs/polymer-perf.md | 100 -------- server/ws-server.js | 4 +- tasks/ensure-files.js | 34 --- travis-runner.sh | 18 -- 33 files changed, 5 insertions(+), 1206 deletions(-) delete mode 100644 .travis.yml delete mode 100644 CONTRIBUTING.md delete mode 100644 app/elements/routing.html delete mode 100644 app/elements/text-sharing/demo/index.html delete mode 100644 app/elements/text-sharing/text-sharing.html delete mode 100644 app/images/touch/JZH3ff5.png delete mode 100644 app/images/touch/snapdrop-icon copy.png delete mode 100644 app/test/index.html delete mode 100644 app/test/my-greeting-basic.html delete mode 100644 app/test/my-list-basic.html delete mode 100644 docs/README.md delete mode 100644 docs/add-es2015-support-babel.md delete mode 100644 docs/chrome-dev-editor.md delete mode 100644 docs/deploy-to-firebase-pretty-urls.md delete mode 100644 docs/deploy-to-github-pages.md delete mode 100644 docs/mobile-chrome-apps.md delete mode 100644 docs/polymer-perf.md delete mode 100644 tasks/ensure-files.js delete mode 100755 travis-runner.sh diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index b28f7f1..0000000 --- a/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -language: node_js -sudo: false -addons: - firefox: latest - apt: - sources: - - google-chrome - - ubuntu-toolchain-r-test - packages: - - google-chrome-stable - - g++-4.8 -node_js: - - '4.2' - - '5.1' -before_script: - - 'export DISPLAY=:99.0' - - sh -e /etc/init.d/xvfb start - - sleep 3 - - npm i -g bower gulp - - bower i -script: - - ./travis-runner.sh -env: - global: - - "CXX='g++-4.8'" - - secure: SbcQ7plU7aRGQlaAG2ffMhSvEs84073YSljOQ62DZAjRxgizMhF4xM7H2mPrmac9YRM4IBrQRvBKMMZy3L6OhN8gwpm8o+w2zV+5Q1fwpY9V8bilznnhp1JUY6jrB2l7aLTOFxt/cG+5ABxiupwWz/n+I7BaByYhBiHWntIBgDc528eecRNDYI5R36KWjLO/yr+SdElvyxDlDOdJGaluPvgMItbinFGcE1hYb/Jqrkkw8zpE6CTDmvMOq1aRBWSo9afgh2zDeKc02lTYP/4N0xcn8CqzHF7k5zGWHjN9DR8Ep8Bp1ff/sM7zHGZBqgVhn5WGv305jBQY6eOxiTp5cDP0WVIOjgJeM5rBu9hBQxhZSaMKBPr2B1NYUjIwTVQkBsnR4sr095Ugjg8JCZAmEevf/Ysl4CzQyW3gT+WcEluqjxUuicQWDclH6L/kOVPBJ+Eqdo/LY3G1tpLcc6fsvj4FlVO6LPTrbMyCagwQvnjX3uIdFyuthqtWWrHKQMGx2Ow9suNUi8Hyvk7WboS1Z6jrLIcs1rvXSX8rQmlMR5vJBK3Ejg6fS1OHxn/lrtLhj4lDLB9r/Fcu2PEHT1lcvQqsTa3W+t4Fk1qaShUlBDiwMbZWZgmlf1SdG5OzK1yrPLjTTdRFdqJGgb6TANCdetgczRWynvjIhr5IDMxvfJg= diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 7b10141..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,72 +0,0 @@ - - -# Polymer Elements -## Guide for Contributors - -Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines: - -### Filing Issues - -**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions: - - 1. **Who will use the feature?** _“As someone filling out a form…”_ - 2. **When will they use the feature?** _“When I enter an invalid value…”_ - 3. **What is the user’s goal?** _“I want to be visually notified that the value needs to be corrected…”_ - -**If you are filing an issue to report a bug**, please provide: - - 1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug: - - ```markdown - The `paper-foo` element causes the page to turn pink when clicked. - - ## Expected outcome - - The page stays the same color. - - ## Actual outcome - - The page turns pink. - - ## Steps to reproduce - - 1. Put a `paper-foo` element in the page. - 2. Open the page in a web browser. - 3. Click the `paper-foo` element. - ``` - - 2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [http://jsbin.com/cagaye](http://jsbin.com/cagaye/edit?html,output). - - 3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers. - -### Submitting Pull Requests - -**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request. - -When submitting pull requests, please provide: - - 1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues using the following syntax: - - ```markdown - (For a single issue) - Fixes #20 - - (For multiple issues) - Fixes #32, #40 - ``` - - 2. **A succinct description of the design** used to fix any related issues. For example: - - ```markdown - This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked. - ``` - - 3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered. - -If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so don’t be afraid to ask us if you need help with that! diff --git a/LICENSE.md b/LICENSE.md index bb3f440..e33fcf6 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -2,7 +2,7 @@ Everything in this repo is BSD style license unless otherwise specified. -Copyright (c) 2015 The Polymer Authors. All rights reserved. +Copyright (c) 2015 Robin Linus. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/app/elements/buddy-finder/buddy-avatar.html b/app/elements/buddy-finder/buddy-avatar.html index ab7f310..5c968c0 100644 --- a/app/elements/buddy-finder/buddy-avatar.html +++ b/app/elements/buddy-finder/buddy-avatar.html @@ -127,50 +127,39 @@ return status; }, attached: function() { - // var adsDialog = document.querySelector('#ads'); this.async(function() { app.conn.addEventListener('file-offered', function(e) { if (e.detail.to === this.contact.peerId) { this.status = 'Waiting to accept...'; - //adsDialog.open(); } }.bind(this), false); app.conn.addEventListener('upload-started', function(e) { if (e.detail.to === this.contact.peerId) { this.status = 'Uploading...'; - // adsDialog.setState('Uploading...'); } }.bind(this), false); app.conn.addEventListener('download-started', function(e) { if (e.detail.from === this.contact.peerId) { this.status = 'Downloading...'; - //adsDialog.open(); - // adsDialog.setState('Downloading...'); } }.bind(this), false); app.conn.addEventListener('upload-complete', function(e) { if (e.detail.from === this.contact.peerId) { this.status = this.defaultStatus; - adsDialog.setState('Transfer Complete'); - // adsDialog.close(); } }.bind(this), false); app.conn.addEventListener('download-complete', function(e) { if (e.detail.from === this.contact.peerId) { this.status = this.defaultStatus; - adsDialog.setState('Transfer Complete'); - // adsDialog.close(); } }.bind(this), false); app.conn.addEventListener('file-declined', function(e) { if (e.detail.from === this.contact.peerId) { this.status = this.defaultStatus; - // adsDialog.close(true); } }.bind(this), false); app.conn.addEventListener('upload-error', function(e) { this.status = this.defaultStatus; - // adsDialog.close(); }.bind(this), false); }, 200); } diff --git a/app/elements/buddy-finder/buddy-finder.html b/app/elements/buddy-finder/buddy-finder.html index 2701f73..455f533 100644 --- a/app/elements/buddy-finder/buddy-finder.html +++ b/app/elements/buddy-finder/buddy-finder.html @@ -167,7 +167,6 @@ var peerId = e.model.item.peerId; var file = e.detail; app.conn.sendFile(peerId, file); - //document.querySelector('#ads').open(); }, _computeShowExplanation: function(nBuddies) { if (!nBuddies || nBuddies === 0) { diff --git a/app/elements/elements.html b/app/elements/elements.html index d0c57b1..1a74c44 100644 --- a/app/elements/elements.html +++ b/app/elements/elements.html @@ -3,9 +3,7 @@ - + diff --git a/app/elements/file-sharing/file-selection-behavior.html b/app/elements/file-sharing/file-selection-behavior.html index 7f3167d..3641d55 100644 --- a/app/elements/file-sharing/file-selection-behavior.html +++ b/app/elements/file-sharing/file-selection-behavior.html @@ -8,7 +8,6 @@ Chat.FileSelectionBehavior = { return; } this._fileSelected(files[0]); //single select - //files.forEach(this._fileSelected.bind(this)); //multi-select }, _fileSelected: function(file) { if (file) { diff --git a/app/elements/p2p-network/binaryjs.html b/app/elements/p2p-network/binaryjs.html index 8dbd0c8..7d9160f 100644 --- a/app/elements/p2p-network/binaryjs.html +++ b/app/elements/p2p-network/binaryjs.html @@ -982,234 +982,7 @@ BlobReadStream.prototype._emitReadChunk = function(){ }; -/* - - - -function BlobWriteStream(options){ - - stream.Stream.call(this); - - options = _.extend({ - onFull: onFull, - onEnd: function(){}, - minBlockAllocSize: 0, - drainDelay:0 - }, options); - - this._onFull = options.onFull; - this._onEnd = options.onEnd; - this._onWrite = options.onWrite; - - this._minBlockAllocSize = options.minBlockAllocSize; - this._maxBlockAllocSize = options.maxBlockAllocSize; - this._drainDelay = options.drainDelay; - - this._buffer = new Buffer(options.minBlockAllocSize); - this._destination = this._buffer; - this._destinationPos = 0; - - this._writeQueue = []; - this._pendingOnFull = false; - this._pendingQueueDrain = false; - - this.writable = true; - this.bytesWritten = 0; -} - -util.inherits(BlobWriteStream, stream.Stream); - -BlobWriteStream.prototype.getBuffer = function(){ - return this._buffer; -}; - -BlobWriteStream.prototype.write = function(data, encoding){ - - if(!this.writable){ - throw new Error("stream is not writable"); - } - - if(!Buffer.isBuffer(data)){ - data = new Buffer(data, encoding); - } - - if(data.length){ - this._writeQueue.push(data); - } - - this._commit(); - - return this._writeQueue.length === 0; -}; - -BlobWriteStream.prototype._commit = function(){ - - var self = this; - - var destination = this._destination; - var writeQueue = this._writeQueue; - - var startDestinationPos = this._destinationPos; - - while(writeQueue.length && destination.length){ - - var head = writeQueue[0]; - - var copySize = Math.min(destination.length, head.length); - - head.copy(destination, 0, 0, copySize); - - head = head.slice(copySize); - destination = destination.slice(copySize); - - this.bytesWritten += copySize; - this._destinationPos += copySize; - - if(head.length === 0){ - writeQueue.shift(); - } - else{ - writeQueue[0] = head; - } - } - - this._destination = destination; - - bytesCommitted = this._destinationPos - startDestinationPos; - if(bytesCommitted){ - if(this._onWrite){ - - if(writeQueue.length){ - this._pendingQueueDrain = true; - } - - // By locking destination the buffer is frozen and the onWrite - // callback cannot miss any write commits - this._destination = emptyBuffer; - - var consumer = this._onWrite; - this._onWrite = null; - - consumer.call(this, function(nextCallback){ - util.setZeroTimeout(function(){ - self._destination = destination; - self._onWrite = nextCallback; - self._commit(); - }); - }, consumer); - - return; - } - } - - if(writeQueue.length){ - - this._pendingQueueDrain = true; - this._growBuffer(); - } - else if(this._pendingQueueDrain){ - - this._pendingQueueDrain = false; - - if(this._drainDelay !== 0){ - setTimeout(function(){ - self.emit("drain"); - }, this._drainDelay); - } - else{ - util.setZeroTimeout(function(){ - self.emit("drain"); - }); - } - } -}; - -BlobWriteStream.prototype._growBuffer = function(){ - - var self = this; - var writeQueue = this._writeQueue; - - var requestSize = this._minBlockAllocSize; - - var maxBlockAllocSize = this._maxBlockAllocSize; - var add = (maxBlockAllocSize === undefined ? function(a, b){return a + b;} : function(a, b){return Math.min(a + b, maxBlockAllocSize);}); - - for(var i = 0, queueLength = writeQueue.length; i < queueLength; i++){ - requestSize = add(requestSize, writeQueue[i].length); - } - - // Prevent concurrent onFull callbacks - if(this._pendingOnFull){ - return; - } - this._pendingOnFull = true; - - this._onFull(this._buffer, requestSize, function(buffer, destination){ - util.setZeroTimeout(function(){ - - self._pendingOnFull = false; - - if(!destination){ - if(self.writable){ - self.emit("error", new Error("buffer is full")); - } - self.destroy(); - return; - } - - self._buffer = buffer; - self._destination = destination; - - self._commit(); - }); - }); -}; - -BlobWriteStream.prototype.end = function(data, encoding){ - - var self = this; - - function _end(){ - self.writable = false; - self._onEnd(); - } - - if(data){ - if(this.write(data, encoding)){ - _end(); - }else{ - self.writable = false; - this.once("drain", _end); - } - } - else{ - _end(); - } -}; - -BlobWriteStream.prototype.destroy = function(){ - this.writable = false; - this._pendingQueueDrain = false; - this._writeQueue = []; -}; - -BlobWriteStream.prototype.consume = function(consume){ - - this._buffer = this._buffer.slice(consume); - this._destinationPos -= consume; -}; - -BlobWriteStream.prototype.getCommittedSlice = function(){ - return this._buffer.slice(0, this._destinationPos); -}; - -function onFull(buffer, extraSize, callback){ - var newBuffer = new Buffer(buffer.length + extraSize); - buffer.copy(newBuffer); - callback(newBuffer, newBuffer.slice(buffer.length)); -} -*/ exports.BlobReadStream = BlobReadStream; function BinaryStream(socket, id, create, meta) { diff --git a/app/elements/p2p-network/p2p-network.html b/app/elements/p2p-network/p2p-network.html index 2235917..0cfea0f 100644 --- a/app/elements/p2p-network/p2p-network.html +++ b/app/elements/p2p-network/p2p-network.html @@ -109,7 +109,6 @@ console.log(err); if (err.message.indexOf('Connection is not open') > -1) { console.error('Handle this error!!', err); - //this.connectToPeer(requestedPeer, callback); } }.bind(this)); diff --git a/app/elements/p2p-network/web-socket.html b/app/elements/p2p-network/web-socket.html index 3471796..5e76e16 100644 --- a/app/elements/p2p-network/web-socket.html +++ b/app/elements/p2p-network/web-socket.html @@ -33,7 +33,6 @@ parts.push(data); } }.bind(this)); - // when finished, set it as the background image stream.on('end', function() { var blob = new Blob(parts, { type: meta.type diff --git a/app/elements/routing.html b/app/elements/routing.html deleted file mode 100644 index 73936f3..0000000 --- a/app/elements/routing.html +++ /dev/null @@ -1,38 +0,0 @@ - - diff --git a/app/elements/text-sharing/demo/index.html b/app/elements/text-sharing/demo/index.html deleted file mode 100644 index dd6a607..0000000 --- a/app/elements/text-sharing/demo/index.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - paper-dialog demo - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/elements/text-sharing/text-sharing.html b/app/elements/text-sharing/text-sharing.html deleted file mode 100644 index e69de29..0000000 diff --git a/app/elements/x-cards/settings-page.html b/app/elements/x-cards/settings-page.html index aa9ad33..6998358 100644 --- a/app/elements/x-cards/settings-page.html +++ b/app/elements/x-cards/settings-page.html @@ -13,12 +13,6 @@ background-color: #4285f4; @apply(--layout-fit); } - /* paper-icon-button { - position: absolute; - top: 16px; - right: 16px; - z-index: 2; - }*/ #container { @apply(--layout-fit); diff --git a/app/images/touch/JZH3ff5.png b/app/images/touch/JZH3ff5.png deleted file mode 100644 index 2094dd09020f3b2f3720c6c5664350c1de7c79af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33411 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 diff --git a/app/images/touch/snapdrop-icon copy.png b/app/images/touch/snapdrop-icon copy.png deleted file mode 100644 index 2094dd09020f3b2f3720c6c5664350c1de7c79af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33411 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 diff --git a/app/index.html b/app/index.html index c4d77af..59b6dc1 100644 --- a/app/index.html +++ b/app/index.html @@ -95,20 +95,6 @@ ga('create', 'UA-71686975-1', 'auto'); ga('send', 'pageview'); - diff --git a/app/scripts/app.js b/app/scripts/app.js index b34034f..0abc572 100644 --- a/app/scripts/app.js +++ b/app/scripts/app.js @@ -1,18 +1,11 @@ (function(document) { 'use strict'; - // Grab a reference to our auto-binding template - // and give it some initial binding values - // Learn more about auto-binding templates at http://goo.gl/Dx1u2g var app = document.querySelector('#app'); // Sets app default base URL app.baseUrl = '/'; - if (window.location.port === '') { // if production - // Uncomment app.baseURL below and - // set app.baseURL to '/your-pathname/' if running from folder in production - // app.baseUrl = '/polymer-starter-kit/'; - } + // don't display the install prompt if the user has *already* installed window.addEventListener('beforeinstallprompt', function(event) { @@ -48,9 +41,6 @@ }); - app._showAbout=function(){ - document.querySelector('#pages').select(1); - }; app._showAbout=function(){ document.querySelector('#pages').select(0); }; diff --git a/app/styles/main.css b/app/styles/main.css index 53e5ee1..fffab6b 100644 --- a/app/styles/main.css +++ b/app/styles/main.css @@ -14,29 +14,3 @@ body { overflow-x: hidden; } -#ads, -#ads2 { - display: none; -} - -@media screen and (min-width: 520px) { - #ads { - display: block; - position: absolute; - top: 8px; - left: 50%; - margin-left: -150px; - } -} - -@media screen and (min-width: 720px) { - #ads{ - display: none; - } - #ads2 { - display: block; - position: absolute; - bottom: 4px; - left: 4px; - } -} diff --git a/app/sw-import.js b/app/sw-import.js index cb7fb1f..f3a1a00 100644 --- a/app/sw-import.js +++ b/app/sw-import.js @@ -1,10 +1 @@ -/* -Copyright (c) 2015 The Polymer Project Authors. All rights reserved. -This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt -The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt -The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt -Code distributed by Google as part of the polymer project is also -subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt -*/ - importScripts('bower_components/platinum-sw/service-worker.js'); diff --git a/app/test/index.html b/app/test/index.html deleted file mode 100644 index d9b4199..0000000 --- a/app/test/index.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - Elements Test Runner - - - - - - - - - - - - - - diff --git a/app/test/my-greeting-basic.html b/app/test/my-greeting-basic.html deleted file mode 100644 index a9a24ef..0000000 --- a/app/test/my-greeting-basic.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - my-greeting-basic - - - - - - - - - - - - - - - - - - diff --git a/app/test/my-list-basic.html b/app/test/my-list-basic.html deleted file mode 100644 index 96ac866..0000000 --- a/app/test/my-list-basic.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - my-list-basic - - - - - - - - - - - - - - - - - - diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 63b2583..0000000 --- a/docs/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Recipes - -* [Add ES2015 (formally ES6) support using Babel](add-es2015-support-babel.md) -* [Polymer Performance Recipe](polymer-perf.md) -* [Use PSK with Chrome Dev Editor](chrome-dev-editor.md) -* [Deploy to Github Pages](deploy-to-github-pages.md) -* [Deploy to Firebase using Pretty URLs](deploy-to-firebase-pretty-urls.md) -* [Use PSK for Mobile Chrome Apps](mobile-chrome-apps.md) diff --git a/docs/add-es2015-support-babel.md b/docs/add-es2015-support-babel.md deleted file mode 100644 index 64eb1bc..0000000 --- a/docs/add-es2015-support-babel.md +++ /dev/null @@ -1,129 +0,0 @@ -# Add ES2015 support through Babel - -Although support for ES2015 (formerly ES6) is improving in modern browsers, the majority do not yet support the full set of features. To benefit from the awesomeness of the new ES2015 syntax while keeping backwards compatibility with Polymer's supported browsers, you'll need to transpile your JS code from ES2015 to ES5 - -This recipe focuses on adding an ES2015 to ES5 transpile step to Share With Me's build pipeline using [BabelJS](https://babeljs.io/). - - -## Create a transpile gulp task - -- Install the gulp Babel, Sourcemap, Crisper plugins and Babel ES2015 preset: `npm install --save-dev gulp-babel gulp-sourcemaps gulp-crisper babel-preset-es2015` -- Add the following gulp task in the `gulpfile.js` file: - -```patch -+ // Transpile all JS to ES5. -+ gulp.task('js', function () { -+ return gulp.src(['app/**/*.{js,html}', '!app/bower_components/**/*']) -+ .pipe($.sourcemaps.init()) -+ .pipe($.if('*.html', $.crisper({scriptInHead:false}))) // Extract JS from .html files -+ .pipe($.if('*.js', $.babel({ -+ presets: ['es2015'] -+ }))) -+ .pipe($.sourcemaps.write('.')) -+ .pipe(gulp.dest('.tmp/')) -+ .pipe(gulp.dest(dist())); -+ }); -``` - -This task will transpile all JS files and inline JS inside HTML files and also generate sourcemaps. The resulting files are generated in the `.tmp` and the `dist` folders - -[Crisper](https://github.com/PolymerLabs/crisper) extracts JavaScript that's inline to HTML files (such as imports). We need this as Babel does not support transpiling HTML files such as ` -``` diff --git a/docs/chrome-dev-editor.md b/docs/chrome-dev-editor.md deleted file mode 100644 index d4e3cbb..0000000 --- a/docs/chrome-dev-editor.md +++ /dev/null @@ -1,52 +0,0 @@ -# Use Share With Me on Chrome Dev Editor - -If you are using a Chromebook, one of the few IDE you can use is [Chrome Dev Editor](https://github.com/GoogleChrome/chromedeveditor). - -To use the Share With Me you have to download the [latest release](https://github.com/PolymerElements/polymer-starter-kit/releases) in the `light` flavor (the additional tools can't be used from CDE). - -After downloading the `polymer-starter-kit-light-*.zip` file unpack it in a new folder (for Example `psk-light`) you should have a directory structure like - -![psk-light-folder-p1](https://cloud.githubusercontent.com/assets/1431346/9451900/a73ffcf2-4ab1-11e5-8742-e0b5523ba9d5.png) - - -Before opening the folder inside CDE, we need to move the file `bower.json` to `app/bower.json`, this way running `Bower Update` from CDE's menu, will place the updated packages in `app/bower_components` - -![bower json-post](https://cloud.githubusercontent.com/assets/1431346/9452119/c5826a46-4ab2-11e5-96c5-00cf404d9c50.png) - - -We can now `Open Folder...` inside CDE and start renaming the file `app/manifest.json` to `app/web-app-manifest.json`, followed by updating the link to it in the file `app/index.html` - -![manifest json](https://cloud.githubusercontent.com/assets/1431346/9452182/27e41478-4ab3-11e5-8e40-d7c0f1249feb.png) - - -*This change is needed because `manifest.json` is interpreted by CDE as a [Chrome Apps Manifest](https://developer.chrome.com/extensions/manifest) and the [web app manifest](https://w3c.github.io/manifest/) is slightly different* - -Open `app/elements/routing.html` and add the following code after the last route: - -```javascript -page('*', function () { - app.route = 'home'; -}); -``` - -After the change, the code will look like the following: - -```javascript -... -page('/contact', function () { - app.route = 'contact'; -}); - -page('*', function () { - app.route = 'home'; -}); - -// add #! before urls -page({ - hashbang: true -}); -... -``` - - -Select `app/index.html` and hit run (or press CTRL+R) to see the application running in the browser. diff --git a/docs/deploy-to-firebase-pretty-urls.md b/docs/deploy-to-firebase-pretty-urls.md deleted file mode 100644 index 20e45f6..0000000 --- a/docs/deploy-to-firebase-pretty-urls.md +++ /dev/null @@ -1,67 +0,0 @@ -# Deploy to Firebase using Pretty URLs - -Firebase is a very simple and secure way to deploy a Share With Me site. You can sign up for a free account and deploy your application in less than 5 minutes. - -The instructions below are based on the [Firebase hosting quick start -guide](https://www.firebase.com/docs/hosting/quickstart.html). - -1. [Sign up for a Firebase account](https://www.firebase.com/signup/) - -1. Install the Firebase command line tools - - npm install -g firebase-tools - - The `-g` flag instructs `npm` to install the package globally so that you - can use the `firebase` command from any directory. You may need - to install the package with `sudo` privileges. - -1. `cd` into your project directory - -1. Inititalize the Firebase application - - firebase init - - Firebase asks you which app you would like to use for hosting. If you just - signed up, you should see one app with a randomly-generated name. You can - use that one. Otherwise go to - [https://www.firebase.com/account](https://www.firebase.com/account) to - create a new app. - -1. Firebase asks you the name of your app's public directory. Enter `dist`. - This works because when you run `gulp` to build your application, PSK - builds everything and places it all in `dist`. So `dist` contains - everything your application needs to run. - -1. Edit firebase.json add rewrites section - - { - "firebase": "polymer-starter-kit", - "public": "dist", - "ignore": [ - "firebase.json", - "**/.*", - "**/node_modules/**" - ], - "rewrites": [ { - "source": "**", - "destination": "/index.html" - } ] - } - -1. Add `` to `head` in index.html - -1. Remove `hashbang: true` in routing.html near bottom. The call to `page` should look like this now: - - page(); - -1. Build - - gulp - -1. Deploy - - firebase deploy - - The URL to your live site is listed in the output. - -You can see a demo of Share With Me hosted on Firebase using pretty URLs at https://polymer-starter-kit.firebaseapp.com. diff --git a/docs/deploy-to-github-pages.md b/docs/deploy-to-github-pages.md deleted file mode 100644 index c2c35fc..0000000 --- a/docs/deploy-to-github-pages.md +++ /dev/null @@ -1,23 +0,0 @@ -# Deploy to Github Pages - -You can deploy to github pages with a couple minor changes to Share With Me: - -1. Uncomment this line `// app.baseUrl = '/polymer-starter-kit/';` in app.js near the top - - ```JavaScript - // Sets app default base URL - app.baseUrl = '/'; - if (window.location.port === '') { // if production - // Uncomment app.baseURL below and - // set app.baseURL to '/your-pathname/' if running from folder in production - // app.baseUrl = '/polymer-starter-kit/'; - } - ``` -2. Change `app.baseUrl = '/polymer-starter-kit/';` to `app.baseUrl = '/your-pathname/';` (ex: if you repo is `github.com/username/bobs-awesome-site` you would change this to `bobs-awesome-site`) -3. Run `gulp build-deploy-gh-pages` from command line -4. To see changes wait 1-2 minutes then load Github pages for your app (ex: http://polymerelements.github.io/polymer-starter-kit) - -### Notes - -* When deploying to Github Pages we recommend using hashbangs which is Share With Me default. -* This method should work for most hosting providers when using a subfolder. diff --git a/docs/mobile-chrome-apps.md b/docs/mobile-chrome-apps.md deleted file mode 100644 index d18ddb1..0000000 --- a/docs/mobile-chrome-apps.md +++ /dev/null @@ -1,131 +0,0 @@ -# Use Share With Me for [Mobile Chrome Apps](https://github.com/MobileChromeApps/mobile-chrome-apps) - -## Getting started - -Share With Me could be fully adapted to Mobile Chrome Apps through mobile-friendly features. Mobile Chrome Apps, is based on Apache Cordova, and requires mobile application SDKs such as Android and iOS. so please make sure that installation development tool by following [installation guide](https://github.com/MobileChromeApps/mobile-chrome-apps/blob/master/docs/Installation.md) of Mobile Chrome Apps. And then, You do some further steps to resolve some of restrictions and configurations to use Share With Me on Cordova. Looking for a [guide video](https://www.youtube.com/watch?v=-ifgyobPLVg) below to better understand. - -[![](https://camo.githubusercontent.com/7c498c4d60113dd1ea072576df897283100428b6/687474703a2f2f696d672e796f75747562652e636f6d2f76692f2d696667796f62504c56672f302e6a7067)](https://www.youtube.com/watch?v=-ifgyobPLVg) - -## Download Share With Me into your workspace - -To download and preparation, follow this [guide of Share With Me](https://github.com/PolymerElements/polymer-starter-kit#getting-started). Make sure that install all of dependencies of npm and Bower. - -## Create a Cordova project - -Create a Cordova project in path `polymer-starter-kit` by following command. `platform` is the path for Cordova project files, `com.your.app` is the project name/id and next following string is the description for your app. - -```sh -cca create platform com.your.app "Your Share With Me App" -``` - -If you have no problems while creating a project you will seeing the message of installing successful coming from Cordova and have the tree of the project below. - -```sh -└── polymer-starter-kit - └── app - │   ├── elements - │   ├── images - │   ├── index.html - │   ├── manifest.json - │   ├── scripts - │   ├── styles - │   └── test - ├── bower.json - ├── bower_components - ├── docs - ├── gulpfile.js - ├── node_modules - ├── package.json - ├── platform - │   ├── config.xml - │   ├── hooks - │   ├── platforms - │   ├── plugins - │   └── www -``` - -For further informations of Cordova, please visit [corodova document](https://github.com/MobileChromeApps/mobile-chrome-apps/tree/master/docs) - -## Configuration - -You need to have some changes of configuration to fit for Mobile Chrome Apps as it was mentioned above. - -### Configure path for app built by gulp - -- Change the path `dist` in `gulpfile.js` from `dist` to `platform/www/app`, then the app built with Share With Me will be placed under `platform/www` will be used by Cordova. - ```js - var DIST = 'platform/www/app'; - ``` - -- Change the path in `platform/www/background.js` into new path - ```js - chrome.app.runtime.onLaunched.addListener(function() { - chrome.app.window.create('app/index.html', { - width: 244, - height: 380, - }); - }); - ``` - -- Add path `/app` to `app.baseURL` in `app/scripts/app.js'. `platform/www` is root path of app that will prevent errors coming from page routing. - ```js - app.baseUrl = '/app'; - ``` - -### Update gulp tasks - -- Using `polybuild(vulcanize + crisper)` task is mandatory because of Chrome Apps doesn't allow inline script blocks according to [CSP](https://developer.chrome.com/apps/contentSecurityPolicy). You should replace current `vulcanize` task with new task below. To do this install `polybuild` first with `npm install --save-dev polybuild` command - ```js - // load polybuild - var polybuild = require('polybuild'); - - // Vulcanize granular configuration - gulp.task('vulcanize', function() { - return gulp.src('app/elements/elements.html') - .pipe(polybuild({maximumCrush: true})) - .pipe($.rename(function(file) { - if (file.extname === '.html') { - file.basename = file.basename.replace('.build', ''); - } - })) - .pipe(gulp.dest(dist('elements'))) - .pipe($.size({title: 'vulcanize'})); - }); - ``` - -### More updates - -- Remove useless files generated from Cordova. - ```sh - rm platform/www/index.* - ``` -- To complete first route for `home` you need to put try/catch block into the first route code on starting app, in `app/elements/routing.html`, because Chrome Apps doesn't allow using `history` APIs which related to error message `history.pushState/replaceState is not available in packaged apps`. - ```js - try { - page({ - hashbang: true - }); - } catch (e) { - app.route = 'home'; - } - ``` - -- Using `@import` instead of `link` to download external Google robot fonts which is related to `Refused to load the stylesheet` errors. Update code in `bower_components/font-roboto/roboto.html` to using `@import` code below - ``` - @import url(https://fonts.googleapis.com/css?family=Roboto:400,300,300italic,400italic,500,500italic,700,700italic); - @import url(https://fonts.googleapis.com/css?family=Roboto+Mono:400,700); - ``` - -## Build and run app - -After done of above steps. run this command on root path that let you see Chrome Apps built with Share With Me. - -```sh -gulp && cd platform && cca run chrome -``` - -or to run on Android emulator or devices - -```sh -gulp && cd platform && cca run android -``` diff --git a/docs/polymer-perf.md b/docs/polymer-perf.md deleted file mode 100644 index da6b05f..0000000 --- a/docs/polymer-perf.md +++ /dev/null @@ -1,100 +0,0 @@ -### Polymer Performance Recipe - -In the following write up we are going to take a look at how to optimize the loading of Web Component enabled websites. The goal here is not to give you a copy and paste approach, but rather to give you the starting components and thought process with how to optimize your web app given your domain constraints. - -Current native support for Web Components is limited but growing, with only Chrome and Opera having a “fully" implemented spec. Due to the limited support, using Polymer or any web components in production across more than just chrome requires you to load a polyfill. As with any polyfill there is a performance tradeoff, in the run time performance, spec compliance, as well as the network cost overhead. Lets dive into a few approaches that you can use to conditionally load the polyfill only when it is required. - -The first step in conditionally loading the Web Component polyfill is detecting whether or not the environment that we are in supports the features that are required. - -Over in GitHub land @geenlen has cooked up a nifty technique bit of code to do this work for us: - -```js -var webComponentsSupported = ('registerElement' in document - && 'import' in document.createElement('link') - && 'content' in document.createElement('template')); -``` - -Once we know if things are supported or not we can then dynamically load our polyfill and then load up our custom elements so that our app will be able to properly upgrade our custom elements. - -```js -if (webComponentsSupported) { - loadElements(); -} else { - loadWebComponentPolyfill(loadElements) -} -``` - -This bit of code can be placed directly in [`app.js`](https://github.com/PolymerElements/polymer-starter-kit/blob/master/app/scripts/app.js), right under the beginning of the IIFE. - -Now that we have our initial sniff and load call, let’s take a look at the code for `loadWebComponentPolyfill`, and how exactly it works. - -```js -function loadWebComponentPolyfill(cb) { - var polyfill = document.createElement('script'); - polyfill.onload = cb || null; - polyfill.src = 'webcomponents-lite.min.js'; - document.head.appendChild(polyfill); -} -``` - -So what is going on here, how does it work? The first thing that this method does is dynamically create a script tag, then conditionally assign a callback when the resource loads, the code then sets the src of the script tag, and then injects the script tag into the head of our document. Once the tag is placed inside of our document, the network request will start and the resource is fully downloaded the callback will be invoked. - -Awesome! So now let’s move onto the logic around `loadElements`. - -You might be wondering why `loadElements` is even needed? Why can we not just `` directly in our html. The reason why `loadElements` is needed is because we are loading the webComponents polyfill async to the initial page load, therefore we can not assume that our import statements will always work across browsers and browser versions, rather we need to explicitly call into loadElements only after we are sure the current environment supports webComponents (even if we have to polyfill it first). - -```js -function loadElements() { - var bundle = document.createElement('link'); - bundle.rel = 'import'; - bundle.href = 'elements/path_to_bundle.html'; - - document.head.appendChild(bundle); -} -``` - -`loadElements` follows a very similar pattern as `loadWebComponentPolyfill`, only this time we are dynamically injecting a link tag into our head that will load our element bundle. Now that we have both of these methods defined, we are left with a very basic example of loading our polyfill and element async to the `window.onload` event. - -This approach opens up the possibility for you to only have users download the elements that they need for specific pages in your app. Consider for instance an application with an admin panel and a general app view. Given the fact that most users in our made up app do not go to the admin panel too often, there is no need for them to always incur the cost of downloading the admin suite of elements. Instead we will only have users download the “bundle" that they need depending on what page they enter on. - -For example with page.js your router could be structured as follows to optimize page load time, given a few assumptions about how users will be interacting with your app. - -```js -page.on('admin', ensureWebComponentSupport, function() { - loadElementBundle('admin'); - renderAdminPane(); -}); -``` - -#### Further Thoughts - -With Polymer, it is easy to fall into the trap of getting a flash of unstyled content, or a blank page while the polyfill and elements are downloading. The best way to avoid these pitfalls is to use a "loading" screen approach. The simplest of the loading approach to create a "splash" screen to display while your elements bundle is downloading. - -You can easily modify `loadElements` to enable this type of behavior. - -```js -function loadElements() { - document.body.innerHTML = '
'; - bundle.rel = 'import'; - bundle.href = 'elements/path_to_bundle.html'; - bundle.onload = function() { - document.body.innerHTML = ''; - }; - - document.head.appendChild(bundle); -} -``` - -You can take this concept of a loading screen one step further by instead of showing a loading screen show a screen that looks like a lite version of your app. By this I mean simple shapes and blocks that match the color and blocks of your app once your elements are fully upgraded, so that your user has a faster perceived loading time. - -Hopefully these approaches give you some ideas on how to make your app lightning fast. - -We hope to explore further ideas including [application shells](https://github.com/ebidel/polymer-experiments/blob/master/polymersummit/fouc/appshell.html) and being smart about your first meaningful paint in the near future. - --------- - -Further reading - -* [Fast Polymer app loading](https://gist.github.com/ebidel/1ba71473d687d0567bd3) from Eric Bidelman -* [Polymer Perf Patterns](https://www.youtube.com/watch?v=Yr84DpNaMfk) from Eric Bidelman -* [Polymer for the Performance-obsessed](https://aerotwist.com/blog/polymer-for-the-performance-obsessed/) from Paul Lewis diff --git a/server/ws-server.js b/server/ws-server.js index f998ebc..c067053 100644 --- a/server/ws-server.js +++ b/server/ws-server.js @@ -50,8 +50,8 @@ exports.create = function(server) { client.uuidRaw = guid(); //ip is hashed to prevent injections by spoofing the 'x-forwarded-for' header - client.hashedIp = 1; - // client.hashedIp = hash(getIP(client._socket)); + // client.hashedIp = 1; //use this to test locally + client.hashedIp = hash(getIP(client._socket)); client.deviceName = getDeviceName(client._socket.upgradeReq); diff --git a/tasks/ensure-files.js b/tasks/ensure-files.js deleted file mode 100644 index 48fa4c0..0000000 --- a/tasks/ensure-files.js +++ /dev/null @@ -1,34 +0,0 @@ -var fs = require('fs'); - -/** - * @param {Array} files - * @param {Function} cb - */ - -function ensureFiles(files, cb) { - var missingFiles = files.reduce(function(prev, filePath) { - var fileFound = false; - - try { - fileFound = fs.statSync(filePath).isFile(); - } catch (e) { } - - if (!fileFound) { - prev.push(filePath + ' Not Found'); - } - - return prev; - }, []); - - if (missingFiles.length) { - var err = new Error('Missing Required Files\n' + missingFiles.join('\n')); - } - - if (cb) { - cb(err); - } else if (err) { - throw err; - } -} - -module.exports = ensureFiles; diff --git a/travis-runner.sh b/travis-runner.sh deleted file mode 100755 index 41db7f6..0000000 --- a/travis-runner.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -set -o pipefail - -if [ "$TRAVIS_BRANCH" = "master" ] && [ "$TRAVIS_PULL_REQUEST" = "false" ] -then - git config --global user.email "samccone@gmail.com" && \ - git config --global user.name "auto deployer" && \ - echo "Deploying!" && \ - sed -i.tmp "s/\/\/ app.baseUrl = '\/polymer-starter-kit/app.baseUrl = '\/polymer-starter-kit/" app/scripts/app.js && \ - rm app/scripts/app.js.tmp && \ - bower i && \ - gulp build-deploy-gh-pages && \ - sed -i.tmp "s/app.baseUrl = '\/polymer-starter-kit/\/\/ app.baseUrl = '\/polymer-starter-kit/" app/scripts/app.js && \ - rm app/scripts/app.js.tmp -else - npm run lint - npm test -fi