From c2664025d6901a90a085bcaf4642ae26990896ed Mon Sep 17 00:00:00 2001 From: Luciano Perezzini Date: Thu, 5 Jan 2017 16:00:57 -0300 Subject: [PATCH] Initial commit --- .bowerrc | 3 + .gitignore | 9 +++ app.js | 57 ++++++++++++++++++ bin/www | 91 +++++++++++++++++++++++++++++ client/app/app.component.html | 5 ++ client/app/app.component.ts | 13 +++++ client/app/app.module.ts | 11 ++++ client/app/main.ts | 5 ++ client/app/services/task.service.ts | 15 +++++ client/package.json | 57 ++++++++++++++++++ client/stylesheets/styles.css | 5 ++ client/systemjs.config.js | 41 +++++++++++++ client/tsconfig.json | 13 +++++ client/typings.json | 7 +++ models/thing.js | 14 +++++ package.json | 24 ++++++++ routes/api.js | 15 +++++ routes/index.js | 9 +++ views/error.ejs | 3 + views/index.ejs | 25 ++++++++ 20 files changed, 422 insertions(+) create mode 100644 .bowerrc create mode 100644 .gitignore create mode 100644 app.js create mode 100755 bin/www create mode 100644 client/app/app.component.html create mode 100644 client/app/app.component.ts create mode 100644 client/app/app.module.ts create mode 100644 client/app/main.ts create mode 100644 client/app/services/task.service.ts create mode 100644 client/package.json create mode 100644 client/stylesheets/styles.css create mode 100644 client/systemjs.config.js create mode 100644 client/tsconfig.json create mode 100644 client/typings.json create mode 100644 models/thing.js create mode 100644 package.json create mode 100644 routes/api.js create mode 100644 routes/index.js create mode 100644 views/error.ejs create mode 100644 views/index.ejs diff --git a/.bowerrc b/.bowerrc new file mode 100644 index 0000000..06257c8 --- /dev/null +++ b/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "client/bower_components" +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..53f91a2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.idea +.env +node_modules +client/node_modules +client/bower_components +npm-debug.* +link-checker-results.txt +client/app/**/*.js +*.js.map \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..b0129a4 --- /dev/null +++ b/app.js @@ -0,0 +1,57 @@ +var express = require('express'); +var path = require('path'); +var favicon = require('serve-favicon'); +var logger = require('morgan'); +var cookieParser = require('cookie-parser'); +var bodyParser = require('body-parser'); + +// init Mongoose schemas & init db through Mongoose +require('./models/thing') +var mongoose = require('mongoose'); +mongoose.connect('mongodb://' + + process.env.DB_HOST + + '/' + + process.env.DB_NAME); + +var index = require('./routes/index'); +var api = require('./routes/api'); + +var app = express(); + +// view engine setup +app.set('views', path.join(__dirname, 'views')); +app.set('view engine', 'ejs'); +// added from tutorial +app.engine('html', require('ejs').renderFile); + +// uncomment after placing your favicon in /public +//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); +app.use(logger('dev')); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: false })); +app.use(cookieParser()); +// set static folder (Angular 2 stuff) +app.use(express.static(path.join(__dirname, 'client'))); + +app.use('/', index); +app.use('/api', api); + +// catch 404 and forward to error handler +app.use(function(req, res, next) { + var err = new Error('Not Found'); + err.status = 404; + next(err); +}); + +// error handler +app.use(function(err, req, res, next) { + // set locals, only providing error in development + res.locals.message = err.message; + res.locals.error = req.app.get('env') === 'development' ? err : {}; + + // render the error page + res.status(err.status || 500); + res.render('error'); +}); + +module.exports = app; \ No newline at end of file diff --git a/bin/www b/bin/www new file mode 100755 index 0000000..61e099b --- /dev/null +++ b/bin/www @@ -0,0 +1,91 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var app = require('../app'); +var debug = require('debug')('mean-seed:server'); +var http = require('http'); + +/** + * Get port from environment and store in Express. + */ + +var port = normalizePort(process.env.PORT); +app.set('port', port); + +/** + * Create HTTP server. + */ + +var server = http.createServer(app); + +/** + * Listen on provided port, on all network interfaces. + */ + +server.listen(port); +server.on('error', onError); +server.on('listening', onListening); + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + var port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; +} + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== 'listen') { + throw error; + } + + var bind = typeof port === 'string' + ? 'Pipe ' + port + : 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + var addr = server.address(); + var bind = typeof addr === 'string' + ? 'pipe ' + addr + : 'port ' + addr.port; + debug('Listening on ' + bind); + console.log('Server listening on port: ' + port); +} diff --git a/client/app/app.component.html b/client/app/app.component.html new file mode 100644 index 0000000..4c7a039 --- /dev/null +++ b/client/app/app.component.html @@ -0,0 +1,5 @@ +
+

Hello, {{name}}

+
+

{{description}}

+
\ No newline at end of file diff --git a/client/app/app.component.ts b/client/app/app.component.ts new file mode 100644 index 0000000..5bb8314 --- /dev/null +++ b/client/app/app.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; + +@Component({ + moduleId: module.id, // use this in order to use relative paths + selector: 'my-app', + //template: `

Hello {{name}}

`, + templateUrl: 'app.component.html' +}) +export class AppComponent { + name: string = 'Angular'; + description: string = 'Start from here! This is the root component!'; + +} diff --git a/client/app/app.module.ts b/client/app/app.module.ts new file mode 100644 index 0000000..357b003 --- /dev/null +++ b/client/app/app.module.ts @@ -0,0 +1,11 @@ +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; + +import { AppComponent } from './app.component'; + +@NgModule({ + imports: [ BrowserModule ], + declarations: [ AppComponent ], + bootstrap: [ AppComponent ] +}) +export class AppModule { } diff --git a/client/app/main.ts b/client/app/main.ts new file mode 100644 index 0000000..6af7a5b --- /dev/null +++ b/client/app/main.ts @@ -0,0 +1,5 @@ +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app.module'; + +platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/client/app/services/task.service.ts b/client/app/services/task.service.ts new file mode 100644 index 0000000..d3740fe --- /dev/null +++ b/client/app/services/task.service.ts @@ -0,0 +1,15 @@ +/* + * Template of a service + */ + +import { Injectable } from '@angular/core'; +import { Http, Headers} from '@angular/http'; +import 'rxjs/add/operator/map'; + +@Injectable() +export class Service { + + constructor(private http: Http) { + // code... + } +} \ No newline at end of file diff --git a/client/package.json b/client/package.json new file mode 100644 index 0000000..0c7db9b --- /dev/null +++ b/client/package.json @@ -0,0 +1,57 @@ +{ + "name": "mean-seed", + "version": "1.0.0", + "description": "QuickStart package.json from the documentation, supplemented with testing support", + "scripts": { + "start": "tsc && tsc -w ", + "e2e": "tsc && concurrently \"http-server -s\" \"protractor protractor.config.js\" --kill-others --success first", + "lint": "tslint ./app/**/*.ts -t verbose", + "lite": "lite-server", + "pree2e": "webdriver-manager update", + "test": "tsc && concurrently \"tsc -w\" \"karma start karma.conf.js\"", + "test-once": "tsc && karma start karma.conf.js --single-run", + "tsc": "tsc", + "tsc:w": "tsc -w" + }, + "keywords": [], + "author": "", + "license": "MIT", + "dependencies": { + "@angular/common": "~2.4.0", + "@angular/compiler": "~2.4.0", + "@angular/core": "~2.4.0", + "@angular/forms": "~2.4.0", + "@angular/http": "~2.4.0", + "@angular/platform-browser": "~2.4.0", + "@angular/platform-browser-dynamic": "~2.4.0", + "@angular/router": "~3.4.0", + + "angular-in-memory-web-api": "~0.2.4", + "systemjs": "0.19.40", + "core-js": "^2.4.1", + "rxjs": "5.0.1", + "zone.js": "^0.7.4" + }, + "devDependencies": { + "concurrently": "^3.1.0", + "lite-server": "^2.2.2", + "typescript": "~2.0.10", + + "canonical-path": "0.0.2", + "http-server": "^0.9.0", + "tslint": "^3.15.1", + "lodash": "^4.16.4", + "jasmine-core": "~2.4.1", + "karma": "^1.3.0", + "karma-chrome-launcher": "^2.0.0", + "karma-cli": "^1.0.1", + "karma-jasmine": "^1.0.2", + "karma-jasmine-html-reporter": "^0.2.2", + "protractor": "~4.0.14", + "rimraf": "^2.5.4", + + "@types/node": "^6.0.46", + "@types/jasmine": "^2.5.36" + }, + "repository": {} +} diff --git a/client/stylesheets/styles.css b/client/stylesheets/styles.css new file mode 100644 index 0000000..58e1a7d --- /dev/null +++ b/client/stylesheets/styles.css @@ -0,0 +1,5 @@ +h1 { + color: #369; + font-family: Arial, Helvetica, sans-serif; + font-size: 250%; +} diff --git a/client/systemjs.config.js b/client/systemjs.config.js new file mode 100644 index 0000000..68caa9f --- /dev/null +++ b/client/systemjs.config.js @@ -0,0 +1,41 @@ +/** + * System configuration for Angular samples + * Adjust as necessary for your application needs. + */ +(function (global) { + System.config({ + paths: { + // paths serve as alias + 'npm:': 'node_modules/' + }, + // map tells the System loader where to look for things + map: { + // our app is within the app folder + app: 'app', + + // angular bundles + '@angular/core': 'npm:@angular/core/bundles/core.umd.js', + '@angular/common': 'npm:@angular/common/bundles/common.umd.js', + '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js', + '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js', + '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js', + '@angular/http': 'npm:@angular/http/bundles/http.umd.js', + '@angular/router': 'npm:@angular/router/bundles/router.umd.js', + '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js', + + // other libraries + 'rxjs': 'npm:rxjs', + 'angular-in-memory-web-api': 'npm:angular-in-memory-web-api/bundles/in-memory-web-api.umd.js' + }, + // packages tells the System loader how to load when no filename and/or no extension + packages: { + app: { + main: './main.js', + defaultExtension: 'js' + }, + rxjs: { + defaultExtension: 'js' + } + } + }); +})(this); diff --git a/client/tsconfig.json b/client/tsconfig.json new file mode 100644 index 0000000..2c7260d --- /dev/null +++ b/client/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "moduleResolution": "node", + "sourceMap": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "lib": [ "es2015", "dom" ], + "noImplicitAny": true, + "suppressImplicitAnyIndexErrors": true + } +} diff --git a/client/typings.json b/client/typings.json new file mode 100644 index 0000000..7da31ca --- /dev/null +++ b/client/typings.json @@ -0,0 +1,7 @@ +{ + "globalDependencies": { + "core-js": "registry:dt/core-js#0.0.0+20160725163759", + "jasmine": "registry:dt/jasmine#2.2.0+20160621224255", + "node": "registry:dt/node#6.0.0+20160909174046" + } +} diff --git a/models/thing.js b/models/thing.js new file mode 100644 index 0000000..5a6dce0 --- /dev/null +++ b/models/thing.js @@ -0,0 +1,14 @@ +var mongoose = require('mongoose'); +var Schema = mongoose.Schema; + +/* + * Example of a schema definition: + +var userSchema = new mongoose.Schema({ + username: String, + password: String, //hash created from password + created_at: {type: Date, default: Date.now} +}); + +mongoose.model('Thing', userSchema); // this will create a 'users' collection @ process.env.DB_NAME if it does not exists +*/ \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..2742de2 --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "mean-seed", + "version": "0.0.0", + "description": "Quickstart seed for implementing a MEAN project", + "private": true, + "scripts": { + "start-server": "node -r dotenv/config ./bin/www", + "start-client": "cd client/ && npm start", + "start": "concurrently --kill-others \"npm run start-server\" \"npm run start-client\"" + }, + "dependencies": { + "body-parser": "~1.15.2", + "concurrently": "^3.1.0", + "cookie-parser": "~1.4.3", + "debug": "~2.2.0", + "dotenv": "^2.0.0", + "ejs": "~2.5.2", + "express": "~4.14.0", + "mongoose": "^4.7.6", + "morgan": "~1.7.0", + "serve-favicon": "~2.3.0" + }, + "author": "Luciano Perezzini" +} diff --git a/routes/api.js b/routes/api.js new file mode 100644 index 0000000..09c4410 --- /dev/null +++ b/routes/api.js @@ -0,0 +1,15 @@ +var express = require('express'); +var router = express.Router(); + +var mongoose = require('mongoose'); +/* + * Require schema model(s) through Mongoose + var Thing = mongoose.model('Thing'); + */ + +/* GET API. */ +router.get('/', function(req, res, next) { + res.send({message: 'TODO: RESTful API'}); +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/index.js b/routes/index.js new file mode 100644 index 0000000..ecca96a --- /dev/null +++ b/routes/index.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET home page. */ +router.get('/', function(req, res, next) { + res.render('index', { title: 'Express' }); +}); + +module.exports = router; diff --git a/views/error.ejs b/views/error.ejs new file mode 100644 index 0000000..7cf94ed --- /dev/null +++ b/views/error.ejs @@ -0,0 +1,3 @@ +

<%= message %>

+

<%= error.status %>

+
<%= error.stack %>
diff --git a/views/index.ejs b/views/index.ejs new file mode 100644 index 0000000..c9e377a --- /dev/null +++ b/views/index.ejs @@ -0,0 +1,25 @@ + + + + Seed Index Page + + + + + + + + + + + + + + + + + Loading AppComponent content here ... + + \ No newline at end of file