From 8c9f32c9278d05945ae3ff067cce84e7bb855729 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Mon, 7 Sep 2015 17:01:37 +0200 Subject: [PATCH 01/15] Initial commit. --- packages/xo-server-auth-github/.babelrc | 15 ++++ packages/xo-server-auth-github/.editorconfig | 65 +++++++++++++++++ packages/xo-server-auth-github/.gitignore | 8 +++ packages/xo-server-auth-github/.mocha.js | 3 + packages/xo-server-auth-github/.mocha.opts | 1 + packages/xo-server-auth-github/.npmignore | 10 +++ packages/xo-server-auth-github/.travis.yml | 11 +++ packages/xo-server-auth-github/README.md | 74 ++++++++++++++++++++ packages/xo-server-auth-github/package.json | 56 +++++++++++++++ packages/xo-server-auth-github/src/index.js | 23 ++++++ 10 files changed, 266 insertions(+) create mode 100644 packages/xo-server-auth-github/.babelrc create mode 100644 packages/xo-server-auth-github/.editorconfig create mode 100644 packages/xo-server-auth-github/.gitignore create mode 100644 packages/xo-server-auth-github/.mocha.js create mode 100644 packages/xo-server-auth-github/.mocha.opts create mode 100644 packages/xo-server-auth-github/.npmignore create mode 100644 packages/xo-server-auth-github/.travis.yml create mode 100644 packages/xo-server-auth-github/README.md create mode 100644 packages/xo-server-auth-github/package.json create mode 100644 packages/xo-server-auth-github/src/index.js diff --git a/packages/xo-server-auth-github/.babelrc b/packages/xo-server-auth-github/.babelrc new file mode 100644 index 000000000..5e9978a41 --- /dev/null +++ b/packages/xo-server-auth-github/.babelrc @@ -0,0 +1,15 @@ +{ + "comments": false, + "compact": true, + "optional": [ + // Experimental features. + // "minification.constantFolding", + // "minification.deadCodeElimination", + + "es7.asyncFunctions", + "es7.decorators", + "es7.exportExtensions", + "es7.functionBind", + "runtime" + ] +} diff --git a/packages/xo-server-auth-github/.editorconfig b/packages/xo-server-auth-github/.editorconfig new file mode 100644 index 000000000..da21ef4c5 --- /dev/null +++ b/packages/xo-server-auth-github/.editorconfig @@ -0,0 +1,65 @@ +# http://EditorConfig.org +# +# Julien Fontanet's configuration +# https://gist.github.com/julien-f/8096213 + +# Top-most EditorConfig file. +root = true + +# Common config. +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespaces = true + +# CoffeeScript +# +# https://github.com/polarmobile/coffeescript-style-guide/blob/master/README.md +[*.{,lit}coffee] +indent_size = 2 +indent_style = space + +# Markdown +[*.{md,mdwn,mdown,markdown}] +indent_size = 4 +indent_style = space + +# Package.json +# +# This indentation style is the one used by npm. +[/package.json] +indent_size = 2 +indent_style = space + +# Jade +[*.jade] +indent_size = 2 +indent_style = space + +# JavaScript +# +# Two spaces seems to be the standard most common style, at least in +# Node.js (http://nodeguide.com/style.html#tabs-vs-spaces). +[*.js] +indent_size = 2 +indent_style = space + +# Less +[*.less] +indent_size = 2 +indent_style = space + +# Sass +# +# Style used for http://libsass.com +[*.s[ac]ss] +indent_size = 2 +indent_style = space + +# YAML +# +# Only spaces are allowed. +[*.yaml] +indent_size = 2 +indent_style = space diff --git a/packages/xo-server-auth-github/.gitignore b/packages/xo-server-auth-github/.gitignore new file mode 100644 index 000000000..384949d8a --- /dev/null +++ b/packages/xo-server-auth-github/.gitignore @@ -0,0 +1,8 @@ +/bower_components/ +/dist/ + +npm-debug.log +npm-debug.log.* + +!node_modules/* +node_modules/*/ diff --git a/packages/xo-server-auth-github/.mocha.js b/packages/xo-server-auth-github/.mocha.js new file mode 100644 index 000000000..b888fb4d5 --- /dev/null +++ b/packages/xo-server-auth-github/.mocha.js @@ -0,0 +1,3 @@ +try { require('clarify') } catch (_) {} +try { require('trace') } catch (_) {} +try { require('source-map-support/register') } catch (_) {} diff --git a/packages/xo-server-auth-github/.mocha.opts b/packages/xo-server-auth-github/.mocha.opts new file mode 100644 index 000000000..6cfd94898 --- /dev/null +++ b/packages/xo-server-auth-github/.mocha.opts @@ -0,0 +1 @@ +--require ./.mocha.js diff --git a/packages/xo-server-auth-github/.npmignore b/packages/xo-server-auth-github/.npmignore new file mode 100644 index 000000000..c31ee82cb --- /dev/null +++ b/packages/xo-server-auth-github/.npmignore @@ -0,0 +1,10 @@ +/examples/ +example.js +example.js.map +*.example.js +*.example.js.map + +/test/ +/tests/ +*.spec.js +*.spec.js.map diff --git a/packages/xo-server-auth-github/.travis.yml b/packages/xo-server-auth-github/.travis.yml new file mode 100644 index 000000000..1550c31c0 --- /dev/null +++ b/packages/xo-server-auth-github/.travis.yml @@ -0,0 +1,11 @@ +language: node_js +node_js: + - 'iojs-v3' + - 'iojs-v2' + - 'iojs-v1' + - '0.12' + - '0.10' + +# Use containers. +# http://docs.travis-ci.com/user/workers/container-based-infrastructure/ +sudo: false diff --git a/packages/xo-server-auth-github/README.md b/packages/xo-server-auth-github/README.md new file mode 100644 index 000000000..c9d1c0408 --- /dev/null +++ b/packages/xo-server-auth-github/README.md @@ -0,0 +1,74 @@ +# xo-server-auth-github [![Build Status](https://travis-ci.org/vatesfr/xo-server-auth-github.png?branch=master)](https://travis-ci.org/vatesfr/xo-server-auth-github) + +> GitHub authentication plugin for XO-Server + +This plugin allows GitHub users to authenticate to Xen-Orchestra. + +The first time a user signs in, XO will create a new XO user with the +same identifier. + +## Install + +Installation of the [npm package](https://npmjs.org/package/xo-server-auth-github): + +``` +> npm install --save xo-server-auth-github +``` + +## Usage + +> This plugin is based on [passport-github](https://github.com/bergie/passport-github), +> see [its documentation](https://github.com/bergie/passport-github#configure-strategy) +> for more information about the configuration. + +To enable this plugin you have to add it into the configuration file +of XO-Server: + +```yaml +plugins: + + auth-github: + + # Both these values will be given to you when your instance of XO + # is registered in GitHub + # (https://github.com/settings/developers). + clientID: c2f2f881062f170e2ec3 + clientSecret: 4335e70f62e2dbb7917df0126b1015b5617bceea +``` + +## Development + +### Installing dependencies + +``` +> npm install +``` + +### Compilation + +The sources files are watched and automatically recompiled on changes. + +``` +> npm run dev +``` + +### Tests + +``` +> npm run test-dev +``` + +## Contributions + +Contributions are *very* welcomed, either on the documentation or on +the code. + +You may: + +- report any [issue](https://github.com/vatesfr/xo-server-auth-github/issues) + you've encountered; +- fork and create a pull request. + +## License + +AGPL3 © [Vates SAS](http://vates.fr) diff --git a/packages/xo-server-auth-github/package.json b/packages/xo-server-auth-github/package.json new file mode 100644 index 000000000..eef4618e0 --- /dev/null +++ b/packages/xo-server-auth-github/package.json @@ -0,0 +1,56 @@ +{ + "name": "xo-server-auth-github", + "version": "0.0.0", + "license": "AGPL-3", + "description": "GitHub authentication plugin for XO-Server", + "keywords": [ + "xo-server", + "xo-server", + "authentication", + "github" + ], + "homepage": "https://github.com/vatesfr/xo-server-auth-github", + "bugs": "https://github.com/vatesfr/xo-server-auth-github/issues", + "repository": { + "type": "git", + "url": "https://github.com/vatesfr/xo-server-auth-github" + }, + "author": { + "name": "Julien Fontanet", + "email": "julien.fontanet@isonoe.net" + }, + "preferGlobal": false, + "main": "dist/", + "bin": {}, + "files": [ + "dist/" + ], + "dependencies": { + "babel-runtime": "^5.8.20", + "passport-github": "^1.0.0" + }, + "devDependencies": { + "babel": "^5.8.23", + "babel-eslint": "^4.1.1", + "clarify": "^1.0.5", + "mocha": "^2.3.1", + "must": "^0.12.0", + "source-map-support": "^0.3.2", + "standard": "^5.2.1", + "trace": "^1.2.0" + }, + "scripts": { + "build": "babel --source-maps --out-dir=dist/ src/", + "dev": "babel --watch --source-maps --out-dir=dist/ src/", + "lint": "standard", + "prepublish": "npm run build", + "test": "npm run lint && mocha --opts .mocha.opts \"dist/**/*.spec.js\"", + "test-dev": "mocha --opts .mocha.opts --watch --reporter=min \"dist/**/*.spec.js\"" + }, + "standard": { + "ignore": [ + "dist/**" + ], + "parser": "babel-eslint" + } +} diff --git a/packages/xo-server-auth-github/src/index.js b/packages/xo-server-auth-github/src/index.js new file mode 100644 index 000000000..c2006d34d --- /dev/null +++ b/packages/xo-server-auth-github/src/index.js @@ -0,0 +1,23 @@ +import {Strategy} from 'passport-github' + +// =================================================================== + +class AuthGitHubXoPlugin { + constructor (conf) { + this._conf = conf + } + + load (xo) { + xo.registerPassportStrategy(new Strategy(this._conf, async (accessToken, refreshToken, profile, done) => { + try { + done(null, await xo.registerUser('github', profile.username)) + } catch (error) { + done(error.message) + } + })) + } +} + +// =================================================================== + +export default conf => new AuthGitHubXoPlugin(conf) From ae41e6499991f224354740e1af7dc76141a9fec3 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Mon, 7 Sep 2015 17:02:57 +0200 Subject: [PATCH 02/15] Fix passport-github links. --- packages/xo-server-auth-github/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/xo-server-auth-github/README.md b/packages/xo-server-auth-github/README.md index c9d1c0408..e4cc703ad 100644 --- a/packages/xo-server-auth-github/README.md +++ b/packages/xo-server-auth-github/README.md @@ -17,8 +17,8 @@ Installation of the [npm package](https://npmjs.org/package/xo-server-auth-githu ## Usage -> This plugin is based on [passport-github](https://github.com/bergie/passport-github), -> see [its documentation](https://github.com/bergie/passport-github#configure-strategy) +> This plugin is based on [passport-github](https://github.com/jaredhanson/passport-github), +> see [its documentation](https://github.com/jaredhanson/passport-github#configure-strategy) > for more information about the configuration. To enable this plugin you have to add it into the configuration file From 0304d6079d24a15cca1a1dba80f3e88582ecfe41 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Mon, 7 Sep 2015 17:24:27 +0200 Subject: [PATCH 03/15] GitHub screenshot. --- packages/xo-server-auth-github/README.md | 2 ++ packages/xo-server-auth-github/github.png | Bin 0 -> 46537 bytes 2 files changed, 2 insertions(+) create mode 100644 packages/xo-server-auth-github/github.png diff --git a/packages/xo-server-auth-github/README.md b/packages/xo-server-auth-github/README.md index e4cc703ad..f347d219f 100644 --- a/packages/xo-server-auth-github/README.md +++ b/packages/xo-server-auth-github/README.md @@ -21,6 +21,8 @@ Installation of the [npm package](https://npmjs.org/package/xo-server-auth-githu > see [its documentation](https://github.com/jaredhanson/passport-github#configure-strategy) > for more information about the configuration. +![Registering XO instance in GitHub](github.png) + To enable this plugin you have to add it into the configuration file of XO-Server: diff --git a/packages/xo-server-auth-github/github.png b/packages/xo-server-auth-github/github.png new file mode 100644 index 0000000000000000000000000000000000000000..b65a59b596654cb5f768e829094be9ed31fea7e6 GIT binary patch literal 46537 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 Date: Fri, 11 Sep 2015 10:44:32 +0200 Subject: [PATCH 04/15] Test with Node 4. --- packages/xo-server-auth-github/.travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/xo-server-auth-github/.travis.yml b/packages/xo-server-auth-github/.travis.yml index 1550c31c0..1be09b389 100644 --- a/packages/xo-server-auth-github/.travis.yml +++ b/packages/xo-server-auth-github/.travis.yml @@ -1,5 +1,6 @@ language: node_js node_js: + - '4' - 'iojs-v3' - 'iojs-v2' - 'iojs-v1' From 84c95324561e385018ca1c33ddcaafd300781276 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Fri, 11 Sep 2015 10:45:02 +0200 Subject: [PATCH 05/15] 0.1.0 --- packages/xo-server-auth-github/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-server-auth-github/package.json b/packages/xo-server-auth-github/package.json index eef4618e0..442266674 100644 --- a/packages/xo-server-auth-github/package.json +++ b/packages/xo-server-auth-github/package.json @@ -1,6 +1,6 @@ { "name": "xo-server-auth-github", - "version": "0.0.0", + "version": "0.1.0", "license": "AGPL-3", "description": "GitHub authentication plugin for XO-Server", "keywords": [ From 25873e0e02d160b9c52a3a1514b71c78832f67b4 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Thu, 8 Oct 2015 13:55:26 +0200 Subject: [PATCH 06/15] New plugin API. --- packages/xo-server-auth-github/src/index.js | 27 ++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/packages/xo-server-auth-github/src/index.js b/packages/xo-server-auth-github/src/index.js index c2006d34d..c427237db 100644 --- a/packages/xo-server-auth-github/src/index.js +++ b/packages/xo-server-auth-github/src/index.js @@ -2,12 +2,33 @@ import {Strategy} from 'passport-github' // =================================================================== +export const configurationSchema = { + type: 'object', + properties: { + clientID: { + type: 'string' + }, + clientSecret: { + type: 'string' + } + }, + required: ['clientID', 'clientSecret'] +} + +// =================================================================== + class AuthGitHubXoPlugin { - constructor (conf) { + constructor (xo) { + this._xo = xo + } + + configure (conf) { this._conf = conf } - load (xo) { + load () { + const {_xo: xo} = this + xo.registerPassportStrategy(new Strategy(this._conf, async (accessToken, refreshToken, profile, done) => { try { done(null, await xo.registerUser('github', profile.username)) @@ -20,4 +41,4 @@ class AuthGitHubXoPlugin { // =================================================================== -export default conf => new AuthGitHubXoPlugin(conf) +export default ({xo}) => new AuthGitHubXoPlugin(xo) From f55ed13bd21eee553ee14e3a39504a1e6fc84b19 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Fri, 9 Oct 2015 17:57:27 +0200 Subject: [PATCH 07/15] 0.2.0 --- packages/xo-server-auth-github/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-server-auth-github/package.json b/packages/xo-server-auth-github/package.json index 442266674..8add71fe9 100644 --- a/packages/xo-server-auth-github/package.json +++ b/packages/xo-server-auth-github/package.json @@ -1,6 +1,6 @@ { "name": "xo-server-auth-github", - "version": "0.1.0", + "version": "0.2.0", "license": "AGPL-3", "description": "GitHub authentication plugin for XO-Server", "keywords": [ From 733c619b1ff73480f22efdf3d29326c567d09ba5 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Fri, 9 Oct 2015 18:53:13 +0200 Subject: [PATCH 08/15] 0.2.1 --- packages/xo-server-auth-github/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-server-auth-github/package.json b/packages/xo-server-auth-github/package.json index 8add71fe9..77ba24b69 100644 --- a/packages/xo-server-auth-github/package.json +++ b/packages/xo-server-auth-github/package.json @@ -1,6 +1,6 @@ { "name": "xo-server-auth-github", - "version": "0.2.0", + "version": "0.2.1", "license": "AGPL-3", "description": "GitHub authentication plugin for XO-Server", "keywords": [ From 30dcb4d8d211aab01d9787cc46d9aeaf5457670d Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Mon, 12 Oct 2015 15:30:48 +0200 Subject: [PATCH 09/15] Should be globally installed. --- packages/xo-server-auth-github/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-server-auth-github/README.md b/packages/xo-server-auth-github/README.md index f347d219f..5d8114809 100644 --- a/packages/xo-server-auth-github/README.md +++ b/packages/xo-server-auth-github/README.md @@ -12,7 +12,7 @@ same identifier. Installation of the [npm package](https://npmjs.org/package/xo-server-auth-github): ``` -> npm install --save xo-server-auth-github +> npm install --global xo-server-auth-github ``` ## Usage From 5b782993fd765aabb437db51a9a955485c8ceeec Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Mon, 12 Oct 2015 15:39:26 +0200 Subject: [PATCH 10/15] Fix the license. --- packages/xo-server-auth-github/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/xo-server-auth-github/package.json b/packages/xo-server-auth-github/package.json index 77ba24b69..e8ef74272 100644 --- a/packages/xo-server-auth-github/package.json +++ b/packages/xo-server-auth-github/package.json @@ -1,7 +1,7 @@ { "name": "xo-server-auth-github", "version": "0.2.1", - "license": "AGPL-3", + "license": "AGPL-3.0", "description": "GitHub authentication plugin for XO-Server", "keywords": [ "xo-server", From 4673af6fd8b243f27ef45c277b5301cceff3d9eb Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Thu, 29 Sep 2016 12:54:46 +0200 Subject: [PATCH 12/15] chore(package): update all dependencies --- packages/xo-server-auth-github/.babelrc | 15 ----- packages/xo-server-auth-github/.editorconfig | 2 +- packages/xo-server-auth-github/.gitignore | 5 +- packages/xo-server-auth-github/.mocha.js | 4 +- packages/xo-server-auth-github/.travis.yml | 6 +- packages/xo-server-auth-github/README.md | 18 +----- packages/xo-server-auth-github/package.json | 55 ++++++++++++++----- .../xo-server-auth-github/src/index.spec.js | 17 ++++++ 8 files changed, 66 insertions(+), 56 deletions(-) delete mode 100644 packages/xo-server-auth-github/.babelrc create mode 100644 packages/xo-server-auth-github/src/index.spec.js diff --git a/packages/xo-server-auth-github/.babelrc b/packages/xo-server-auth-github/.babelrc deleted file mode 100644 index 5e9978a41..000000000 --- a/packages/xo-server-auth-github/.babelrc +++ /dev/null @@ -1,15 +0,0 @@ -{ - "comments": false, - "compact": true, - "optional": [ - // Experimental features. - // "minification.constantFolding", - // "minification.deadCodeElimination", - - "es7.asyncFunctions", - "es7.decorators", - "es7.exportExtensions", - "es7.functionBind", - "runtime" - ] -} diff --git a/packages/xo-server-auth-github/.editorconfig b/packages/xo-server-auth-github/.editorconfig index da21ef4c5..b6db0112a 100644 --- a/packages/xo-server-auth-github/.editorconfig +++ b/packages/xo-server-auth-github/.editorconfig @@ -41,7 +41,7 @@ indent_style = space # # Two spaces seems to be the standard most common style, at least in # Node.js (http://nodeguide.com/style.html#tabs-vs-spaces). -[*.js] +[*.{js,jsx,ts,tsx}] indent_size = 2 indent_style = space diff --git a/packages/xo-server-auth-github/.gitignore b/packages/xo-server-auth-github/.gitignore index 384949d8a..fa69f37f1 100644 --- a/packages/xo-server-auth-github/.gitignore +++ b/packages/xo-server-auth-github/.gitignore @@ -1,8 +1,5 @@ -/bower_components/ /dist/ +/node_modules/ npm-debug.log npm-debug.log.* - -!node_modules/* -node_modules/*/ diff --git a/packages/xo-server-auth-github/.mocha.js b/packages/xo-server-auth-github/.mocha.js index b888fb4d5..e6d84e403 100644 --- a/packages/xo-server-auth-github/.mocha.js +++ b/packages/xo-server-auth-github/.mocha.js @@ -1,3 +1,5 @@ -try { require('clarify') } catch (_) {} +Error.stackTraceLimit = 100 + try { require('trace') } catch (_) {} +try { require('clarify') } catch (_) {} try { require('source-map-support/register') } catch (_) {} diff --git a/packages/xo-server-auth-github/.travis.yml b/packages/xo-server-auth-github/.travis.yml index 1be09b389..fb5d91729 100644 --- a/packages/xo-server-auth-github/.travis.yml +++ b/packages/xo-server-auth-github/.travis.yml @@ -1,11 +1,7 @@ language: node_js node_js: + - 'stable' - '4' - - 'iojs-v3' - - 'iojs-v2' - - 'iojs-v1' - - '0.12' - - '0.10' # Use containers. # http://docs.travis-ci.com/user/workers/container-based-infrastructure/ diff --git a/packages/xo-server-auth-github/README.md b/packages/xo-server-auth-github/README.md index 5d8114809..4e36ed3b9 100644 --- a/packages/xo-server-auth-github/README.md +++ b/packages/xo-server-auth-github/README.md @@ -21,23 +21,11 @@ Installation of the [npm package](https://npmjs.org/package/xo-server-auth-githu > see [its documentation](https://github.com/jaredhanson/passport-github#configure-strategy) > for more information about the configuration. +Like all other xo-server plugins, it can be configured directly via +the web iterface, see [the plugin documentation](https://xen-orchestra.com/docs/plugins.html). + ![Registering XO instance in GitHub](github.png) -To enable this plugin you have to add it into the configuration file -of XO-Server: - -```yaml -plugins: - - auth-github: - - # Both these values will be given to you when your instance of XO - # is registered in GitHub - # (https://github.com/settings/developers). - clientID: c2f2f881062f170e2ec3 - clientSecret: 4335e70f62e2dbb7917df0126b1015b5617bceea -``` - ## Development ### Installing dependencies diff --git a/packages/xo-server-auth-github/package.json b/packages/xo-server-auth-github/package.json index e8ef74272..99f5b4f99 100644 --- a/packages/xo-server-auth-github/package.json +++ b/packages/xo-server-auth-github/package.json @@ -25,32 +25,57 @@ "files": [ "dist/" ], + "engines": { + "node": ">=4" + }, "dependencies": { - "babel-runtime": "^5.8.20", - "passport-github": "^1.0.0" + "babel-runtime": "^6.11.6", + "passport-github": "^1.1.0" }, "devDependencies": { - "babel": "^5.8.23", - "babel-eslint": "^4.1.1", - "clarify": "^1.0.5", - "mocha": "^2.3.1", - "must": "^0.12.0", - "source-map-support": "^0.3.2", - "standard": "^5.2.1", - "trace": "^1.2.0" + "babel-cli": "^6.16.0", + "babel-eslint": "^7.0.0", + "babel-plugin-lodash": "^3.2.9", + "babel-plugin-transform-runtime": "^6.15.0", + "babel-preset-es2015": "^6.16.0", + "babel-preset-stage-0": "^6.16.0", + "clarify": "^2.0.0", + "dependency-check": "^2.6.0", + "ghooks": "^1.3.2", + "mocha": "^3.1.0", + "must": "^0.13.2", + "source-map-support": "^0.4.3", + "standard": "^8.2.0", + "trace": "^2.3.3" }, "scripts": { - "build": "babel --source-maps --out-dir=dist/ src/", - "dev": "babel --watch --source-maps --out-dir=dist/ src/", + "build": "NODE_ENV=production babel --source-maps --out-dir=dist/ src/", + "depcheck": "dependency-check ./package.json", + "dev": "NODE_DEV=development babel --watch --source-maps --out-dir=dist/ src/", + "dev-test": "mocha --opts .mocha.opts --watch --reporter=min \"dist/**/*.spec.js\"", "lint": "standard", + "posttest": "npm run lint && npm run depcheck", "prepublish": "npm run build", - "test": "npm run lint && mocha --opts .mocha.opts \"dist/**/*.spec.js\"", - "test-dev": "mocha --opts .mocha.opts --watch --reporter=min \"dist/**/*.spec.js\"" + "test": "mocha --opts .mocha.opts \"dist/**/*.spec.js\"" + }, + "babel": { + "plugins": [ + "lodash" + ], + "presets": [ + "es2015", + "stage-0" + ] }, "standard": { "ignore": [ - "dist/**" + "dist" ], "parser": "babel-eslint" + }, + "config": { + "ghooks": { + "commit-msg": "npm test" + } } } diff --git a/packages/xo-server-auth-github/src/index.spec.js b/packages/xo-server-auth-github/src/index.spec.js new file mode 100644 index 000000000..2319bd7d5 --- /dev/null +++ b/packages/xo-server-auth-github/src/index.spec.js @@ -0,0 +1,17 @@ +/* eslint-env mocha */ + +import expect from 'must' + +// =================================================================== + +import myLib from './' + +// =================================================================== + +describe.skip('myLib', () => { + it('does something', () => { + // TODO: some real tests. + + expect(myLib).to.exists() + }) +}) From 8c459cac0f4dba85186f4d0603b18d7bb3d4aafa Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Tue, 11 Oct 2016 10:43:28 +0200 Subject: [PATCH 13/15] fix(package): remove babel-plugin-lodash --- packages/xo-server-auth-github/package.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/xo-server-auth-github/package.json b/packages/xo-server-auth-github/package.json index 99f5b4f99..2910a8ea1 100644 --- a/packages/xo-server-auth-github/package.json +++ b/packages/xo-server-auth-github/package.json @@ -35,7 +35,6 @@ "devDependencies": { "babel-cli": "^6.16.0", "babel-eslint": "^7.0.0", - "babel-plugin-lodash": "^3.2.9", "babel-plugin-transform-runtime": "^6.15.0", "babel-preset-es2015": "^6.16.0", "babel-preset-stage-0": "^6.16.0", @@ -59,9 +58,6 @@ "test": "mocha --opts .mocha.opts \"dist/**/*.spec.js\"" }, "babel": { - "plugins": [ - "lodash" - ], "presets": [ "es2015", "stage-0" From bc2f17c84019bf411b59499322fe26b03f56e937 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Tue, 11 Oct 2016 10:47:05 +0200 Subject: [PATCH 14/15] fix(package): use babel-plugin-transform-runtime --- packages/xo-server-auth-github/package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/xo-server-auth-github/package.json b/packages/xo-server-auth-github/package.json index 2910a8ea1..9642e9428 100644 --- a/packages/xo-server-auth-github/package.json +++ b/packages/xo-server-auth-github/package.json @@ -58,6 +58,9 @@ "test": "mocha --opts .mocha.opts \"dist/**/*.spec.js\"" }, "babel": { + "plugins": [ + "transform-runtime" + ], "presets": [ "es2015", "stage-0" From e735420dd8a10e11c2fa2e073e1aa4012c0536ac Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Tue, 11 Oct 2016 10:49:37 +0200 Subject: [PATCH 15/15] =?UTF-8?q?chore(package):=20babel-preset-es2015=20?= =?UTF-8?q?=E2=86=92=20babel-preset-latest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/xo-server-auth-github/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/xo-server-auth-github/package.json b/packages/xo-server-auth-github/package.json index 9642e9428..fb7d297d6 100644 --- a/packages/xo-server-auth-github/package.json +++ b/packages/xo-server-auth-github/package.json @@ -36,7 +36,7 @@ "babel-cli": "^6.16.0", "babel-eslint": "^7.0.0", "babel-plugin-transform-runtime": "^6.15.0", - "babel-preset-es2015": "^6.16.0", + "babel-preset-latest": "^6.16.0", "babel-preset-stage-0": "^6.16.0", "clarify": "^2.0.0", "dependency-check": "^2.6.0", @@ -62,7 +62,7 @@ "transform-runtime" ], "presets": [ - "es2015", + "latest", "stage-0" ] },