[update] Global installation

This commit is contained in:
brunosimon
2016-09-17 02:35:08 +02:00
parent b1a01d34ec
commit 2cc95d0160
13 changed files with 234 additions and 113 deletions
-4
View File
@@ -1,4 +0,0 @@
'use strict'
let App = require( './app.class.js' ),
app = new App()
-25
View File
@@ -1,25 +0,0 @@
{
"name": "code-spectator-app",
"version": "0.0.1",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "https://github.com/brunosimon/code-spectactor"
},
"author": "Bruno Simon",
"license": "MIT",
"bugs": {
"url": "https://github.com/brunosimon/code-spectactor/issues"
},
"homepage": "https://github.com/brunosimon/code-spectactor",
"dependencies": {
"chokidar": "^1.5.1",
"colors": "^1.1.2",
"ip": "^1.1.3",
"socket.io-client": "^1.4.6"
}
}
+6
View File
@@ -0,0 +1,6 @@
#!/usr/bin/env node
'use strict'
let Keppler = require( './keppler.class.js' ),
keppler = new Keppler();
+104
View File
@@ -0,0 +1,104 @@
'use strict'
// Depedencies
let path = require( 'path' ),
colors = require( 'colors' ),
ip = require( 'ip' ),
Site = require( '../site/site.class.js' ),
Watcher = require( '../watcher/watcher.class.js' )
/**
* Keppler class
*/
class Keppler
{
/**
* Constructor
*/
constructor( _options )
{
this.set_arguments()
this.set_options( _options )
this.set_site()
this.set_watcher()
}
/**
* Set options
*/
set_options( _options )
{
// No option
if( typeof _options !== 'object' )
_options = {}
// Defaults
if( typeof _options.debug === 'undefined' )
{
if( this.arguments.length )
{
_options.debug = this.arguments[ this.arguments.length - 1 ] === 'true' ? true : false
}
else
{
_options.debug = false
}
}
if( typeof _options.port === 'undefined' )
_options.port = 1571
if( typeof _options.domain === 'undefined' )
_options.domain = `http://${ip.address()}:${_options.port}`
// Save
this.options = _options
}
/**
* Set arguments
* Retrieve arguments and test if missing
*/
set_arguments()
{
// Set up
this.arguments = process.argv.slice( 2 )
// Missing project name
if( this.arguments.length === 0 )
{
// Stop process
console.log( 'Missing arguments: first argument should be the projet name'.red )
process.exit()
}
}
/**
* Set site
* Instantiate site
*/
set_site()
{
this.site = new Site( {
port : this.options.port,
domain: this.options.domain,
debug : this.options.debug
} )
}
/**
* Set watcher
* Instantiate watcher
*/
set_watcher()
{
this.watcher = new Watcher( {
port : this.options.port,
domain: this.options.domain,
debug : this.options.debug,
name : this.arguments[ 0 ]
} )
}
}
module.exports = Keppler
+34
View File
@@ -0,0 +1,34 @@
{
"name": "keppler",
"version": "0.0.1",
"description": "",
"bin": {
"keppler": "bin/index.js"
},
"main": "bin/index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "https://github.com/brunosimon/keppler"
},
"author": "Bruno Simon",
"license": "MIT",
"bugs": {
"url": "https://github.com/brunosimon/keppler/issues"
},
"homepage": "https://github.com/brunosimon/keppler",
"dependencies": {
"chokidar": "^1.5.1",
"socket.io-client": "^1.4.6",
"colors": "^1.1.2",
"diff": "^2.2.3",
"express": "^4.13.4",
"helmet": "^2.1.0",
"ip": "^1.1.3",
"pug": "^2.0.0-beta4",
"slug": "^0.9.1",
"socket.io": "^1.4.6"
}
}
+2 -1
View File
@@ -42,6 +42,7 @@ The project URL appears. Share it with the viewers on the same wifi.
### Futur features ### Futur features
- Log project URL and open in default browser
- 404 - 404
- Retractable sidebar - Retractable sidebar
- Open multiple files - Open multiple files
@@ -56,4 +57,4 @@ The project URL appears. Share it with the viewers on the same wifi.
- Tooltips - Tooltips
- Copy file to clipboard - Copy file to clipboard
- Download file - Download file
- Angular 2 - Angular 2
+2 -2
View File
@@ -1,4 +1,4 @@
'use strict' 'use strict'
let App = require( './app.class.js' ), let Site = require( './site.class.js' ),
app = new App() site = new Site()
+1 -1
View File
@@ -16,7 +16,7 @@ class Event_Emitter
*/ */
on( names, callback ) on( names, callback )
{ {
let that = this; let that = this
// Errors // Errors
if( typeof names === 'undefined' || names === '' ) if( typeof names === 'undefined' || names === '' )
+1
View File
@@ -47,6 +47,7 @@ class Project
{ {
this.socket.emit( 'update_project', this.describe() ) this.socket.emit( 'update_project', this.describe() )
// Debug
if( this.options.debug ) if( this.options.debug )
{ {
console.log( 'socket projects'.green.bold + ' - ' + 'connect'.cyan + ' - ' + socket.id.cyan ) console.log( 'socket projects'.green.bold + ' - ' + 'connect'.cyan + ' - ' + socket.id.cyan )
+1 -1
View File
@@ -91,7 +91,7 @@ class Projects
{ {
// Delete // Delete
delete this.all[ _slug ] delete this.all[ _slug ]
project.destructor(); project.destructor()
// Emit // Emit
this.socket.emit( 'update_projects', this.describe() ) this.socket.emit( 'update_projects', this.describe() )
+33 -34
View File
@@ -13,16 +13,15 @@ let express = require( 'express' ),
fs = require( 'fs' ) fs = require( 'fs' )
/** /**
* App class * Site class
*/ */
class App class Site
{ {
/** /**
* Constructor * Constructor
*/ */
constructor( _options ) constructor( _options )
{ {
this.set_arguments()
this.set_options( _options ) this.set_options( _options )
this.set_express() this.set_express()
this.set_server() this.set_server()
@@ -38,53 +37,29 @@ class App
{ {
// No option // No option
if( typeof _options !== 'object' ) if( typeof _options !== 'object' )
{
_options = {} _options = {}
}
// Defaults
if( typeof _options.debug === 'undefined' )
_options.debug = false
if( typeof _options.port === 'undefined' ) if( typeof _options.port === 'undefined' )
{
_options.port = 1571 _options.port = 1571
}
if( typeof _options.debug === 'undefined' )
{
if( this.arguments.length )
{
_options.debug = this.arguments[ 0 ] === 'true' ? true : false
}
else
{
_options.debug = false
}
}
if( typeof _options.domain === 'undefined' ) if( typeof _options.domain === 'undefined' )
{
_options.domain = `http://${ip.address()}:${_options.port}` _options.domain = `http://${ip.address()}:${_options.port}`
}
// Save // Save
this.options = _options this.options = _options
} }
/**
* Set arguments
* Test missing arg
*/
set_arguments()
{
// Set up
this.arguments = process.argv.slice( 2 )
}
/** /**
* Set Dummy * Set Dummy
*/ */
set_dummy() set_dummy()
{ {
if( !this.options.debug ) if( !this.options.debug )
return; return
// Default project // Default project
let project = this.projects.create_project( 'dummy' ) let project = this.projects.create_project( 'dummy' )
@@ -228,6 +203,24 @@ class App
// Set up // Set up
this.server = http.createServer( this.express ) this.server = http.createServer( this.express )
// Error event
this.server.on( 'error', ( error ) =>
{
// Server already running
if( error.code === 'EADDRINUSE' )
{
// Debug
if( this.options.debug )
{
console.log( 'server already running'.green.bold )
}
return
}
console.log( error.message )
} )
// Start // Start
this.server.listen( this.options.port, () => this.server.listen( this.options.port, () =>
{ {
@@ -254,6 +247,7 @@ class App
// Set up // Set up
let project = null let project = null
// Debug
if( this.options.debug ) if( this.options.debug )
{ {
console.log( 'socket app'.green.bold + ' - ' + 'connect'.cyan + ' - ' + socket.id.cyan ) console.log( 'socket app'.green.bold + ' - ' + 'connect'.cyan + ' - ' + socket.id.cyan )
@@ -264,6 +258,7 @@ class App
{ {
project = this.projects.create_project( data.name ) project = this.projects.create_project( data.name )
// Debug
if( this.options.debug ) if( this.options.debug )
{ {
console.log( util.inspect( project.files.describe(), { depth: null, colors: true } ) ) console.log( util.inspect( project.files.describe(), { depth: null, colors: true } ) )
@@ -275,6 +270,7 @@ class App
{ {
project.files.create_version( data.path, data.content ) project.files.create_version( data.path, data.content )
// Debug
if( this.options.debug ) if( this.options.debug )
{ {
console.log( util.inspect( project.files.describe(), { depth: null, colors: true } ) ) console.log( util.inspect( project.files.describe(), { depth: null, colors: true } ) )
@@ -286,6 +282,7 @@ class App
{ {
project.files.create( data.path, data.content ) project.files.create( data.path, data.content )
// Debug
if( this.options.debug ) if( this.options.debug )
{ {
console.log( util.inspect( project.files.describe(), { depth: null, colors: true } ) ) console.log( util.inspect( project.files.describe(), { depth: null, colors: true } ) )
@@ -297,6 +294,7 @@ class App
{ {
project.files.delete( data.path ) project.files.delete( data.path )
// Debug
if( this.options.debug ) if( this.options.debug )
{ {
console.log( util.inspect( project.files.describe(), { depth: null, colors: true } ) ) console.log( util.inspect( project.files.describe(), { depth: null, colors: true } ) )
@@ -308,13 +306,14 @@ class App
{ {
this.projects.delete_project( project.slug ) this.projects.delete_project( project.slug )
// Debug
if( this.options.debug ) if( this.options.debug )
{ {
console.log( 'socket app'.green.bold + ' - ' + 'disconnect'.cyan + ' - ' + socket.id.cyan ) console.log( 'socket app'.green.bold + ' - ' + 'disconnect'.cyan + ' - ' + socket.id.cyan )
} }
} ); } )
} ) } )
} }
} }
module.exports = App module.exports = Site
+4
View File
@@ -0,0 +1,4 @@
'use strict'
let Watcher = require( './watcher.class.js' ),
watcher = new Watcher()
+46 -45
View File
@@ -9,9 +9,9 @@ let chokidar = require( 'chokidar' ),
fs = require( 'fs' ) fs = require( 'fs' )
/** /**
* App class * Watcher class
*/ */
class App class Watcher
{ {
/** /**
* Constructor * Constructor
@@ -19,7 +19,6 @@ class App
constructor( _options ) constructor( _options )
{ {
this.set_options( _options ) this.set_options( _options )
this.set_arguments()
this.set_watcher() this.set_watcher()
this.set_socket() this.set_socket()
} }
@@ -34,42 +33,19 @@ class App
_options = {} _options = {}
// Defaults // Defaults
if( typeof _options.domain === 'undefined' ) if( typeof _options.debug === 'undefined' )
_options.domain = ip.address() _options.debug = false
if( typeof _options.port === 'undefined' ) if( typeof _options.port === 'undefined' )
_options.port = 1571 _options.port = 1571
if( typeof _options.domain === 'undefined' )
_options.domain = `http://${ip.address()}:${_options.port}`
// Save // Save
this.options = _options this.options = _options
} }
/**
* Set arguments
* Test missing arg
*/
set_arguments()
{
// Set up
this.arguments = process.argv.slice( 2 )
// Missing project name
if( this.arguments.length === 0 )
{
// Stop process
console.log( 'Missing arguments: first argument should be the projet name'.red )
process.exit()
}
// // Wrong project name
// if( !this.arguments[ 0 ].match( /^[a-z_-][a-z0-9_-]+$/ ) )
// {
// // Stop process
// console.log( 'Wrong arguments: projet name'.red )
// process.exit()
// }
}
/** /**
* Set socket * Set socket
* Connect to site * Connect to site
@@ -77,13 +53,18 @@ class App
set_socket() set_socket()
{ {
// Set up // Set up
this.socket = socket_io_client( `http://${this.options.domain}:${this.options.port}/app` ) this.socket = socket_io_client( `${this.options.domain}/app` )
// Connect event // Connect event
this.socket.on( 'connect', () => this.socket.on( 'connect', () =>
{ {
console.log( 'connected'.green ) this.socket.emit( 'start_project', { name: this.options.name } )
this.socket.emit( 'start_project', { name: this.arguments[ 0 ] } )
// Debug
if( this.options.debug )
{
console.log( 'connected'.green.bold )
}
} ) } )
} }
@@ -108,14 +89,18 @@ class App
// Set up // Set up
let relative_path = _path.replace( process.cwd(), '.' ) let relative_path = _path.replace( process.cwd(), '.' )
console.log( 'add:'.green.bold, relative_path )
// Read // Read
fs.readFile( _path, ( error, data ) => fs.readFile( _path, ( error, data ) =>
{ {
// Send // Send
this.socket.emit( 'create_file', { path: relative_path, content: data.toString() } ) this.socket.emit( 'create_file', { path: relative_path, content: data.toString() } )
} ) } )
// Debug
if( this.options.debug )
{
console.log( 'add:'.green.bold, relative_path )
}
} ) } )
// Change event // Change event
@@ -124,14 +109,18 @@ class App
// Set up // Set up
let relative_path = _path.replace( process.cwd(), '.' ) let relative_path = _path.replace( process.cwd(), '.' )
console.log( 'change:'.green.bold, relative_path )
// Read // Read
fs.readFile( _path, ( error, data ) => fs.readFile( _path, ( error, data ) =>
{ {
// Send // Send
this.socket.emit( 'update_file', { path: relative_path, content: data.toString() } ) this.socket.emit( 'update_file', { path: relative_path, content: data.toString() } )
} ) } )
// Debug
if( this.options.debug )
{
console.log( 'change:'.green.bold, relative_path )
}
} ) } )
// Unlink event // Unlink event
@@ -140,10 +129,14 @@ class App
// Set up // Set up
let relative_path = _path.replace( process.cwd(), '.' ) let relative_path = _path.replace( process.cwd(), '.' )
console.log( 'unlink:'.green.bold, relative_path )
// Send // Send
this.socket.emit( 'delete_file', { path: relative_path } ) this.socket.emit( 'delete_file', { path: relative_path } )
// Debug
if( this.options.debug )
{
console.log( 'unlink:'.green.bold, relative_path )
}
} ) } )
// AddDir event // AddDir event
@@ -152,10 +145,14 @@ class App
// Set up // Set up
let relative_path = _path.replace( process.cwd(), '.' ) let relative_path = _path.replace( process.cwd(), '.' )
console.log( 'addDir:'.green.bold, relative_path )
// Send // Send
this.socket.emit( 'create_folder', { path: relative_path } ) this.socket.emit( 'create_folder', { path: relative_path } )
// Debug
if( this.options.debug )
{
console.log( 'addDir:'.green.bold, relative_path )
}
} ) } )
// UnlinkDir event // UnlinkDir event
@@ -164,12 +161,16 @@ class App
// Set up // Set up
let relative_path = _path.replace( process.cwd(), '.' ) let relative_path = _path.replace( process.cwd(), '.' )
console.log( 'unlinkDir:'.green.bold, relative_path )
// Send // Send
this.socket.emit( 'delete_folder', { path: relative_path } ) this.socket.emit( 'delete_folder', { path: relative_path } )
// Debug
if( this.options.debug )
{
console.log( 'unlinkDir:'.green.bold, relative_path )
}
} ) } )
} }
} }
module.exports = App module.exports = Watcher