From 0f4efc1e12ac17a96f61210b863ae2dfdc9a0f52 Mon Sep 17 00:00:00 2001 From: Zhigang Fang Date: Thu, 2 Jun 2016 17:48:36 +0800 Subject: [PATCH] Initial Commit --- .babelrc | 3 + .bowerrc | 3 + .editorconfig | 24 +++++ .gitattributes | 1 + .gitignore | 10 +++ .yo-rc.json | 3 + app/_locales/en/messages.json | 10 +++ app/images/icon-128.png | Bin 0 -> 5356 bytes app/images/icon-16.png | Bin 0 -> 758 bytes app/manifest.json | 35 ++++++++ app/scripts.babel/background.js | 7 ++ app/scripts.babel/chromereload.js | 23 +++++ app/scripts.babel/contentscript.js | 3 + bower.json | 10 +++ gulpfile.babel.js | 135 +++++++++++++++++++++++++++++ package.json | 47 ++++++++++ test/index.html | 29 +++++++ test/spec/test.js | 11 +++ 18 files changed, 354 insertions(+) create mode 100644 .babelrc create mode 100644 .bowerrc create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .yo-rc.json create mode 100644 app/_locales/en/messages.json create mode 100644 app/images/icon-128.png create mode 100644 app/images/icon-16.png create mode 100644 app/manifest.json create mode 100644 app/scripts.babel/background.js create mode 100644 app/scripts.babel/chromereload.js create mode 100644 app/scripts.babel/contentscript.js create mode 100644 bower.json create mode 100644 gulpfile.babel.js create mode 100644 package.json create mode 100644 test/index.html create mode 100644 test/spec/test.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..c13c5f6 --- /dev/null +++ b/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["es2015"] +} diff --git a/.bowerrc b/.bowerrc new file mode 100644 index 0000000..5773025 --- /dev/null +++ b/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "app/bower_components" +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..609f684 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,24 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + + +[*] + +# Change these settings to your own preference +indent_style = space +indent_size = 2 + +[*.json] +indent_size = 2 + +# We recommend you to keep these unchanged +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..2125666 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5d65bce --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +node_modules +temp +.tmp +dist +.sass-cache +app/bower_components +test/bower_components +package +app/scripts + diff --git a/.yo-rc.json b/.yo-rc.json new file mode 100644 index 0000000..7a21352 --- /dev/null +++ b/.yo-rc.json @@ -0,0 +1,3 @@ +{ + "generator-mocha": {} +} \ No newline at end of file diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json new file mode 100644 index 0000000..bb744c2 --- /dev/null +++ b/app/_locales/en/messages.json @@ -0,0 +1,10 @@ +{ + "appName": { + "message": "alwaysHTTPs", + "description": "The name of the application" + }, + "appDescription": { + "message": "Always use HTTPS", + "description": "The description of the application" + } +} diff --git a/app/images/icon-128.png b/app/images/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..75c023a5375c531107c7c09fe60778d6b9df039d GIT binary patch literal 5356 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 KMNUMnLSTZKC-pl3 literal 0 HcmV?d00001 diff --git a/app/images/icon-16.png b/app/images/icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..7df748fba2ddbbf6c7dc55d9fac800fe42d9c062 GIT binary patch literal 758 zcmVet+KcdbD@$)%ow_#5N6ldvkl$WuOsFT#TT^F-NI2C@62baIk+#7jsHe zx+rlsi?A5mpwU%b6m$`UR8qT`t_Hi%F$QCs$+F=to_^n-((tB>59j$k&+~oYpm~cy zJ`T}VTY}d*l6+-0J_o3IW6a-<2aZ*3%wN{nU&^v4CbUC2tT9XOUH{)eY%PkdO{cWE6DsA7A0PeC$aP2H2STM0C~dShi*}=E zH;OQU;Ps|Vo7+$(Wpdx}5K;3jTzh{22`#4l6mR%6)d!b>6bs4_o7+^#L1cwCNc4(cDWsPht=M zK@0B&Iew2F{K1XfL!J-O>NDvqyY4Pkygu**)YAY4+EIMwBUEz)l^jRH0hIG7DtOYp z`<)g~vNNvJj(7sV>+8Rei3{1%_?jwB5h2#W##afOJwcVGxphlC=LfEi7x4SBo$p;4 zEAY3OH~8IH7r#BVmtVZy$R9s>RS+$n&*nbs;~a^ZCT9Y3%-nXA8jBAHznuH~b< zGvwN3^4cVCec8*0^P_@j@qD&+=X2gTSzuw3Bi$nbQ@C!Wh zQX`LbH*&PQN)Roc&lWBXk(ax<^l9s~AL!bZps%wIQ*Sn1I*_E92iRf3P6ak^O$nmK z^O`Aj;}l^Z|MR}(cHN}^wT zlN7r$0iOf7+wsAH99PGB1<~S3<~!1r8$Zxf6=n8svjbgOec|1fn#GYt<807*qoM6N<$g35_)Pyhe` literal 0 HcmV?d00001 diff --git a/app/manifest.json b/app/manifest.json new file mode 100644 index 0000000..7a17c35 --- /dev/null +++ b/app/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "__MSG_appName__", + "version": "0.0.1", + "manifest_version": 2, + "description": "__MSG_appDescription__", + "icons": { + "16": "images/icon-16.png", + "128": "images/icon-128.png" + }, + "default_locale": "en", + "background": { + "scripts": [ + "scripts/chromereload.js", + "scripts/background.js" + ] + }, + "permissions": [ + "tabs", + "http://*/*", + "https://*/*" + ], + "content_scripts": [ + { + "matches": [ + "http://*/*", + "https://*/*" + ], + "js": [ + "scripts/contentscript.js" + ], + "run_at": "document_end", + "all_frames": false + } + ] +} diff --git a/app/scripts.babel/background.js b/app/scripts.babel/background.js new file mode 100644 index 0000000..f8635f4 --- /dev/null +++ b/app/scripts.babel/background.js @@ -0,0 +1,7 @@ +'use strict'; + +chrome.runtime.onInstalled.addListener(details => { + console.log('previousVersion', details.previousVersion); +}); + +console.log('\'Allo \'Allo! Event Page'); diff --git a/app/scripts.babel/chromereload.js b/app/scripts.babel/chromereload.js new file mode 100644 index 0000000..cf8e6fd --- /dev/null +++ b/app/scripts.babel/chromereload.js @@ -0,0 +1,23 @@ +'use strict'; + +// Reload client for Chrome Apps & Extensions. +// The reload client has a compatibility with livereload. +// WARNING: only supports reload command. + +const LIVERELOAD_HOST = 'localhost:'; +const LIVERELOAD_PORT = 35729; +const connection = new WebSocket('ws://' + LIVERELOAD_HOST + LIVERELOAD_PORT + '/livereload'); + +connection.onerror = error => { + console.log('reload connection got error:', error); +}; + +connection.onmessage = e => { + if (e.data) { + const data = JSON.parse(e.data); + if (data && data.command === 'reload') { + chrome.runtime.reload(); + } + } +}; + diff --git a/app/scripts.babel/contentscript.js b/app/scripts.babel/contentscript.js new file mode 100644 index 0000000..7b67938 --- /dev/null +++ b/app/scripts.babel/contentscript.js @@ -0,0 +1,3 @@ +'use strict'; + +console.log('\'Allo \'Allo! Content script'); diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..4f9c668 --- /dev/null +++ b/bower.json @@ -0,0 +1,10 @@ +{ + "name": "alwayshttps", + "private": true, + "version": "0.0.0", + "dependencies": {}, + "devDependencies": { + "chai": "^3.5.0", + "mocha": "^2.5.3" + } +} diff --git a/gulpfile.babel.js b/gulpfile.babel.js new file mode 100644 index 0000000..dcab00e --- /dev/null +++ b/gulpfile.babel.js @@ -0,0 +1,135 @@ +// generated on 2016-06-02 using generator-chrome-extension 0.5.6 +import gulp from 'gulp'; +import gulpLoadPlugins from 'gulp-load-plugins'; +import del from 'del'; +import runSequence from 'run-sequence'; +import {stream as wiredep} from 'wiredep'; + +const $ = gulpLoadPlugins(); + +gulp.task('extras', () => { + return gulp.src([ + 'app/*.*', + 'app/_locales/**', + '!app/scripts.babel', + '!app/*.json', + '!app/*.html', + ], { + base: 'app', + dot: true + }).pipe(gulp.dest('dist')); +}); + +function lint(files, options) { + return () => { + return gulp.src(files) + .pipe($.eslint(options)) + .pipe($.eslint.format()); + }; +} + +gulp.task('lint', lint('app/scripts.babel/**/*.js', { + env: { + es6: true + } +})); + +gulp.task('images', () => { + return gulp.src('app/images/**/*') + .pipe($.if($.if.isFile, $.cache($.imagemin({ + progressive: true, + interlaced: true, + // don't remove IDs from SVGs, they are often used + // as hooks for embedding and styling + svgoPlugins: [{cleanupIDs: false}] + })) + .on('error', function (err) { + console.log(err); + this.end(); + }))) + .pipe(gulp.dest('dist/images')); +}); + +gulp.task('html', () => { + return gulp.src('app/*.html') + .pipe($.useref({searchPath: ['.tmp', 'app', '.']})) + .pipe($.sourcemaps.init()) + .pipe($.if('*.js', $.uglify())) + .pipe($.if('*.css', $.cleanCss({compatibility: '*'}))) + .pipe($.sourcemaps.write()) + .pipe($.if('*.html', $.htmlmin({removeComments: true, collapseWhitespace: true}))) + .pipe(gulp.dest('dist')); +}); + +gulp.task('chromeManifest', () => { + return gulp.src('app/manifest.json') + .pipe($.chromeManifest({ + buildnumber: true, + background: { + target: 'scripts/background.js', + exclude: [ + 'scripts/chromereload.js' + ] + } + })) + .pipe($.if('*.css', $.cleanCss({compatibility: '*'}))) + .pipe($.if('*.js', $.sourcemaps.init())) + .pipe($.if('*.js', $.uglify())) + .pipe($.if('*.js', $.sourcemaps.write('.'))) + .pipe(gulp.dest('dist')); +}); + +gulp.task('babel', () => { + return gulp.src('app/scripts.babel/**/*.js') + .pipe($.babel({ + presets: ['es2015'] + })) + .pipe(gulp.dest('app/scripts')); +}); + +gulp.task('clean', del.bind(null, ['.tmp', 'dist'])); + +gulp.task('watch', ['lint', 'babel', 'html'], () => { + $.livereload.listen(); + + gulp.watch([ + 'app/*.html', + 'app/scripts/**/*.js', + 'app/images/**/*', + 'app/styles/**/*', + 'app/_locales/**/*.json' + ]).on('change', $.livereload.reload); + + gulp.watch('app/scripts.babel/**/*.js', ['lint', 'babel']); + gulp.watch('bower.json', ['wiredep']); +}); + +gulp.task('size', () => { + return gulp.src('dist/**/*').pipe($.size({title: 'build', gzip: true})); +}); + +gulp.task('wiredep', () => { + gulp.src('app/*.html') + .pipe(wiredep({ + ignorePath: /^(\.\.\/)*\.\./ + })) + .pipe(gulp.dest('app')); +}); + +gulp.task('package', function () { + var manifest = require('./dist/manifest.json'); + return gulp.src('dist/**') + .pipe($.zip('alwaysHTTPs-' + manifest.version + '.zip')) + .pipe(gulp.dest('package')); +}); + +gulp.task('build', (cb) => { + runSequence( + 'lint', 'babel', 'chromeManifest', + ['html', 'images', 'extras'], + 'size', cb); +}); + +gulp.task('default', ['clean'], cb => { + runSequence('build', cb); +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..d6f85da --- /dev/null +++ b/package.json @@ -0,0 +1,47 @@ +{ + "name": "alwayshttps", + "private": true, + "engines": { + "node": ">=0.8.0" + }, + "devDependencies": { + "babel-core": "^6.7.2", + "babel-preset-es2015": "^6.6.0", + "del": "^2.2.0", + "gulp": "^3.9.1", + "gulp-babel": "^6.1.2", + "gulp-cache": "^0.4.3", + "gulp-chrome-manifest": "0.0.13", + "gulp-clean-css": "^2.0.3", + "gulp-eslint": "^2.0.0", + "gulp-if": "^2.0.0", + "gulp-imagemin": "^2.4.0", + "gulp-livereload": "^3.8.1", + "gulp-load-plugins": "^1.2.0", + "gulp-htmlmin": "^1.3.0", + "gulp-size": "^2.1.0", + "gulp-sourcemaps": "^1.6.0", + "gulp-uglify": "^1.5.3", + "gulp-useref": "^3.0.8", + "gulp-zip": "^3.2.0", + "main-bower-files": "^2.11.1", + "run-sequence": "^1.1.5", + "wiredep": "^4.0.0" + }, + "eslintConfig": { + "env": { + "node": true, + "browser": true + }, + "globals": { + "chrome": true + }, + "rules": { + "eol-last": 0, + "quotes": [ + 2, + "single" + ] + } + } +} diff --git a/test/index.html b/test/index.html new file mode 100644 index 0000000..6498d5f --- /dev/null +++ b/test/index.html @@ -0,0 +1,29 @@ + + + + + Mocha Spec Runner + + + +
+ + + + + + + + + + + + diff --git a/test/spec/test.js b/test/spec/test.js new file mode 100644 index 0000000..0fca0fb --- /dev/null +++ b/test/spec/test.js @@ -0,0 +1,11 @@ +(function () { + 'use strict'; + + describe('Give it some context', function () { + describe('maybe a bit more context here', function () { + it('should run here few assertions', function () { + + }); + }); + }); +})();