init
This commit is contained in:
commit
2a0f68e434
|
@ -0,0 +1,10 @@
|
||||||
|
.DS_Store
|
||||||
|
*.seed
|
||||||
|
*.log
|
||||||
|
*.csv
|
||||||
|
*.dat
|
||||||
|
*.out
|
||||||
|
*.pid
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
node_modules/
|
|
@ -0,0 +1,13 @@
|
||||||
|
# asteroid
|
||||||
|
v0.0.1
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
slnode install asteroid
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
var Asteroid = require('asteroid');
|
||||||
|
var asteroid = Asteroid.create();
|
||||||
|
|
||||||
|
asteroid.myMethod();
|
|
@ -0,0 +1,8 @@
|
||||||
|
var asteroid = require('../../');
|
||||||
|
var app = asteroid();
|
||||||
|
|
||||||
|
app.get('/', function (req, res) {
|
||||||
|
res.send('hello world');
|
||||||
|
});
|
||||||
|
|
||||||
|
app.listen(3000);
|
|
@ -0,0 +1,7 @@
|
||||||
|
var asteroid = require('../../');
|
||||||
|
var app = asteroid();
|
||||||
|
|
||||||
|
app.use(asteroid.configure());
|
||||||
|
app.use(asteroid.resources());
|
||||||
|
|
||||||
|
app.listen(3000);
|
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"module": "resource",
|
||||||
|
"options": {
|
||||||
|
"path": "/example-resource",
|
||||||
|
"msg": "my message?"
|
||||||
|
},
|
||||||
|
"main": "example.js"
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
// any module instance can be required by its directory
|
||||||
|
var exampleResource = require('.');
|
||||||
|
|
||||||
|
// exampleResource.app is an express sub app
|
||||||
|
// anything registered (routes, middleware)
|
||||||
|
// will only run relative to the defined root
|
||||||
|
// '/' resolves to '/example-resource'
|
||||||
|
exampleResource.app.get('/', function (req, res) {
|
||||||
|
res.send(exampleResource.options.msg + '??????');
|
||||||
|
});
|
||||||
|
|
||||||
|
exampleResource.app.get('/foo', function (req, res) {
|
||||||
|
res.send('foo!!!');
|
||||||
|
});
|
|
@ -0,0 +1,7 @@
|
||||||
|
var asteroid = require('../../');
|
||||||
|
var app = asteroid();
|
||||||
|
|
||||||
|
app.use(asteroid.configure());
|
||||||
|
app.use(asteroid.resources());
|
||||||
|
|
||||||
|
app.listen(3000);
|
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"production": {
|
||||||
|
"module": "mongo",
|
||||||
|
"options": {
|
||||||
|
"database": "todos",
|
||||||
|
"port": 5555,
|
||||||
|
"host": "remote.db.com",
|
||||||
|
"username": "foo",
|
||||||
|
"password": "bar"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"module": "data-store",
|
||||||
|
"options": {
|
||||||
|
"database": "asteroid-examples-todos",
|
||||||
|
"port": 27017,
|
||||||
|
"host": "127.0.0.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"db": "memory"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"module": "collection",
|
||||||
|
"options": {
|
||||||
|
"path": "/todos"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"model": "todos-model"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
"module": "model",
|
||||||
|
"options": {
|
||||||
|
"properties": [
|
||||||
|
{
|
||||||
|
"name": "title",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "done",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "order",
|
||||||
|
"type": "number"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"data-store": "db"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
var todos = require('.');
|
||||||
|
|
||||||
|
todos.app.get('/completed', function (req, res) {
|
||||||
|
todos.store.all({where: {creator: req.me, done: true}}, todos.done);
|
||||||
|
});
|
||||||
|
|
||||||
|
todos.on('before:validate', function (todo, ctx) {
|
||||||
|
if(!todo.name) {
|
||||||
|
throw new Error('name is required');
|
||||||
|
}
|
||||||
|
|
||||||
|
if(todo.name.length > 144) {
|
||||||
|
ctx.error('name must be shorter than 144 characters');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
todos.on('before:create', function (todo, ctx, done) {
|
||||||
|
ctx.errorUnless(ctx.isEmail(todos.creator));
|
||||||
|
|
||||||
|
todos.model.count({owner: todo.owner}, function (err) {
|
||||||
|
if(err) {
|
||||||
|
done(err);
|
||||||
|
} else {
|
||||||
|
ctx.errorIf(count > 100, 'each user can only have 100 todos');
|
||||||
|
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
todos.on('query', function (query, ctx) {
|
||||||
|
ctx.cancelUnless(query.creator);
|
||||||
|
query.$limit = query.$limit || 16;
|
||||||
|
ctx.errorIf(query.$limit > 16, 'todos can only include a maximum of 16 results');
|
||||||
|
});
|
||||||
|
|
||||||
|
todos.on('modify', function (todo, ctx) {
|
||||||
|
ctx.cancelUnless(ctx.isMe(todo.creator));
|
||||||
|
});
|
||||||
|
|
||||||
|
todos.on('request', function (ctx) {
|
||||||
|
ctx.cancelUnless(ctx.me);
|
||||||
|
});
|
|
@ -0,0 +1,20 @@
|
||||||
|
{
|
||||||
|
"module": "users-collection",
|
||||||
|
"options": {
|
||||||
|
"root": "/users",
|
||||||
|
"name": "users",
|
||||||
|
"properties": [
|
||||||
|
{
|
||||||
|
"name": "email",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "password",
|
||||||
|
"type": "password"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"store": "store"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
/**
|
||||||
|
* asteroid ~ public api
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = require('./lib/asteroid');
|
|
@ -0,0 +1,76 @@
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var express = require('express')
|
||||||
|
, fs = require('fs')
|
||||||
|
, path = require('path')
|
||||||
|
, utils = express.utils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expose `createApplication()`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var asteroid = exports = module.exports = createApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Framework version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
asteroid.version = require('../package.json').version;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expose mime.
|
||||||
|
*/
|
||||||
|
|
||||||
|
asteroid.mime = express.mime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an asteroid application.
|
||||||
|
*
|
||||||
|
* @return {Function}
|
||||||
|
* @api public
|
||||||
|
*/
|
||||||
|
|
||||||
|
function createApplication() {
|
||||||
|
var app = express();
|
||||||
|
|
||||||
|
app.disuse = function (route) {
|
||||||
|
if(this.stack) {
|
||||||
|
for (var i = 0; i < this.stack.length; i++) {
|
||||||
|
if(this.stack[i].route === route) {
|
||||||
|
this.stack.splice(i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return app;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expose express.middleware as asteroid.*
|
||||||
|
* for example `asteroid.errorHandler` etc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (var key in express) {
|
||||||
|
Object.defineProperty(
|
||||||
|
asteroid
|
||||||
|
, key
|
||||||
|
, Object.getOwnPropertyDescriptor(express, key));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expose additional asteroid middleware
|
||||||
|
* for example `asteroid.configure` etc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
fs.readdirSync(path.join(__dirname, 'middleware')).forEach(function (m) {
|
||||||
|
asteroid[m.replace(/\.js$/, '')] = require('./middleware/' + m);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error handler title
|
||||||
|
*/
|
||||||
|
|
||||||
|
asteroid.errorHandler.title = 'Asteroid';
|
|
@ -0,0 +1,25 @@
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var ModuleLoader = require('module-loader');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Export the middleware.
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = configure;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load application modules based on the current directories configuration files.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function configure(root) {
|
||||||
|
var moduleLoader = ModuleLoader.create(root || '.');
|
||||||
|
|
||||||
|
return function configureMiddleware(req, res, next) {
|
||||||
|
req.modules = res.modules = moduleLoader;
|
||||||
|
moduleLoader.load(next);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var ModuleLoader = require('module-loader');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Export the middleware.
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = middleware;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load application modules based on the current directories configuration files.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function middleware() {
|
||||||
|
var modules = this.modules;
|
||||||
|
|
||||||
|
return function executeAsteroidMiddleware(req, res, next) {
|
||||||
|
// TODO implement asteroid specific middleware stack
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
/**
|
||||||
|
* Module dependencies.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var asteroid = require('../asteroid');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Export the middleware.
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = resources;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build a temp app for mounting resources.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function resources() {
|
||||||
|
return function (req, res, next) {
|
||||||
|
// xxx - cache the temp app and only build when modules change?
|
||||||
|
var tempApp = asteroid();
|
||||||
|
var resources = req.modules.instanceOf('Resource');
|
||||||
|
|
||||||
|
// mount all resources
|
||||||
|
resources.forEach(function (r) {
|
||||||
|
r.mount(tempApp);
|
||||||
|
});
|
||||||
|
|
||||||
|
tempApp.handle(req, res, next);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"name": "asteroid",
|
||||||
|
"description": "asteroid",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"scripts": {
|
||||||
|
"test": "mocha"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"debug": "latest",
|
||||||
|
"express": "~3.1.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"mocha": "latest"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
var Asteroid = require('../');
|
||||||
|
|
||||||
|
describe('Asteroid', function(){
|
||||||
|
var asteroid;
|
||||||
|
|
||||||
|
beforeEach(function(){
|
||||||
|
asteroid = new Asteroid;
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('.myMethod', function(){
|
||||||
|
// example sync test
|
||||||
|
it('should <description of behavior>', function() {
|
||||||
|
asteroid.myMethod();
|
||||||
|
});
|
||||||
|
|
||||||
|
// example async test
|
||||||
|
it('should <description of behavior>', function(done) {
|
||||||
|
setTimeout(function () {
|
||||||
|
asteroid.myMethod();
|
||||||
|
done();
|
||||||
|
}, 0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,5 @@
|
||||||
|
/**
|
||||||
|
* asteroid test setup and support.
|
||||||
|
*/
|
||||||
|
|
||||||
|
assert = require('assert');
|
Loading…
Reference in New Issue