sipp11
10 years ago
commit
416ed98563
77 changed files with 4238 additions and 0 deletions
@ -0,0 +1,10 @@ |
|||||||
|
# editorconfig.org |
||||||
|
root = true |
||||||
|
|
||||||
|
[*] |
||||||
|
indent_style = space |
||||||
|
indent_size = 2 |
||||||
|
end_of_line = lf |
||||||
|
charset = utf-8 |
||||||
|
trim_trailing_whitespace = true |
||||||
|
insert_final_newline = true |
@ -0,0 +1,118 @@ |
|||||||
|
################################################ |
||||||
|
############### .gitignore ################## |
||||||
|
################################################ |
||||||
|
# |
||||||
|
# This file is only relevant if you are using git. |
||||||
|
# |
||||||
|
# Files which match the splat patterns below will |
||||||
|
# be ignored by git. This keeps random crap and |
||||||
|
# sensitive credentials from being uploaded to |
||||||
|
# your repository. It allows you to configure your |
||||||
|
# app for your machine without accidentally |
||||||
|
# committing settings which will smash the local |
||||||
|
# settings of other developers on your team. |
||||||
|
# |
||||||
|
# Some reasonable defaults are included below, |
||||||
|
# but, of course, you should modify/extend/prune |
||||||
|
# to fit your needs! |
||||||
|
################################################ |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################ |
||||||
|
# Local Configuration |
||||||
|
# |
||||||
|
# Explicitly ignore files which contain: |
||||||
|
# |
||||||
|
# 1. Sensitive information you'd rather not push to |
||||||
|
# your git repository. |
||||||
|
# e.g., your personal API keys or passwords. |
||||||
|
# |
||||||
|
# 2. Environment-specific configuration |
||||||
|
# Basically, anything that would be annoying |
||||||
|
# to have to change every time you do a |
||||||
|
# `git pull` |
||||||
|
# e.g., your local development database, or |
||||||
|
# the S3 bucket you're using for file uploads |
||||||
|
# development. |
||||||
|
# |
||||||
|
################################################ |
||||||
|
|
||||||
|
config/local.js |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################ |
||||||
|
# Dependencies |
||||||
|
# |
||||||
|
# When releasing a production app, you may |
||||||
|
# consider including your node_modules and |
||||||
|
# bower_components directory in your git repo, |
||||||
|
# but during development, its best to exclude it, |
||||||
|
# since different developers may be working on |
||||||
|
# different kernels, where dependencies would |
||||||
|
# need to be recompiled anyway. |
||||||
|
# |
||||||
|
# More on that here about node_modules dir: |
||||||
|
# http://www.futurealoof.com/posts/nodemodules-in-git.html |
||||||
|
# (credit Mikeal Rogers, @mikeal) |
||||||
|
# |
||||||
|
# About bower_components dir, you can see this: |
||||||
|
# http://addyosmani.com/blog/checking-in-front-end-dependencies/ |
||||||
|
# (credit Addy Osmani, @addyosmani) |
||||||
|
# |
||||||
|
################################################ |
||||||
|
|
||||||
|
node_modules |
||||||
|
bower_components |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################ |
||||||
|
# Sails.js / Waterline / Grunt |
||||||
|
# |
||||||
|
# Files generated by Sails and Grunt, or related |
||||||
|
# tasks and adapters. |
||||||
|
################################################ |
||||||
|
.tmp |
||||||
|
dump.rdb |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################ |
||||||
|
# Node.js / NPM |
||||||
|
# |
||||||
|
# Common files generated by Node, NPM, and the |
||||||
|
# related ecosystem. |
||||||
|
################################################ |
||||||
|
lib-cov |
||||||
|
*.seed |
||||||
|
*.log |
||||||
|
*.out |
||||||
|
*.pid |
||||||
|
npm-debug.log |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
################################################ |
||||||
|
# Miscellaneous |
||||||
|
# |
||||||
|
# Common files generated by text editors, |
||||||
|
# operating systems, file systems, etc. |
||||||
|
################################################ |
||||||
|
|
||||||
|
*~ |
||||||
|
*# |
||||||
|
.DS_STORE |
||||||
|
.netbeans |
||||||
|
nbproject |
||||||
|
.idea |
||||||
|
.node_history |
@ -0,0 +1,8 @@ |
|||||||
|
{ |
||||||
|
"generators": { |
||||||
|
"modules": {} |
||||||
|
}, |
||||||
|
"hooks": { |
||||||
|
"grunt": false |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,81 @@ |
|||||||
|
/** |
||||||
|
* Gruntfile |
||||||
|
* |
||||||
|
* This Node script is executed when you run `grunt` or `sails lift`. |
||||||
|
* It's purpose is to load the Grunt tasks in your project's `tasks` |
||||||
|
* folder, and allow you to add and remove tasks as you see fit. |
||||||
|
* For more information on how this works, check out the `README.md` |
||||||
|
* file that was generated in your `tasks` folder. |
||||||
|
* |
||||||
|
* WARNING: |
||||||
|
* Unless you know what you're doing, you shouldn't change this file. |
||||||
|
* Check out the `tasks` directory instead. |
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports = function(grunt) { |
||||||
|
|
||||||
|
|
||||||
|
// Load the include-all library in order to require all of our grunt
|
||||||
|
// configurations and task registrations dynamically.
|
||||||
|
var includeAll; |
||||||
|
try { |
||||||
|
includeAll = require('include-all'); |
||||||
|
} catch (e0) { |
||||||
|
try { |
||||||
|
includeAll = require('sails/node_modules/include-all'); |
||||||
|
} |
||||||
|
catch(e1) { |
||||||
|
console.error('Could not find `include-all` module.'); |
||||||
|
console.error('Skipping grunt tasks...'); |
||||||
|
console.error('To fix this, please run:'); |
||||||
|
console.error('npm install include-all --save`'); |
||||||
|
console.error(); |
||||||
|
|
||||||
|
grunt.registerTask('default', []); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Loads Grunt configuration modules from the specified |
||||||
|
* relative path. These modules should export a function |
||||||
|
* that, when run, should either load/configure or register |
||||||
|
* a Grunt task. |
||||||
|
*/ |
||||||
|
function loadTasks(relPath) { |
||||||
|
return includeAll({ |
||||||
|
dirname: require('path').resolve(__dirname, relPath), |
||||||
|
filter: /(.+)\.js$/ |
||||||
|
}) || {}; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Invokes the function from a Grunt configuration module with |
||||||
|
* a single argument - the `grunt` object. |
||||||
|
*/ |
||||||
|
function invokeConfigFn(tasks) { |
||||||
|
for (var taskName in tasks) { |
||||||
|
if (tasks.hasOwnProperty(taskName)) { |
||||||
|
tasks[taskName](grunt); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Load task functions
|
||||||
|
var taskConfigurations = loadTasks('./tasks/config'), |
||||||
|
registerDefinitions = loadTasks('./tasks/register'); |
||||||
|
|
||||||
|
// (ensure that a default task exists)
|
||||||
|
if (!registerDefinitions.default) { |
||||||
|
registerDefinitions.default = function (grunt) { grunt.registerTask('default', []); }; |
||||||
|
} |
||||||
|
|
||||||
|
// Run task functions to configure Grunt.
|
||||||
|
invokeConfigFn(taskConfigurations); |
||||||
|
invokeConfigFn(registerDefinitions); |
||||||
|
|
||||||
|
}; |
@ -0,0 +1,11 @@ |
|||||||
|
/** |
||||||
|
* FlagController |
||||||
|
* |
||||||
|
* @description :: Server-side logic for managing flags |
||||||
|
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers
|
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
|
||||||
|
}; |
||||||
|
|
@ -0,0 +1,11 @@ |
|||||||
|
/** |
||||||
|
* NationalityController |
||||||
|
* |
||||||
|
* @description :: Server-side logic for managing nationalities |
||||||
|
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers
|
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
|
||||||
|
}; |
||||||
|
|
@ -0,0 +1,11 @@ |
|||||||
|
/** |
||||||
|
* PrefixController |
||||||
|
* |
||||||
|
* @description :: Server-side logic for managing prefixes |
||||||
|
* @help :: See http://sailsjs.org/#!/documentation/concepts/Controllers
|
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
|
||||||
|
}; |
||||||
|
|
@ -0,0 +1,14 @@ |
|||||||
|
/** |
||||||
|
* Flag.js |
||||||
|
* |
||||||
|
* @description :: TODO: You might write a short summary of how this model works and what it represents here. |
||||||
|
* @docs :: http://sailsjs.org/#!documentation/models
|
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
|
||||||
|
attributes: { |
||||||
|
|
||||||
|
} |
||||||
|
}; |
||||||
|
|
@ -0,0 +1,14 @@ |
|||||||
|
/** |
||||||
|
* Nationality.js |
||||||
|
* |
||||||
|
* @description :: TODO: You might write a short summary of how this model works and what it represents here. |
||||||
|
* @docs :: http://sailsjs.org/#!documentation/models
|
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
|
||||||
|
attributes: { |
||||||
|
|
||||||
|
} |
||||||
|
}; |
||||||
|
|
@ -0,0 +1,14 @@ |
|||||||
|
/** |
||||||
|
* Prefix.js |
||||||
|
* |
||||||
|
* @description :: TODO: You might write a short summary of how this model works and what it represents here. |
||||||
|
* @docs :: http://sailsjs.org/#!documentation/models
|
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
|
||||||
|
attributes: { |
||||||
|
|
||||||
|
} |
||||||
|
}; |
||||||
|
|
@ -0,0 +1,21 @@ |
|||||||
|
/** |
||||||
|
* sessionAuth |
||||||
|
* |
||||||
|
* @module :: Policy |
||||||
|
* @description :: Simple policy to allow any authenticated user |
||||||
|
* Assumes that your login action in one of your controllers sets `req.session.authenticated = true;` |
||||||
|
* @docs :: http://sailsjs.org/#!/documentation/concepts/Policies
|
||||||
|
* |
||||||
|
*/ |
||||||
|
module.exports = function(req, res, next) { |
||||||
|
|
||||||
|
// User is allowed, proceed to the next policy,
|
||||||
|
// or if this is the last policy, the controller
|
||||||
|
if (req.session.authenticated) { |
||||||
|
return next(); |
||||||
|
} |
||||||
|
|
||||||
|
// User is not allowed
|
||||||
|
// (default res.forbidden() behavior can be overridden in `config/403.js`)
|
||||||
|
return res.forbidden('You are not permitted to perform this action.'); |
||||||
|
}; |
@ -0,0 +1,64 @@ |
|||||||
|
/** |
||||||
|
* 400 (Bad Request) Handler |
||||||
|
* |
||||||
|
* Usage: |
||||||
|
* return res.badRequest(); |
||||||
|
* return res.badRequest(data); |
||||||
|
* return res.badRequest(data, 'some/specific/badRequest/view'); |
||||||
|
* |
||||||
|
* e.g.: |
||||||
|
* ``` |
||||||
|
* return res.badRequest( |
||||||
|
* 'Please choose a valid `password` (6-12 characters)', |
||||||
|
* 'trial/signup' |
||||||
|
* ); |
||||||
|
* ``` |
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports = function badRequest(data, options) { |
||||||
|
|
||||||
|
// Get access to `req`, `res`, & `sails`
|
||||||
|
var req = this.req; |
||||||
|
var res = this.res; |
||||||
|
var sails = req._sails; |
||||||
|
|
||||||
|
// Set status code
|
||||||
|
res.status(400); |
||||||
|
|
||||||
|
// Log error to console
|
||||||
|
if (data !== undefined) { |
||||||
|
sails.log.verbose('Sending 400 ("Bad Request") response: \n',data); |
||||||
|
} |
||||||
|
else sails.log.verbose('Sending 400 ("Bad Request") response'); |
||||||
|
|
||||||
|
// Only include errors in response if application environment
|
||||||
|
// is not set to 'production'. In production, we shouldn't
|
||||||
|
// send back any identifying information about errors.
|
||||||
|
if (sails.config.environment === 'production') { |
||||||
|
data = undefined; |
||||||
|
} |
||||||
|
|
||||||
|
// If the user-agent wants JSON, always respond with JSON
|
||||||
|
if (req.wantsJSON) { |
||||||
|
return res.jsonx(data); |
||||||
|
} |
||||||
|
|
||||||
|
// If second argument is a string, we take that to mean it refers to a view.
|
||||||
|
// If it was omitted, use an empty object (`{}`)
|
||||||
|
options = (typeof options === 'string') ? { view: options } : options || {}; |
||||||
|
|
||||||
|
// If a view was provided in options, serve it.
|
||||||
|
// Otherwise try to guess an appropriate view, or if that doesn't
|
||||||
|
// work, just send JSON.
|
||||||
|
if (options.view) { |
||||||
|
return res.view(options.view, { data: data }); |
||||||
|
} |
||||||
|
|
||||||
|
// If no second argument provided, try to serve the implied view,
|
||||||
|
// but fall back to sending JSON(P) if no view can be inferred.
|
||||||
|
else return res.guessView({ data: data }, function couldNotGuessView () { |
||||||
|
return res.jsonx(data); |
||||||
|
}); |
||||||
|
|
||||||
|
}; |
||||||
|
|
@ -0,0 +1,77 @@ |
|||||||
|
/** |
||||||
|
* 403 (Forbidden) Handler |
||||||
|
* |
||||||
|
* Usage: |
||||||
|
* return res.forbidden(); |
||||||
|
* return res.forbidden(err); |
||||||
|
* return res.forbidden(err, 'some/specific/forbidden/view'); |
||||||
|
* |
||||||
|
* e.g.: |
||||||
|
* ``` |
||||||
|
* return res.forbidden('Access denied.'); |
||||||
|
* ``` |
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports = function forbidden (data, options) { |
||||||
|
|
||||||
|
// Get access to `req`, `res`, & `sails`
|
||||||
|
var req = this.req; |
||||||
|
var res = this.res; |
||||||
|
var sails = req._sails; |
||||||
|
|
||||||
|
// Set status code
|
||||||
|
res.status(403); |
||||||
|
|
||||||
|
// Log error to console
|
||||||
|
if (data !== undefined) { |
||||||
|
sails.log.verbose('Sending 403 ("Forbidden") response: \n',data); |
||||||
|
} |
||||||
|
else sails.log.verbose('Sending 403 ("Forbidden") response'); |
||||||
|
|
||||||
|
// Only include errors in response if application environment
|
||||||
|
// is not set to 'production'. In production, we shouldn't
|
||||||
|
// send back any identifying information about errors.
|
||||||
|
if (sails.config.environment === 'production') { |
||||||
|
data = undefined; |
||||||
|
} |
||||||
|
|
||||||
|
// If the user-agent wants JSON, always respond with JSON
|
||||||
|
if (req.wantsJSON) { |
||||||
|
return res.jsonx(data); |
||||||
|
} |
||||||
|
|
||||||
|
// If second argument is a string, we take that to mean it refers to a view.
|
||||||
|
// If it was omitted, use an empty object (`{}`)
|
||||||
|
options = (typeof options === 'string') ? { view: options } : options || {}; |
||||||
|
|
||||||
|
// If a view was provided in options, serve it.
|
||||||
|
// Otherwise try to guess an appropriate view, or if that doesn't
|
||||||
|
// work, just send JSON.
|
||||||
|
if (options.view) { |
||||||
|
return res.view(options.view, { data: data }); |
||||||
|
} |
||||||
|
|
||||||
|
// If no second argument provided, try to serve the default view,
|
||||||
|
// but fall back to sending JSON(P) if any errors occur.
|
||||||
|
else return res.view('403', { data: data }, function (err, html) { |
||||||
|
|
||||||
|
// If a view error occured, fall back to JSON(P).
|
||||||
|
if (err) { |
||||||
|
//
|
||||||
|
// Additionally:
|
||||||
|
// • If the view was missing, ignore the error but provide a verbose log.
|
||||||
|
if (err.code === 'E_VIEW_FAILED') { |
||||||
|
sails.log.verbose('res.forbidden() :: Could not locate view for error page (sending JSON instead). Details: ',err); |
||||||
|
} |
||||||
|
// Otherwise, if this was a more serious error, log to the console with the details.
|
||||||
|
else { |
||||||
|
sails.log.warn('res.forbidden() :: When attempting to render error page view, an error occured (sending JSON instead). Details: ', err); |
||||||
|
} |
||||||
|
return res.jsonx(data); |
||||||
|
} |
||||||
|
|
||||||
|
return res.send(html); |
||||||
|
}); |
||||||
|
|
||||||
|
}; |
||||||
|
|
@ -0,0 +1,82 @@ |
|||||||
|
/** |
||||||
|
* 404 (Not Found) Handler |
||||||
|
* |
||||||
|
* Usage: |
||||||
|
* return res.notFound(); |
||||||
|
* return res.notFound(err); |
||||||
|
* return res.notFound(err, 'some/specific/notfound/view'); |
||||||
|
* |
||||||
|
* e.g.: |
||||||
|
* ``` |
||||||
|
* return res.notFound(); |
||||||
|
* ``` |
||||||
|
* |
||||||
|
* NOTE: |
||||||
|
* If a request doesn't match any explicit routes (i.e. `config/routes.js`) |
||||||
|
* or route blueprints (i.e. "shadow routes", Sails will call `res.notFound()` |
||||||
|
* automatically. |
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports = function notFound (data, options) { |
||||||
|
|
||||||
|
// Get access to `req`, `res`, & `sails`
|
||||||
|
var req = this.req; |
||||||
|
var res = this.res; |
||||||
|
var sails = req._sails; |
||||||
|
|
||||||
|
// Set status code
|
||||||
|
res.status(404); |
||||||
|
|
||||||
|
// Log error to console
|
||||||
|
if (data !== undefined) { |
||||||
|
sails.log.verbose('Sending 404 ("Not Found") response: \n',data); |
||||||
|
} |
||||||
|
else sails.log.verbose('Sending 404 ("Not Found") response'); |
||||||
|
|
||||||
|
// Only include errors in response if application environment
|
||||||
|
// is not set to 'production'. In production, we shouldn't
|
||||||
|
// send back any identifying information about errors.
|
||||||
|
if (sails.config.environment === 'production') { |
||||||
|
data = undefined; |
||||||
|
} |
||||||
|
|
||||||
|
// If the user-agent wants JSON, always respond with JSON
|
||||||
|
if (req.wantsJSON) { |
||||||
|
return res.jsonx(data); |
||||||
|
} |
||||||
|
|
||||||
|
// If second argument is a string, we take that to mean it refers to a view.
|
||||||
|
// If it was omitted, use an empty object (`{}`)
|
||||||
|
options = (typeof options === 'string') ? { view: options } : options || {}; |
||||||
|
|
||||||
|
// If a view was provided in options, serve it.
|
||||||
|
// Otherwise try to guess an appropriate view, or if that doesn't
|
||||||
|
// work, just send JSON.
|
||||||
|
if (options.view) { |
||||||
|
return res.view(options.view, { data: data }); |
||||||
|
} |
||||||
|
|
||||||
|
// If no second argument provided, try to serve the default view,
|
||||||
|
// but fall back to sending JSON(P) if any errors occur.
|
||||||
|
else return res.view('404', { data: data }, function (err, html) { |
||||||
|
|
||||||
|
// If a view error occured, fall back to JSON(P).
|
||||||
|
if (err) { |
||||||
|
//
|
||||||
|
// Additionally:
|
||||||
|
// • If the view was missing, ignore the error but provide a verbose log.
|
||||||
|
if (err.code === 'E_VIEW_FAILED') { |
||||||
|
sails.log.verbose('res.notFound() :: Could not locate view for error page (sending JSON instead). Details: ',err); |
||||||
|
} |
||||||
|
// Otherwise, if this was a more serious error, log to the console with the details.
|
||||||
|
else { |
||||||
|
sails.log.warn('res.notFound() :: When attempting to render error page view, an error occured (sending JSON instead). Details: ', err); |
||||||
|
} |
||||||
|
return res.jsonx(data); |
||||||
|
} |
||||||
|
|
||||||
|
return res.send(html); |
||||||
|
}); |
||||||
|
|
||||||
|
}; |
||||||
|
|
@ -0,0 +1,48 @@ |
|||||||
|
/** |
||||||
|
* 200 (OK) Response |
||||||
|
* |
||||||
|
* Usage: |
||||||
|
* return res.ok(); |
||||||
|
* return res.ok(data); |
||||||
|
* return res.ok(data, 'auth/login'); |
||||||
|
* |
||||||
|
* @param {Object} data |
||||||
|
* @param {String|Object} options |
||||||
|
* - pass string to render specified view |
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports = function sendOK (data, options) { |
||||||
|
|
||||||
|
// Get access to `req`, `res`, & `sails`
|
||||||
|
var req = this.req; |
||||||
|
var res = this.res; |
||||||
|
var sails = req._sails; |
||||||
|
|
||||||
|
sails.log.silly('res.ok() :: Sending 200 ("OK") response'); |
||||||
|
|
||||||
|
// Set status code
|
||||||
|
res.status(200); |
||||||
|
|
||||||
|
// If appropriate, serve data as JSON(P)
|
||||||
|
if (req.wantsJSON) { |
||||||
|
return res.jsonx(data); |
||||||
|
} |
||||||
|
|
||||||
|
// If second argument is a string, we take that to mean it refers to a view.
|
||||||
|
// If it was omitted, use an empty object (`{}`)
|
||||||
|
options = (typeof options === 'string') ? { view: options } : options || {}; |
||||||
|
|
||||||
|
// If a view was provided in options, serve it.
|
||||||
|
// Otherwise try to guess an appropriate view, or if that doesn't
|
||||||
|
// work, just send JSON.
|
||||||
|
if (options.view) { |
||||||
|
return res.view(options.view, { data: data }); |
||||||
|
} |
||||||
|
|
||||||
|
// If no second argument provided, try to serve the implied view,
|
||||||
|
// but fall back to sending JSON(P) if no view can be inferred.
|
||||||
|
else return res.guessView({ data: data }, function couldNotGuessView () { |
||||||
|
return res.jsonx(data); |
||||||
|
}); |
||||||
|
|
||||||
|
}; |
@ -0,0 +1,77 @@ |
|||||||
|
/** |
||||||
|
* 500 (Server Error) Response |
||||||
|
* |
||||||
|
* Usage: |
||||||
|
* return res.serverError(); |
||||||
|
* return res.serverError(err); |
||||||
|
* return res.serverError(err, 'some/specific/error/view'); |
||||||
|
* |
||||||
|
* NOTE: |
||||||
|
* If something throws in a policy or controller, or an internal |
||||||
|
* error is encountered, Sails will call `res.serverError()` |
||||||
|
* automatically. |
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports = function serverError (data, options) { |
||||||
|
|
||||||
|
// Get access to `req`, `res`, & `sails`
|
||||||
|
var req = this.req; |
||||||
|
var res = this.res; |
||||||
|
var sails = req._sails; |
||||||
|
|
||||||
|
// Set status code
|
||||||
|
res.status(500); |
||||||
|
|
||||||
|
// Log error to console
|
||||||
|
if (data !== undefined) { |
||||||
|
sails.log.error('Sending 500 ("Server Error") response: \n',data); |
||||||
|
} |
||||||
|
else sails.log.error('Sending empty 500 ("Server Error") response'); |
||||||
|
|
||||||
|
// Only include errors in response if application environment
|
||||||
|
// is not set to 'production'. In production, we shouldn't
|
||||||
|
// send back any identifying information about errors.
|
||||||
|
if (sails.config.environment === 'production') { |
||||||
|
data = undefined; |
||||||
|
} |
||||||
|
|
||||||
|
// If the user-agent wants JSON, always respond with JSON
|
||||||
|
if (req.wantsJSON) { |
||||||
|
return res.jsonx(data); |
||||||
|
} |
||||||
|
|
||||||
|
// If second argument is a string, we take that to mean it refers to a view.
|
||||||
|
// If it was omitted, use an empty object (`{}`)
|
||||||
|
options = (typeof options === 'string') ? { view: options } : options || {}; |
||||||
|
|
||||||
|
// If a view was provided in options, serve it.
|
||||||
|
// Otherwise try to guess an appropriate view, or if that doesn't
|
||||||
|
// work, just send JSON.
|
||||||
|
if (options.view) { |
||||||
|
return res.view(options.view, { data: data }); |
||||||
|
} |
||||||
|
|
||||||
|
// If no second argument provided, try to serve the default view,
|
||||||
|
// but fall back to sending JSON(P) if any errors occur.
|
||||||
|
else return res.view('500', { data: data }, function (err, html) { |
||||||
|
|
||||||
|
// If a view error occured, fall back to JSON(P).
|
||||||
|
if (err) { |
||||||
|
//
|
||||||
|
// Additionally:
|
||||||
|
// • If the view was missing, ignore the error but provide a verbose log.
|
||||||
|
if (err.code === 'E_VIEW_FAILED') { |
||||||
|
sails.log.verbose('res.serverError() :: Could not locate view for error page (sending JSON instead). Details: ',err); |
||||||
|
} |
||||||
|
// Otherwise, if this was a more serious error, log to the console with the details.
|
||||||
|
else { |
||||||
|
sails.log.warn('res.serverError() :: When attempting to render error page view, an error occured (sending JSON instead). Details: ', err); |
||||||
|
} |
||||||
|
return res.jsonx(data); |
||||||
|
} |
||||||
|
|
||||||
|
return res.send(html); |
||||||
|
}); |
||||||
|
|
||||||
|
}; |
||||||
|
|
@ -0,0 +1,59 @@ |
|||||||
|
/** |
||||||
|
* app.js |
||||||
|
* |
||||||
|
* Use `app.js` to run your app without `sails lift`. |
||||||
|
* To start the server, run: `node app.js`. |
||||||
|
* |
||||||
|
* This is handy in situations where the sails CLI is not relevant or useful. |
||||||
|
* |
||||||
|
* For example: |
||||||
|
* => `node app.js` |
||||||
|
* => `forever start app.js` |
||||||
|
* => `node debug app.js` |
||||||
|
* => `modulus deploy` |
||||||
|
* => `heroku scale` |
||||||
|
* |
||||||
|
* |
||||||
|
* The same command-line arguments are supported, e.g.: |
||||||
|
* `node app.js --silent --port=80 --prod` |
||||||
|
*/ |
||||||
|
|
||||||
|
// Ensure we're in the project directory, so relative paths work as expected
|
||||||
|
// no matter where we actually lift from.
|
||||||
|
process.chdir(__dirname); |
||||||
|
|
||||||
|
// Ensure a "sails" can be located:
|
||||||
|
(function() { |
||||||
|
var sails; |
||||||
|
try { |
||||||
|
sails = require('sails'); |
||||||
|
} catch (e) { |
||||||
|
console.error('To run an app using `node app.js`, you usually need to have a version of `sails` installed in the same directory as your app.'); |
||||||
|
console.error('To do that, run `npm install sails`'); |
||||||
|
console.error(''); |
||||||
|
console.error('Alternatively, if you have sails installed globally (i.e. you did `npm install -g sails`), you can use `sails lift`.'); |
||||||
|
console.error('When you run `sails lift`, your app will still use a local `./node_modules/sails` dependency if it exists,'); |
||||||
|
console.error('but if it doesn\'t, the app will run with the global sails instead!'); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
// Try to get `rc` dependency
|
||||||
|
var rc; |
||||||
|
try { |
||||||
|
rc = require('rc'); |
||||||
|
} catch (e0) { |
||||||
|
try { |
||||||
|
rc = require('sails/node_modules/rc'); |
||||||
|
} catch (e1) { |
||||||
|
console.error('Could not find dependency: `rc`.'); |
||||||
|
console.error('Your `.sailsrc` file(s) will be ignored.'); |
||||||
|
console.error('To resolve this, run:'); |
||||||
|
console.error('npm install rc --save'); |
||||||
|
rc = function () { return {}; }; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// Start server
|
||||||
|
sails.lift(rc('sails')); |
||||||
|
})(); |
After Width: | Height: | Size: 920 B |
File diff suppressed because one or more lines are too long
@ -0,0 +1,8 @@ |
|||||||
|
# The robots.txt file is used to control how search engines index your live URLs. |
||||||
|
# See http://www.robotstxt.org/wc/norobots.html for more information. |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# To prevent search engines from seeing the site altogether, uncomment the next two lines: |
||||||
|
# User-Agent: * |
||||||
|
# Disallow: / |
@ -0,0 +1,30 @@ |
|||||||
|
/** |
||||||
|
* importer.less |
||||||
|
* |
||||||
|
* By default, new Sails projects are configured to compile this file |
||||||
|
* from LESS to CSS. Unlike CSS files, LESS files are not compiled and |
||||||
|
* included automatically unless they are imported below. |
||||||
|
* |
||||||
|
* The LESS files imported below are compiled and included in the order |
||||||
|
* they are listed. Mixins, variables, etc. should be imported first |
||||||
|
* so that they can be accessed by subsequent LESS stylesheets. |
||||||
|
* |
||||||
|
* (Just like the rest of the asset pipeline bundled in Sails, you can |
||||||
|
* always omit, customize, or replace this behavior with SASS, SCSS, |
||||||
|
* or any other Grunt tasks you like.) |
||||||
|
*/ |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// For example: |
||||||
|
// |
||||||
|
// @import 'variables/colors.less'; |
||||||
|
// @import 'mixins/foo.less'; |
||||||
|
// @import 'mixins/bar.less'; |
||||||
|
// @import 'mixins/baz.less'; |
||||||
|
// |
||||||
|
// @import 'styleguide.less'; |
||||||
|
// @import 'pages/login.less'; |
||||||
|
// @import 'pages/signup.less'; |
||||||
|
// |
||||||
|
// etc. |
@ -0,0 +1,162 @@ |
|||||||
|
/** |
||||||
|
* Blueprint API Configuration |
||||||
|
* (sails.config.blueprints) |
||||||
|
* |
||||||
|
* These settings are for the global configuration of blueprint routes and |
||||||
|
* request options (which impact the behavior of blueprint actions). |
||||||
|
* |
||||||
|
* You may also override any of these settings on a per-controller basis |
||||||
|
* by defining a '_config' key in your controller defintion, and assigning it |
||||||
|
* a configuration object with overrides for the settings in this file. |
||||||
|
* A lot of the configuration options below affect so-called "CRUD methods", |
||||||
|
* or your controllers' `find`, `create`, `update`, and `destroy` actions. |
||||||
|
* |
||||||
|
* It's important to realize that, even if you haven't defined these yourself, as long as |
||||||
|
* a model exists with the same name as the controller, Sails will respond with built-in CRUD |
||||||
|
* logic in the form of a JSON API, including support for sort, pagination, and filtering. |
||||||
|
* |
||||||
|
* For more information on the blueprint API, check out: |
||||||
|
* http://sailsjs.org/#!/documentation/reference/blueprint-api
|
||||||
|
* |
||||||
|
* For more information on the settings in this file, see: |
||||||
|
* http://sailsjs.org/#!/documentation/reference/sails.config/sails.config.blueprints.html
|
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports.blueprints = { |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Action routes speed up the backend development workflow by * |
||||||
|
* eliminating the need to manually bind routes. When enabled, GET, POST, * |
||||||
|
* PUT, and DELETE routes will be generated for every one of a controller's * |
||||||
|
* actions. * |
||||||
|
* * |
||||||
|
* If an `index` action exists, additional naked routes will be created for * |
||||||
|
* it. Finally, all `actions` blueprints support an optional path * |
||||||
|
* parameter, `id`, for convenience. * |
||||||
|
* * |
||||||
|
* `actions` are enabled by default, and can be OK for production-- * |
||||||
|
* however, if you'd like to continue to use controller/action autorouting * |
||||||
|
* in a production deployment, you must take great care not to * |
||||||
|
* inadvertently expose unsafe/unintentional controller logic to GET * |
||||||
|
* requests. * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// actions: true,
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* RESTful routes (`sails.config.blueprints.rest`) * |
||||||
|
* * |
||||||
|
* REST blueprints are the automatically generated routes Sails uses to * |
||||||
|
* expose a conventional REST API on top of a controller's `find`, * |
||||||
|
* `create`, `update`, and `destroy` actions. * |
||||||
|
* * |
||||||
|
* For example, a BoatController with `rest` enabled generates the * |
||||||
|
* following routes: * |
||||||
|
* ::::::::::::::::::::::::::::::::::::::::::::::::::::::: * |
||||||
|
* GET /boat -> BoatController.find * |
||||||
|
* GET /boat/:id -> BoatController.findOne * |
||||||
|
* POST /boat -> BoatController.create * |
||||||
|
* PUT /boat/:id -> BoatController.update * |
||||||
|
* DELETE /boat/:id -> BoatController.destroy * |
||||||
|
* * |
||||||
|
* `rest` blueprint routes are enabled by default, and are suitable for use * |
||||||
|
* in a production scenario, as long you take standard security precautions * |
||||||
|
* (combine w/ policies, etc.) * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// rest: true,
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Shortcut routes are simple helpers to provide access to a * |
||||||
|
* controller's CRUD methods from your browser's URL bar. When enabled, * |
||||||
|
* GET, POST, PUT, and DELETE routes will be generated for the * |
||||||
|
* controller's`find`, `create`, `update`, and `destroy` actions. * |
||||||
|
* * |
||||||
|
* `shortcuts` are enabled by default, but should be disabled in * |
||||||
|
* production. * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// shortcuts: true,
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* An optional mount path for all blueprint routes on a controller, * |
||||||
|
* including `rest`, `actions`, and `shortcuts`. This allows you to take * |
||||||
|
* advantage of blueprint routing, even if you need to namespace your API * |
||||||
|
* methods. * |
||||||
|
* * |
||||||
|
* (NOTE: This only applies to blueprint autoroutes, not manual routes from * |
||||||
|
* `sails.config.routes`) * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// prefix: '',
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* An optional mount path for all REST blueprint routes on a controller. * |
||||||
|
* And it do not include `actions` and `shortcuts` routes. * |
||||||
|
* This allows you to take advantage of REST blueprint routing, * |
||||||
|
* even if you need to namespace your RESTful API methods * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// restPrefix: '',
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Whether to pluralize controller names in blueprint routes. * |
||||||
|
* * |
||||||
|
* (NOTE: This only applies to blueprint autoroutes, not manual routes from * |
||||||
|
* `sails.config.routes`) * |
||||||
|
* * |
||||||
|
* For example, REST blueprints for `FooController` with `pluralize` * |
||||||
|
* enabled: * |
||||||
|
* GET /foos/:id? * |
||||||
|
* POST /foos * |
||||||
|
* PUT /foos/:id? * |
||||||
|
* DELETE /foos/:id? * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// pluralize: false,
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Whether the blueprint controllers should populate model fetches with * |
||||||
|
* data from other models which are linked by associations * |
||||||
|
* * |
||||||
|
* If you have a lot of data in one-to-many associations, leaving this on * |
||||||
|
* may result in very heavy api calls * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// populate: true,
|
||||||
|
|
||||||
|
/**************************************************************************** |
||||||
|
* * |
||||||
|
* Whether to run Model.watch() in the find and findOne blueprint actions. * |
||||||
|
* Can be overridden on a per-model basis. * |
||||||
|
* * |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
// autoWatch: true,
|
||||||
|
|
||||||
|
/**************************************************************************** |
||||||
|
* * |
||||||
|
* The default number of records to show in the response from a "find" * |
||||||
|
* action. Doubles as the default size of populated arrays if populate is * |
||||||
|
* true. * |
||||||
|
* * |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
defaultLimit: 10 |
||||||
|
|
||||||
|
}; |
@ -0,0 +1,17 @@ |
|||||||
|
/** |
||||||
|
* Bootstrap |
||||||
|
* (sails.config.bootstrap) |
||||||
|
* |
||||||
|
* An asynchronous bootstrap function that runs before your Sails app gets lifted. |
||||||
|
* This gives you an opportunity to set up your data model, run jobs, or perform some special logic. |
||||||
|
* |
||||||
|
* For more information on bootstrapping your app, check out: |
||||||
|
* http://sailsjs.org/#!/documentation/reference/sails.config/sails.config.bootstrap.html
|
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports.bootstrap = function(cb) { |
||||||
|
|
||||||
|
// It's very important to trigger this callback method when you are finished
|
||||||
|
// with the bootstrap! (otherwise your server will never lift, since it's waiting on the bootstrap)
|
||||||
|
cb(); |
||||||
|
}; |
@ -0,0 +1,108 @@ |
|||||||
|
/** |
||||||
|
* Connections |
||||||
|
* (sails.config.connections) |
||||||
|
* |
||||||
|
* `Connections` are like "saved settings" for your adapters. What's the difference between |
||||||
|
* a connection and an adapter, you might ask? An adapter (e.g. `sails-mysql`) is generic-- |
||||||
|
* it needs some additional information to work (e.g. your database host, password, user, etc.) |
||||||
|
* A `connection` is that additional information. |
||||||
|
* |
||||||
|
* Each model must have a `connection` property (a string) which is references the name of one |
||||||
|
* of these connections. If it doesn't, the default `connection` configured in `config/models.js` |
||||||
|
* will be applied. Of course, a connection can (and usually is) shared by multiple models. |
||||||
|
* . |
||||||
|
* Note: If you're using version control, you should put your passwords/api keys |
||||||
|
* in `config/local.js`, environment variables, or use another strategy. |
||||||
|
* (this is to prevent you inadvertently sensitive credentials up to your repository.) |
||||||
|
* |
||||||
|
* For more information on configuration, check out: |
||||||
|
* http://sailsjs.org/#!/documentation/reference/sails.config/sails.config.connections.html
|
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports.connections = { |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Local disk storage for DEVELOPMENT ONLY * |
||||||
|
* * |
||||||
|
* Installed by default. * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
localDiskDb: { |
||||||
|
adapter: 'sails-disk' |
||||||
|
}, |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* MySQL is the world's most popular relational database. * |
||||||
|
* http://en.wikipedia.org/wiki/MySQL *
|
||||||
|
* * |
||||||
|
* Run: npm install sails-mysql * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
someMysqlServer: { |
||||||
|
adapter: 'sails-mysql', |
||||||
|
host: 'YOUR_MYSQL_SERVER_HOSTNAME_OR_IP_ADDRESS', |
||||||
|
user: 'YOUR_MYSQL_USER', |
||||||
|
password: 'YOUR_MYSQL_PASSWORD', |
||||||
|
database: 'YOUR_MYSQL_DB' |
||||||
|
}, |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* MongoDB is the leading NoSQL database. * |
||||||
|
* http://en.wikipedia.org/wiki/MongoDB *
|
||||||
|
* * |
||||||
|
* Run: npm install sails-mongo * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
someMongodbServer: { |
||||||
|
adapter: 'sails-mongo', |
||||||
|
host: '10hackintosh', |
||||||
|
port: 27017, |
||||||
|
// user: 'username',
|
||||||
|
// password: 'password',
|
||||||
|
// database: 'your_mongo_db_name_here'
|
||||||
|
}, |
||||||
|
hackintoshMongo: { |
||||||
|
adapter: 'sails-mongo', |
||||||
|
host: '10hackintosh.vnll', |
||||||
|
port: 27017, |
||||||
|
// user: 'username',
|
||||||
|
// password: 'password',
|
||||||
|
database: 'feeder', |
||||||
|
}, |
||||||
|
nj2mongo: { |
||||||
|
adapter: 'sails-mongo', |
||||||
|
host: 'nj2', |
||||||
|
port: 27017, |
||||||
|
// user: 'username',
|
||||||
|
// password: 'password',
|
||||||
|
database: 'bbSailer', |
||||||
|
}, |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* PostgreSQL is another officially supported relational database. * |
||||||
|
* http://en.wikipedia.org/wiki/PostgreSQL *
|
||||||
|
* * |
||||||
|
* Run: npm install sails-postgresql * |
||||||
|
* * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
somePostgresqlServer: { |
||||||
|
adapter: 'sails-postgresql', |
||||||
|
host: 'YOUR_POSTGRES_SERVER_HOSTNAME_OR_IP_ADDRESS', |
||||||
|
user: 'YOUR_POSTGRES_USER', |
||||||
|
password: 'YOUR_POSTGRES_PASSWORD', |
||||||
|
database: 'YOUR_POSTGRES_DB' |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* More adapters: https://github.com/balderdashy/sails *
|
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
}; |
@ -0,0 +1,78 @@ |
|||||||
|
/** |
||||||
|
* Cross-Origin Resource Sharing (CORS) Settings |
||||||
|
* (sails.config.cors) |
||||||
|
* |
||||||
|
* CORS is like a more modern version of JSONP-- it allows your server/API |
||||||
|
* to successfully respond to requests from client-side JavaScript code |
||||||
|
* running on some other domain (e.g. google.com) |
||||||
|
* Unlike JSONP, it works with POST, PUT, and DELETE requests |
||||||
|
* |
||||||
|
* For more information on CORS, check out: |
||||||
|
* http://en.wikipedia.org/wiki/Cross-origin_resource_sharing
|
||||||
|
* |
||||||
|
* Note that any of these settings (besides 'allRoutes') can be changed on a per-route basis |
||||||
|
* by adding a "cors" object to the route configuration: |
||||||
|
* |
||||||
|
* '/get foo': { |
||||||
|
* controller: 'foo', |
||||||
|
* action: 'bar', |
||||||
|
* cors: { |
||||||
|
* origin: 'http://foobar.com,https://owlhoot.com' |
||||||
|
* } |
||||||
|
* } |
||||||
|
* |
||||||
|
* For more information on this configuration file, see: |
||||||
|
* http://sailsjs.org/#!/documentation/reference/sails.config/sails.config.cors.html
|
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports.cors = { |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Allow CORS on all routes by default? If not, you must enable CORS on a * |
||||||
|
* per-route basis by either adding a "cors" configuration object to the * |
||||||
|
* route config, or setting "cors:true" in the route config to use the * |
||||||
|
* default settings below. * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// allRoutes: false,
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Which domains which are allowed CORS access? This can be a * |
||||||
|
* comma-delimited list of hosts (beginning with http:// or https://) or *
|
||||||
|
* "*" to allow all domains CORS access. * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// origin: '*',
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Allow cookies to be shared for CORS requests? * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// credentials: true,
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Which methods should be allowed for CORS requests? This is only used in * |
||||||
|
* response to preflight requests (see article linked above for more info) * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// methods: 'GET, POST, PUT, DELETE, OPTIONS, HEAD',
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Which headers should be allowed for CORS requests? This is only used in * |
||||||
|
* response to preflight requests. * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// headers: 'content-type'
|
||||||
|
|
||||||
|
}; |
@ -0,0 +1,24 @@ |
|||||||
|
/** |
||||||
|
* Development environment settings |
||||||
|
* |
||||||
|
* This file can include shared settings for a development team, |
||||||
|
* such as API keys or remote database passwords. If you're using |
||||||
|
* a version control solution for your Sails app, this file will |
||||||
|
* be committed to your repository unless you add it to your .gitignore |
||||||
|
* file. If your repository will be publicly viewable, don't add |
||||||
|
* any private information to this file! |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* Set the default database connection for models in the development * |
||||||
|
* environment (see config/connections.js and config/models.js ) * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// models: {
|
||||||
|
// connection: 'someMongodbServer'
|
||||||
|
// }
|
||||||
|
|
||||||
|
}; |
@ -0,0 +1,38 @@ |
|||||||
|
/** |
||||||
|
* Production environment settings |
||||||
|
* |
||||||
|
* This file can include shared settings for a production environment, |
||||||
|
* such as API keys or remote database passwords. If you're using |
||||||
|
* a version control solution for your Sails app, this file will |
||||||
|
* be committed to your repository unless you add it to your .gitignore |
||||||
|
* file. If your repository will be publicly viewable, don't add |
||||||
|
* any private information to this file! |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* Set the default database connection for models in the production * |
||||||
|
* environment (see config/connections.js and config/models.js ) * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
models: { |
||||||
|
connection: 'nj2mongo' |
||||||
|
}, |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* Set the port in the production environment to 80 * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
port: 8010, |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* Set the log level in production environment to "silent" * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
log: { |
||||||
|
level: "silent" |
||||||
|
} |
||||||
|
|
||||||
|
}; |
@ -0,0 +1,63 @@ |
|||||||
|
/** |
||||||
|
* Global Variable Configuration |
||||||
|
* (sails.config.globals) |
||||||
|
* |
||||||
|
* Configure which global variables which will be exposed |
||||||
|
* automatically by Sails. |
||||||
|
* |
||||||
|
* For more information on configuration, check out: |
||||||
|
* http://sailsjs.org/#!/documentation/reference/sails.config/sails.config.globals.html
|
||||||
|
*/ |
||||||
|
module.exports.globals = { |
||||||
|
|
||||||
|
/**************************************************************************** |
||||||
|
* * |
||||||
|
* Expose the lodash installed in Sails core as a global variable. If this * |
||||||
|
* is disabled, like any other node module you can always run npm install * |
||||||
|
* lodash --save, then var _ = require('lodash') at the top of any file. * |
||||||
|
* * |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
// _: true,
|
||||||
|
|
||||||
|
/**************************************************************************** |
||||||
|
* * |
||||||
|
* Expose the async installed in Sails core as a global variable. If this is * |
||||||
|
* disabled, like any other node module you can always run npm install async * |
||||||
|
* --save, then var async = require('async') at the top of any file. * |
||||||
|
* * |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
// async: true,
|
||||||
|
|
||||||
|
/**************************************************************************** |
||||||
|
* * |
||||||
|
* Expose the sails instance representing your app. If this is disabled, you * |
||||||
|
* can still get access via req._sails. * |
||||||
|
* * |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
// sails: true,
|
||||||
|
|
||||||
|
/**************************************************************************** |
||||||
|
* * |
||||||
|
* Expose each of your app's services as global variables (using their * |
||||||
|
* "globalId"). E.g. a service defined in api/models/NaturalLanguage.js * |
||||||
|
* would have a globalId of NaturalLanguage by default. If this is disabled, * |
||||||
|
* you can still access your services via sails.services.* * |
||||||
|
* * |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
// services: true,
|
||||||
|
|
||||||
|
/**************************************************************************** |
||||||
|
* * |
||||||
|
* Expose each of your app's models as global variables (using their * |
||||||
|
* "globalId"). E.g. a model defined in api/models/User.js would have a * |
||||||
|
* globalId of User by default. If this is disabled, you can still access * |
||||||
|
* your models via sails.models.*. * |
||||||
|
* * |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
// models: true
|
||||||
|
}; |
@ -0,0 +1,87 @@ |
|||||||
|
/** |
||||||
|
* HTTP Server Settings |
||||||
|
* (sails.config.http) |
||||||
|
* |
||||||
|
* Configuration for the underlying HTTP server in Sails. |
||||||
|
* Only applies to HTTP requests (not WebSockets) |
||||||
|
* |
||||||
|
* For more information on configuration, check out: |
||||||
|
* http://sailsjs.org/#!/documentation/reference/sails.config/sails.config.http.html
|
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports.http = { |
||||||
|
|
||||||
|
/**************************************************************************** |
||||||
|
* * |
||||||
|
* Express middleware to use for every Sails request. To add custom * |
||||||
|
* middleware to the mix, add a function to the middleware config object and * |
||||||
|
* add its key to the "order" array. The $custom key is reserved for * |
||||||
|
* backwards-compatibility with Sails v0.9.x apps that use the * |
||||||
|
* `customMiddleware` config option. * |
||||||
|
* * |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
// middleware: {
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* The order in which middleware should be run for HTTP request. (the Sails * |
||||||
|
* router is invoked by the "router" middleware below.) * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// order: [
|
||||||
|
// 'startRequestTimer',
|
||||||
|
// 'cookieParser',
|
||||||
|
// 'session',
|
||||||
|
// 'myRequestLogger',
|
||||||
|
// 'bodyParser',
|
||||||
|
// 'handleBodyParserError',
|
||||||
|
// 'compress',
|
||||||
|
// 'methodOverride',
|
||||||
|
// 'poweredBy',
|
||||||
|
// '$custom',
|
||||||
|
// 'router',
|
||||||
|
// 'www',
|
||||||
|
// 'favicon',
|
||||||
|
// '404',
|
||||||
|
// '500'
|
||||||
|
// ],
|
||||||
|
|
||||||
|
/**************************************************************************** |
||||||
|
* * |
||||||
|
* Example custom middleware; logs each request to the console. * |
||||||
|
* * |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
// myRequestLogger: function (req, res, next) {
|
||||||
|
// console.log("Requested :: ", req.method, req.url);
|
||||||
|
// return next();
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* The body parser that will handle incoming multipart HTTP requests. By * |
||||||
|
* default as of v0.10, Sails uses * |
||||||
|
* [skipper](http://github.com/balderdashy/skipper). See *
|
||||||
|
* http://www.senchalabs.org/connect/multipart.html for other options. *
|
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// bodyParser: require('skipper')
|
||||||
|
|
||||||
|
// },
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* The number of seconds to cache flat files on disk being served by * |
||||||
|
* Express static middleware (by default, these files are in `.tmp/public`) * |
||||||
|
* * |
||||||
|
* The HTTP static cache is only active in a 'production' environment, * |
||||||
|
* since that's the only time Express will cache flat-files. * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// cache: 31557600000
|
||||||
|
}; |
@ -0,0 +1,57 @@ |
|||||||
|
/** |
||||||
|
* Internationalization / Localization Settings |
||||||
|
* (sails.config.i18n) |
||||||
|
* |
||||||
|
* If your app will touch people from all over the world, i18n (or internationalization) |
||||||
|
* may be an important part of your international strategy. |
||||||
|
* |
||||||
|
* |
||||||
|
* For more informationom i18n in Sails, check out: |
||||||
|
* http://sailsjs.org/#!/documentation/concepts/Internationalization
|
||||||
|
* |
||||||
|
* For a complete list of i18n options, see: |
||||||
|
* https://github.com/mashpie/i18n-node#list-of-configuration-options
|
||||||
|
* |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports.i18n = { |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Which locales are supported? * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// locales: ['en', 'es', 'fr', 'de'],
|
||||||
|
|
||||||
|
/**************************************************************************** |
||||||
|
* * |
||||||
|
* What is the default locale for the site? Note that this setting will be * |
||||||
|
* overridden for any request that sends an "Accept-Language" header (i.e. * |
||||||
|
* most browsers), but it's still useful if you need to localize the * |
||||||
|
* response for requests made by non-browser clients (e.g. cURL). * |
||||||
|
* * |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
// defaultLocale: 'en',
|
||||||
|
|
||||||
|
/**************************************************************************** |
||||||
|
* * |
||||||
|
* Automatically add new keys to locale (translation) files when they are * |
||||||
|
* encountered during a request? * |
||||||
|
* * |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
// updateFiles: false,
|
||||||
|
|
||||||
|
/**************************************************************************** |
||||||
|
* * |
||||||
|
* Path (relative to app root) of directory to store locale (translation) * |
||||||
|
* files in. * |
||||||
|
* * |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
// localesDirectory: '/config/locales'
|
||||||
|
|
||||||
|
}; |
@ -0,0 +1,28 @@ |
|||||||
|
# Internationalization / Localization Settings |
||||||
|
|
||||||
|
> Also see the official docs on internationalization/localization: |
||||||
|
> http://links.sailsjs.org/docs/config/locales |
||||||
|
|
||||||
|
## Locales |
||||||
|
All locale files live under `config/locales`. Here is where you can add translations |
||||||
|
as JSON key-value pairs. The name of the file should match the language that you are supporting, which allows for automatic language detection based on request headers. |
||||||
|
|
||||||
|
Here is an example locale stringfile for the Spanish language (`config/locales/es.json`): |
||||||
|
```json |
||||||
|
{ |
||||||
|
"Hello!": "Hola!", |
||||||
|
"Hello %s, how are you today?": "ÂżHola %s, como estas?", |
||||||
|
} |
||||||
|
``` |
||||||
|
## Usage |
||||||
|
Locales can be accessed in controllers/policies through `res.i18n()`, or in views through the `__(key)` or `i18n(key)` functions. |
||||||
|
Remember that the keys are case sensitive and require exact key matches, e.g. |
||||||
|
|
||||||
|
```ejs |
||||||
|
<h1> <%= __('Welcome to PencilPals!') %> </h1> |
||||||
|
<h2> <%= i18n('Hello %s, how are you today?', 'Pencil Maven') %> </h2> |
||||||
|
<p> <%= i18n('That\'s right-- you can use either i18n() or __()') %> </p> |
||||||
|
``` |
||||||
|
|
||||||
|
## Configuration |
||||||
|
Localization/internationalization config can be found in `config/i18n.js`, from where you can set your supported locales. |
@ -0,0 +1,4 @@ |
|||||||
|
{ |
||||||
|
"Welcome": "Willkommen", |
||||||
|
"A brand new app.": "Eine neue App." |
||||||
|
} |
@ -0,0 +1,4 @@ |
|||||||
|
{ |
||||||
|
"Welcome": "Welcome", |
||||||
|
"A brand new app.": "A brand new app." |
||||||
|
} |
@ -0,0 +1,4 @@ |
|||||||
|
{ |
||||||
|
"Welcome": "Bienvenido", |
||||||
|
"A brand new app.": "Una aplicaciĂłn de la nueva marca." |
||||||
|
} |
@ -0,0 +1,4 @@ |
|||||||
|
{ |
||||||
|
"Welcome": "Bienvenue", |
||||||
|
"A brand new app.": "Une toute nouvelle application." |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
/** |
||||||
|
* Built-in Log Configuration |
||||||
|
* (sails.config.log) |
||||||
|
* |
||||||
|
* Configure the log level for your app, as well as the transport |
||||||
|
* (Underneath the covers, Sails uses Winston for logging, which |
||||||
|
* allows for some pretty neat custom transports/adapters for log messages) |
||||||
|
* |
||||||
|
* For more information on the Sails logger, check out: |
||||||
|
* http://sailsjs.org/#!/documentation/concepts/Logging
|
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports.log = { |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Valid `level` configs: i.e. the minimum log level to capture with * |
||||||
|
* sails.log.*() * |
||||||
|
* * |
||||||
|
* The order of precedence for log levels from lowest to highest is: * |
||||||
|
* silly, verbose, info, debug, warn, error * |
||||||
|
* * |
||||||
|
* You may also set the level to "silent" to suppress all logs. * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// level: 'info'
|
||||||
|
|
||||||
|
}; |
@ -0,0 +1,32 @@ |
|||||||
|
/** |
||||||
|
* Default model configuration |
||||||
|
* (sails.config.models) |
||||||
|
* |
||||||
|
* Unless you override them, the following properties will be included |
||||||
|
* in each of your models. |
||||||
|
* |
||||||
|
* For more info on Sails models, see: |
||||||
|
* http://sailsjs.org/#!/documentation/concepts/ORM
|
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports.models = { |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Your app's default connection. i.e. the name of one of your app's * |
||||||
|
* connections (see `config/connections.js`) * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
connection: 'hackintoshMongo', |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* How and whether Sails will attempt to automatically rebuild the * |
||||||
|
* tables/collections/etc. in your schema. * |
||||||
|
* * |
||||||
|
* See http://sailsjs.org/#!/documentation/concepts/ORM/model-settings.html *
|
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
migrate: 'alter' |
||||||
|
|
||||||
|
}; |
@ -0,0 +1,66 @@ |
|||||||
|
/** |
||||||
|
* Policy Mappings |
||||||
|
* (sails.config.policies) |
||||||
|
* |
||||||
|
* Policies are simple functions which run **before** your controllers. |
||||||
|
* You can apply one or more policies to a given controller, or protect |
||||||
|
* its actions individually. |
||||||
|
* |
||||||
|
* Any policy file (e.g. `api/policies/authenticated.js`) can be accessed |
||||||
|
* below by its filename, minus the extension, (e.g. "authenticated") |
||||||
|
* |
||||||
|
* For more information on how policies work, see: |
||||||
|
* http://sailsjs.org/#!/documentation/concepts/Policies
|
||||||
|
* |
||||||
|
* For more information on configuring policies, check out: |
||||||
|
* http://sailsjs.org/#!/documentation/reference/sails.config/sails.config.policies.html
|
||||||
|
*/ |
||||||
|
|
||||||
|
|
||||||
|
module.exports.policies = { |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Default policy for all controllers and actions (`true` allows public * |
||||||
|
* access) * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
'*': true, |
||||||
|
'nationality': { |
||||||
|
'*': 'sessionAuth', |
||||||
|
'index': true, |
||||||
|
'find': true, |
||||||
|
}, |
||||||
|
'prefix': { |
||||||
|
'*': 'sessionAuth', |
||||||
|
'index': true, |
||||||
|
'find': true, |
||||||
|
}, |
||||||
|
'flag': { |
||||||
|
'*': 'sessionAuth', |
||||||
|
'index': true, |
||||||
|
'find': true, |
||||||
|
}, |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Here's an example of mapping some policies to run before a controller * |
||||||
|
* and its actions * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
// RabbitController: {
|
||||||
|
|
||||||
|
// Apply the `false` policy as the default for all of RabbitController's actions
|
||||||
|
// (`false` prevents all access, which ensures that nothing bad happens to our rabbits)
|
||||||
|
// '*': false,
|
||||||
|
|
||||||
|
// For the action `nurture`, apply the 'isRabbitMother' policy
|
||||||
|
// (this overrides `false` above)
|
||||||
|
// nurture : 'isRabbitMother',
|
||||||
|
|
||||||
|
// Apply the `isNiceToAnimals` AND `hasRabbitFood` policies
|
||||||
|
// before letting any users feed our rabbits
|
||||||
|
// feed : ['isNiceToAnimals', 'hasRabbitFood']
|
||||||
|
// }
|
||||||
|
}; |
@ -0,0 +1,49 @@ |
|||||||
|
/** |
||||||
|
* Route Mappings |
||||||
|
* (sails.config.routes) |
||||||
|
* |
||||||
|
* Your routes map URLs to views and controllers. |
||||||
|
* |
||||||
|
* If Sails receives a URL that doesn't match any of the routes below, |
||||||
|
* it will check for matching files (images, scripts, stylesheets, etc.) |
||||||
|
* in your assets directory. e.g. `http://localhost:1337/images/foo.jpg` |
||||||
|
* might match an image file: `/assets/images/foo.jpg` |
||||||
|
* |
||||||
|
* Finally, if those don't match either, the default 404 handler is triggered. |
||||||
|
* See `api/responses/notFound.js` to adjust your app's 404 logic. |
||||||
|
* |
||||||
|
* Note: Sails doesn't ACTUALLY serve stuff from `assets`-- the default Gruntfile in Sails copies |
||||||
|
* flat files from `assets` to `.tmp/public`. This allows you to do things like compile LESS or |
||||||
|
* CoffeeScript for the front-end. |
||||||
|
* |
||||||
|
* For more information on configuring custom routes, check out: |
||||||
|
* http://sailsjs.org/#!/documentation/concepts/Routes/RouteTargetSyntax.html
|
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports.routes = { |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Make the view located at `views/homepage.ejs` (or `views/homepage.jade`, * |
||||||
|
* etc. depending on your default view engine) your home page. * |
||||||
|
* * |
||||||
|
* (Alternatively, remove this and add an `index.html` file in your * |
||||||
|
* `assets` directory) * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
'/': { |
||||||
|
view: 'homepage' |
||||||
|
} |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Custom routes here... * |
||||||
|
* * |
||||||
|
* If a request to a URL doesn't match any of the custom routes above, it * |
||||||
|
* is matched against Sails route blueprints. See `config/blueprints.js` * |
||||||
|
* for configuration options and examples. * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
}; |
@ -0,0 +1,91 @@ |
|||||||
|
/** |
||||||
|
* Session Configuration |
||||||
|
* (sails.config.session) |
||||||
|
* |
||||||
|
* Sails session integration leans heavily on the great work already done by |
||||||
|
* Express, but also unifies Socket.io with the Connect session store. It uses |
||||||
|
* Connect's cookie parser to normalize configuration differences between Express |
||||||
|
* and Socket.io and hooks into Sails' middleware interpreter to allow you to access |
||||||
|
* and auto-save to `req.session` with Socket.io the same way you would with Express. |
||||||
|
* |
||||||
|
* For more information on configuring the session, check out: |
||||||
|
* http://sailsjs.org/#!/documentation/reference/sails.config/sails.config.session.html
|
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports.session = { |
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Session secret is automatically generated when your new app is created * |
||||||
|
* Replace at your own risk in production-- you will invalidate the cookies * |
||||||
|
* of your users, forcing them to log in again. * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
secret: 'ea302abd3c90643b26dcff7494388238', |
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Set the session cookie expire time The maxAge is set by milliseconds, * |
||||||
|
* the example below is for 24 hours * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// cookie: {
|
||||||
|
// maxAge: 24 * 60 * 60 * 1000
|
||||||
|
// },
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* In production, uncomment the following lines to set up a shared redis * |
||||||
|
* session store that can be shared across multiple Sails.js servers * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// adapter: 'redis',
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* The following values are optional, if no options are set a redis * |
||||||
|
* instance running on localhost is expected. Read more about options at: * |
||||||
|
* https://github.com/visionmedia/connect-redis *
|
||||||
|
* * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// host: 'localhost',
|
||||||
|
// port: 6379,
|
||||||
|
// ttl: <redis session TTL in seconds>,
|
||||||
|
// db: 0,
|
||||||
|
// pass: <redis auth password>,
|
||||||
|
// prefix: 'sess:',
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Uncomment the following lines to use your Mongo adapter as a session * |
||||||
|
* store * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// adapter: 'mongo',
|
||||||
|
// host: 'localhost',
|
||||||
|
// port: 27017,
|
||||||
|
// db: 'sails',
|
||||||
|
// collection: 'sessions',
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Optional Values: * |
||||||
|
* * |
||||||
|
* # Note: url will override other connection settings url: * |
||||||
|
* 'mongodb://user:pass@host:port/database/collection', * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// username: '',
|
||||||
|
// password: '',
|
||||||
|
// auto_reconnect: false,
|
||||||
|
// ssl: false,
|
||||||
|
// stringify: true
|
||||||
|
|
||||||
|
}; |
@ -0,0 +1,141 @@ |
|||||||
|
/** |
||||||
|
* WebSocket Server Settings |
||||||
|
* (sails.config.sockets) |
||||||
|
* |
||||||
|
* These settings provide transparent access to the options for Sails' |
||||||
|
* encapsulated WebSocket server, as well as some additional Sails-specific |
||||||
|
* configuration layered on top. |
||||||
|
* |
||||||
|
* For more information on sockets configuration, including advanced config options, see: |
||||||
|
* http://sailsjs.org/#!/documentation/reference/sails.config/sails.config.sockets.html
|
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports.sockets = { |
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Node.js (and consequently Sails.js) apps scale horizontally. It's a * |
||||||
|
* powerful, efficient approach, but it involves a tiny bit of planning. At * |
||||||
|
* scale, you'll want to be able to copy your app onto multiple Sails.js * |
||||||
|
* servers and throw them behind a load balancer. * |
||||||
|
* * |
||||||
|
* One of the big challenges of scaling an application is that these sorts * |
||||||
|
* of clustered deployments cannot share memory, since they are on * |
||||||
|
* physically different machines. On top of that, there is no guarantee * |
||||||
|
* that a user will "stick" with the same server between requests (whether * |
||||||
|
* HTTP or sockets), since the load balancer will route each request to the * |
||||||
|
* Sails server with the most available resources. However that means that * |
||||||
|
* all room/pubsub/socket processing and shared memory has to be offloaded * |
||||||
|
* to a shared, remote messaging queue (usually Redis) * |
||||||
|
* * |
||||||
|
* Luckily, Socket.io (and consequently Sails.js) apps support Redis for * |
||||||
|
* sockets by default. To enable a remote redis pubsub server, uncomment * |
||||||
|
* the config below. * |
||||||
|
* * |
||||||
|
* Worth mentioning is that, if `adapter` config is `redis`, but host/port * |
||||||
|
* is left unset, Sails will try to connect to redis running on localhost * |
||||||
|
* via port 6379 * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
// adapter: 'memory',
|
||||||
|
|
||||||
|
//
|
||||||
|
// -OR-
|
||||||
|
//
|
||||||
|
|
||||||
|
// adapter: 'redis',
|
||||||
|
// host: '127.0.0.1',
|
||||||
|
// port: 6379,
|
||||||
|
// db: 'sails',
|
||||||
|
// pass: '<redis auth password>',
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* Whether to expose a 'get /__getcookie' route with CORS support that sets * |
||||||
|
* a cookie (this is used by the sails.io.js socket client to get access to * |
||||||
|
* a 3rd party cookie and to enable sessions). * |
||||||
|
* * |
||||||
|
* Warning: Currently in this scenario, CORS settings apply to interpreted * |
||||||
|
* requests sent via a socket.io connection that used this cookie to * |
||||||
|
* connect, even for non-browser clients! (e.g. iOS apps, toasters, node.js * |
||||||
|
* unit tests) * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
|
||||||
|
// grant3rdPartyCookie: true,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* `beforeConnect` * |
||||||
|
* * |
||||||
|
* This custom beforeConnect function will be run each time BEFORE a new * |
||||||
|
* socket is allowed to connect, when the initial socket.io handshake is * |
||||||
|
* performed with the server. * |
||||||
|
* * |
||||||
|
* By default, when a socket tries to connect, Sails allows it, every time. * |
||||||
|
* (much in the same way any HTTP request is allowed to reach your routes. * |
||||||
|
* If no valid cookie was sent, a temporary session will be created for the * |
||||||
|
* connecting socket. * |
||||||
|
* * |
||||||
|
* If the cookie sent as part of the connection request doesn't match any * |
||||||
|
* known user session, a new user session is created for it. * |
||||||
|
* * |
||||||
|
* In most cases, the user would already have a cookie since they loaded * |
||||||
|
* the socket.io client and the initial HTML page you're building. * |
||||||
|
* * |
||||||
|
* However, in the case of cross-domain requests, it is possible to receive * |
||||||
|
* a connection upgrade request WITHOUT A COOKIE (for certain transports) * |
||||||
|
* In this case, there is no way to keep track of the requesting user * |
||||||
|
* between requests, since there is no identifying information to link * |
||||||
|
* him/her with a session. The sails.io.js client solves this by connecting * |
||||||
|
* to a CORS/jsonp endpoint first to get a 3rd party cookie(fortunately this* |
||||||
|
* works, even in Safari), then opening the connection. * |
||||||
|
* * |
||||||
|
* You can also pass along a ?cookie query parameter to the upgrade url, * |
||||||
|
* which Sails will use in the absence of a proper cookie e.g. (when * |
||||||
|
* connecting from the client): * |
||||||
|
* io.sails.connect('http://localhost:1337?cookie=smokeybear') * |
||||||
|
* * |
||||||
|
* Finally note that the user's cookie is NOT (and will never be) accessible* |
||||||
|
* from client-side javascript. Using HTTP-only cookies is crucial for your * |
||||||
|
* app's security. * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
// beforeConnect: function(handshake, cb) {
|
||||||
|
// // `true` allows the connection
|
||||||
|
// return cb(null, true);
|
||||||
|
//
|
||||||
|
// // (`false` would reject the connection)
|
||||||
|
// },
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* `afterDisconnect` * |
||||||
|
* * |
||||||
|
* This custom afterDisconnect function will be run each time a socket * |
||||||
|
* disconnects * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
// afterDisconnect: function(session, socket, cb) {
|
||||||
|
// // By default: do nothing.
|
||||||
|
// return cb();
|
||||||
|
// },
|
||||||
|
|
||||||
|
/*************************************************************************** |
||||||
|
* * |
||||||
|
* `transports` * |
||||||
|
* * |
||||||
|
* A array of allowed transport methods which the clients will try to use. * |
||||||
|
* On server environments that don't support sticky sessions, the "polling" * |
||||||
|
* transport should be disabled. * |
||||||
|
* * |
||||||
|
***************************************************************************/ |
||||||
|
// transports: ["polling", "websocket"]
|
||||||
|
|
||||||
|
}; |
@ -0,0 +1,95 @@ |
|||||||
|
/** |
||||||
|
* View Engine Configuration |
||||||
|
* (sails.config.views) |
||||||
|
* |
||||||
|
* Server-sent views are a classic and effective way to get your app up |
||||||
|
* and running. Views are normally served from controllers. Below, you can |
||||||
|
* configure your templating language/framework of choice and configure |
||||||
|
* Sails' layout support. |
||||||
|
* |
||||||
|
* For more information on views and layouts, check out: |
||||||
|
* http://sailsjs.org/#!/documentation/concepts/Views
|
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports.views = { |
||||||
|
|
||||||
|
/**************************************************************************** |
||||||
|
* * |
||||||
|
* View engine (aka template language) to use for your app's *server-side* * |
||||||
|
* views * |
||||||
|
* * |
||||||
|
* Sails+Express supports all view engines which implement TJ Holowaychuk's * |
||||||
|
* `consolidate.js`, including, but not limited to: * |
||||||
|
* * |
||||||
|
* ejs, jade, handlebars, mustache underscore, hogan, haml, haml-coffee, * |
||||||
|
* dust atpl, eco, ect, jazz, jqtpl, JUST, liquor, QEJS, swig, templayed, * |
||||||
|
* toffee, walrus, & whiskers * |
||||||
|
* * |
||||||
|
* For more options, check out the docs: * |
||||||
|
* https://github.com/balderdashy/sails-wiki/blob/0.9/config.views.md#engine *
|
||||||
|
* * |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
engine: 'ejs', |
||||||
|
|
||||||
|
|
||||||
|
/**************************************************************************** |
||||||
|
* * |
||||||
|
* Layouts are simply top-level HTML templates you can use as wrappers for * |
||||||
|
* your server-side views. If you're using ejs or jade, you can take * |
||||||
|
* advantage of Sails' built-in `layout` support. * |
||||||
|
* * |
||||||
|
* When using a layout, when one of your views is served, it is injected * |
||||||
|
* into the `body` partial defined in the layout. This lets you reuse header * |
||||||
|
* and footer logic between views. * |
||||||
|
* * |
||||||
|
* NOTE: Layout support is only implemented for the `ejs` view engine! * |
||||||
|
* For most other engines, it is not necessary, since they implement * |
||||||
|
* partials/layouts themselves. In those cases, this config will be * |
||||||
|
* silently ignored. * |
||||||
|
* * |
||||||
|
* The `layout` setting may be set to one of the following: * |
||||||
|
* * |
||||||
|
* If `false`, layouts will be disabled. Otherwise, if a string is * |
||||||
|
* specified, it will be interpreted as the relative path to your layout * |
||||||
|
* file from `views/` folder. (the file extension, ".ejs", should be * |
||||||
|
* omitted) * |
||||||
|
* * |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
/**************************************************************************** |
||||||
|
* * |
||||||
|
* Using Multiple Layouts * |
||||||
|
* * |
||||||
|
* If you're using the default `ejs` or `handlebars` Sails supports the use * |
||||||
|
* of multiple `layout` files. To take advantage of this, before rendering a * |
||||||
|
* view, override the `layout` local in your controller by setting * |
||||||
|
* `res.locals.layout`. (this is handy if you parts of your app's UI look * |
||||||
|
* completely different from each other) * |
||||||
|
* * |
||||||
|
* e.g. your default might be * |
||||||
|
* layout: 'layouts/public' * |
||||||
|
* * |
||||||
|
* But you might override that in some of your controllers with: * |
||||||
|
* layout: 'layouts/internal' * |
||||||
|
* * |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
layout: 'layout', |
||||||
|
|
||||||
|
/**************************************************************************** |
||||||
|
* * |
||||||
|
* Partials are simply top-level snippets you can leverage to reuse template * |
||||||
|
* for your server-side views. If you're using handlebars, you can take * |
||||||
|
* advantage of Sails' built-in `partials` support. * |
||||||
|
* * |
||||||
|
* If `false` or empty partials will be located in the same folder as views. * |
||||||
|
* Otherwise, if a string is specified, it will be interpreted as the * |
||||||
|
* relative path to your partial files from `views/` folder. * |
||||||
|
* * |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
partials: false |
||||||
|
|
||||||
|
|
||||||
|
}; |
@ -0,0 +1,37 @@ |
|||||||
|
{ |
||||||
|
"name": "bbSails", |
||||||
|
"private": true, |
||||||
|
"version": "0.0.0", |
||||||
|
"description": "a Sails application", |
||||||
|
"keywords": [], |
||||||
|
"dependencies": { |
||||||
|
"ejs": "~0.8.4", |
||||||
|
"grunt": "0.4.2", |
||||||
|
"grunt-contrib-clean": "~0.5.0", |
||||||
|
"grunt-contrib-coffee": "~0.10.1", |
||||||
|
"grunt-contrib-concat": "~0.3.0", |
||||||
|
"grunt-contrib-copy": "~0.5.0", |
||||||
|
"grunt-contrib-cssmin": "~0.9.0", |
||||||
|
"grunt-contrib-jst": "~0.6.0", |
||||||
|
"grunt-contrib-less": "0.11.1", |
||||||
|
"grunt-contrib-uglify": "~0.4.0", |
||||||
|
"grunt-contrib-watch": "~0.5.3", |
||||||
|
"grunt-sails-linker": "~0.9.5", |
||||||
|
"grunt-sync": "~0.0.4", |
||||||
|
"include-all": "~0.1.3", |
||||||
|
"rc": "~0.5.0", |
||||||
|
"sails": "~0.11.0", |
||||||
|
"sails-disk": "~0.10.0" |
||||||
|
}, |
||||||
|
"scripts": { |
||||||
|
"debug": "node debug app.js", |
||||||
|
"start": "node app.js" |
||||||
|
}, |
||||||
|
"main": "app.js", |
||||||
|
"repository": { |
||||||
|
"type": "git", |
||||||
|
"url": "git://github.com/sipp11/bbSails.git" |
||||||
|
}, |
||||||
|
"author": "sipp11", |
||||||
|
"license": "" |
||||||
|
} |
@ -0,0 +1,54 @@ |
|||||||
|
# About the `tasks` folder |
||||||
|
|
||||||
|
The `tasks` directory is a suite of Grunt tasks and their configurations, bundled for your convenience. The Grunt integration is mainly useful for bundling front-end assets, (like stylesheets, scripts, & markup templates) but it can also be used to run all kinds of development tasks, from browserify compilation to database migrations. |
||||||
|
|
||||||
|
If you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, read on! |
||||||
|
|
||||||
|
|
||||||
|
### How does this work? |
||||||
|
|
||||||
|
The asset pipeline bundled in Sails is a set of Grunt tasks configured with conventional defaults designed to make your project more consistent and productive. |
||||||
|
|
||||||
|
The entire front-end asset workflow in Sails is completely customizable-- while it provides some suggestions out of the box, Sails makes no pretense that it can anticipate all of the needs you'll encounter building the browser-based/front-end portion of your application. Who's to say you're even building an app for a browser? |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### What tasks does Sails run automatically? |
||||||
|
|
||||||
|
Sails runs some of these tasks (the ones in the `tasks/register` folder) automatically when you run certain commands. |
||||||
|
|
||||||
|
###### `sails lift` |
||||||
|
|
||||||
|
Runs the `default` task (`tasks/register/default.js`). |
||||||
|
|
||||||
|
###### `sails lift --prod` |
||||||
|
|
||||||
|
Runs the `prod` task (`tasks/register/prod.js`). |
||||||
|
|
||||||
|
###### `sails www` |
||||||
|
|
||||||
|
Runs the `build` task (`tasks/register/build.js`). |
||||||
|
|
||||||
|
###### `sails www --prod` (production) |
||||||
|
|
||||||
|
Runs the `buildProd` task (`tasks/register/buildProd.js`). |
||||||
|
|
||||||
|
|
||||||
|
### Can I customize this for SASS, Angular, client-side Jade templates, etc? |
||||||
|
|
||||||
|
You can modify, omit, or replace any of these Grunt tasks to fit your requirements. You can also add your own Grunt tasks- just add a `someTask.js` file in the `grunt/config` directory to configure the new task, then register it with the appropriate parent task(s) (see files in `grunt/register/*.js`). |
||||||
|
|
||||||
|
|
||||||
|
### Do I have to use Grunt? |
||||||
|
|
||||||
|
Nope! To disable Grunt integration in Sails, just delete your Gruntfile or disable the Grunt hook. |
||||||
|
|
||||||
|
|
||||||
|
### What if I'm not building a web frontend? |
||||||
|
|
||||||
|
That's ok! A core tenant of Sails is client-agnosticism-- it's especially designed for building APIs used by all sorts of clients; native Android/iOS/Cordova, serverside SDKs, etc. |
||||||
|
|
||||||
|
You can completely disable Grunt by following the instructions above. |
||||||
|
|
||||||
|
If you still want to use Grunt for other purposes, but don't want any of the default web front-end stuff, just delete your project's `assets` folder and remove the front-end oriented tasks from the `grunt/register` and `grunt/config` folders. You can also run `sails new myCoolApi --no-frontend` to omit the `assets` folder and front-end-oriented Grunt tasks for future projects. You can also replace your `sails-generate-frontend` module with alternative community generators, or create your own. This allows `sails new` to create the boilerplate for native iOS apps, Android apps, Cordova apps, SteroidsJS apps, etc. |
||||||
|
|
@ -0,0 +1,20 @@ |
|||||||
|
/** |
||||||
|
* Clean files and folders. |
||||||
|
* |
||||||
|
* --------------------------------------------------------------- |
||||||
|
* |
||||||
|
* This grunt task is configured to clean out the contents in the .tmp/public of your |
||||||
|
* sails project. |
||||||
|
* |
||||||
|
* For usage docs see: |
||||||
|
* https://github.com/gruntjs/grunt-contrib-clean
|
||||||
|
*/ |
||||||
|
module.exports = function(grunt) { |
||||||
|
|
||||||
|
grunt.config.set('clean', { |
||||||
|
dev: ['.tmp/public/**'], |
||||||
|
build: ['www'] |
||||||
|
}); |
||||||
|
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-clean'); |
||||||
|
}; |
@ -0,0 +1,38 @@ |
|||||||
|
/** |
||||||
|
* Compile CoffeeScript files to JavaScript. |
||||||
|
* |
||||||
|
* --------------------------------------------------------------- |
||||||
|
* |
||||||
|
* Compiles coffeeScript files from `assest/js` into Javascript and places them into |
||||||
|
* `.tmp/public/js` directory. |
||||||
|
* |
||||||
|
* For usage docs see: |
||||||
|
* https://github.com/gruntjs/grunt-contrib-coffee
|
||||||
|
*/ |
||||||
|
module.exports = function(grunt) { |
||||||
|
|
||||||
|
grunt.config.set('coffee', { |
||||||
|
dev: { |
||||||
|
options: { |
||||||
|
bare: true, |
||||||
|
sourceMap: true, |
||||||
|
sourceRoot: './' |
||||||
|
}, |
||||||
|
files: [{ |
||||||
|
expand: true, |
||||||
|
cwd: 'assets/js/', |
||||||
|
src: ['**/*.coffee'], |
||||||
|
dest: '.tmp/public/js/', |
||||||
|
ext: '.js' |
||||||
|
}, { |
||||||
|
expand: true, |
||||||
|
cwd: 'assets/js/', |
||||||
|
src: ['**/*.coffee'], |
||||||
|
dest: '.tmp/public/js/', |
||||||
|
ext: '.js' |
||||||
|
}] |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-coffee'); |
||||||
|
}; |
@ -0,0 +1,27 @@ |
|||||||
|
/** |
||||||
|
* Concatenate files. |
||||||
|
* |
||||||
|
* --------------------------------------------------------------- |
||||||
|
* |
||||||
|
* Concatenates files javascript and css from a defined array. Creates concatenated files in |
||||||
|
* .tmp/public/contact directory |
||||||
|
* [concat](https://github.com/gruntjs/grunt-contrib-concat)
|
||||||
|
* |
||||||
|
* For usage docs see: |
||||||
|
* https://github.com/gruntjs/grunt-contrib-concat
|
||||||
|
*/ |
||||||
|
module.exports = function(grunt) { |
||||||
|
|
||||||
|
grunt.config.set('concat', { |
||||||
|
js: { |
||||||
|
src: require('../pipeline').jsFilesToInject, |
||||||
|
dest: '.tmp/public/concat/production.js' |
||||||
|
}, |
||||||
|
css: { |
||||||
|
src: require('../pipeline').cssFilesToInject, |
||||||
|
dest: '.tmp/public/concat/production.css' |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-concat'); |
||||||
|
}; |
@ -0,0 +1,38 @@ |
|||||||
|
/** |
||||||
|
* Copy files and folders. |
||||||
|
* |
||||||
|
* --------------------------------------------------------------- |
||||||
|
* |
||||||
|
* # dev task config |
||||||
|
* Copies all directories and files, exept coffescript and less fiels, from the sails |
||||||
|
* assets folder into the .tmp/public directory. |
||||||
|
* |
||||||
|
* # build task config |
||||||
|
* Copies all directories nd files from the .tmp/public directory into a www directory. |
||||||
|
* |
||||||
|
* For usage docs see: |
||||||
|
* https://github.com/gruntjs/grunt-contrib-copy
|
||||||
|
*/ |
||||||
|
module.exports = function(grunt) { |
||||||
|
|
||||||
|
grunt.config.set('copy', { |
||||||
|
dev: { |
||||||
|
files: [{ |
||||||
|
expand: true, |
||||||
|
cwd: './assets', |
||||||
|
src: ['**/*.!(coffee|less)'], |
||||||
|
dest: '.tmp/public' |
||||||
|
}] |
||||||
|
}, |
||||||
|
build: { |
||||||
|
files: [{ |
||||||
|
expand: true, |
||||||
|
cwd: '.tmp/public', |
||||||
|
src: ['**/*'], |
||||||
|
dest: 'www' |
||||||
|
}] |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-copy'); |
||||||
|
}; |
@ -0,0 +1,21 @@ |
|||||||
|
/** |
||||||
|
* Compress CSS files. |
||||||
|
* |
||||||
|
* --------------------------------------------------------------- |
||||||
|
* |
||||||
|
* Minifies css files and places them into .tmp/public/min directory. |
||||||
|
* |
||||||
|
* For usage docs see: |
||||||
|
* https://github.com/gruntjs/grunt-contrib-cssmin
|
||||||
|
*/ |
||||||
|
module.exports = function(grunt) { |
||||||
|
|
||||||
|
grunt.config.set('cssmin', { |
||||||
|
dist: { |
||||||
|
src: ['.tmp/public/concat/production.css'], |
||||||
|
dest: '.tmp/public/min/production.min.css' |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-cssmin'); |
||||||
|
}; |
@ -0,0 +1,41 @@ |
|||||||
|
/** |
||||||
|
* Precompiles Underscore templates to a `.jst` file. |
||||||
|
* |
||||||
|
* --------------------------------------------------------------- |
||||||
|
* |
||||||
|
* (i.e. basically it takes HTML files and turns them into tiny little |
||||||
|
* javascript functions that you pass data to and return HTML. This can |
||||||
|
* speed up template rendering on the client, and reduce bandwidth usage.) |
||||||
|
* |
||||||
|
* For usage docs see: |
||||||
|
* https://github.com/gruntjs/grunt-contrib-jst
|
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
module.exports = function(grunt) { |
||||||
|
|
||||||
|
grunt.config.set('jst', { |
||||||
|
dev: { |
||||||
|
|
||||||
|
// To use other sorts of templates, specify a regexp like the example below:
|
||||||
|
// options: {
|
||||||
|
// templateSettings: {
|
||||||
|
// interpolate: /\{\{(.+?)\}\}/g
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
|
||||||
|
// Note that the interpolate setting above is simply an example of overwriting lodash's
|
||||||
|
// default interpolation. If you want to parse templates with the default _.template behavior
|
||||||
|
// (i.e. using <div></div>), there's no need to overwrite `templateSettings.interpolate`.
|
||||||
|
|
||||||
|
|
||||||
|
files: { |
||||||
|
// e.g.
|
||||||
|
// 'relative/path/from/gruntfile/to/compiled/template/destination' : ['relative/path/to/sourcefiles/**/*.html']
|
||||||
|
'.tmp/public/jst.js': require('../pipeline').templateFilesToInject |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-jst'); |
||||||
|
}; |
@ -0,0 +1,28 @@ |
|||||||
|
/** |
||||||
|
* Compiles LESS files into CSS. |
||||||
|
* |
||||||
|
* --------------------------------------------------------------- |
||||||
|
* |
||||||
|
* Only the `assets/styles/importer.less` is compiled. |
||||||
|
* This allows you to control the ordering yourself, i.e. import your |
||||||
|
* dependencies, mixins, variables, resets, etc. before other stylesheets) |
||||||
|
* |
||||||
|
* For usage docs see: |
||||||
|
* https://github.com/gruntjs/grunt-contrib-less
|
||||||
|
*/ |
||||||
|
module.exports = function(grunt) { |
||||||
|
|
||||||
|
grunt.config.set('less', { |
||||||
|
dev: { |
||||||
|
files: [{ |
||||||
|
expand: true, |
||||||
|
cwd: 'assets/styles/', |
||||||
|
src: ['importer.less'], |
||||||
|
dest: '.tmp/public/styles/', |
||||||
|
ext: '.css' |
||||||
|
}] |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-less'); |
||||||
|
}; |
@ -0,0 +1,267 @@ |
|||||||
|
/** |
||||||
|
* Autoinsert script tags (or other filebased tags) in an html file. |
||||||
|
* |
||||||
|
* --------------------------------------------------------------- |
||||||
|
* |
||||||
|
* Automatically inject <script> tags for javascript files and <link> tags |
||||||
|
* for css files. Also automatically links an output file containing precompiled |
||||||
|
* templates using a <script> tag. |
||||||
|
* |
||||||
|
* For usage docs see: |
||||||
|
* https://github.com/Zolmeister/grunt-sails-linker
|
||||||
|
* |
||||||
|
*/ |
||||||
|
module.exports = function(grunt) { |
||||||
|
|
||||||
|
grunt.config.set('sails-linker', { |
||||||
|
devJs: { |
||||||
|
options: { |
||||||
|
startTag: '<!--SCRIPTS-->', |
||||||
|
endTag: '<!--SCRIPTS END-->', |
||||||
|
fileTmpl: '<script src="%s"></script>', |
||||||
|
appRoot: '.tmp/public' |
||||||
|
}, |
||||||
|
files: { |
||||||
|
'.tmp/public/**/*.html': require('../pipeline').jsFilesToInject, |
||||||
|
'views/**/*.html': require('../pipeline').jsFilesToInject, |
||||||
|
'views/**/*.ejs': require('../pipeline').jsFilesToInject |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
devJsRelative: { |
||||||
|
options: { |
||||||
|
startTag: '<!--SCRIPTS-->', |
||||||
|
endTag: '<!--SCRIPTS END-->', |
||||||
|
fileTmpl: '<script src="%s"></script>', |
||||||
|
appRoot: '.tmp/public', |
||||||
|
relative: true |
||||||
|
}, |
||||||
|
files: { |
||||||
|
'.tmp/public/**/*.html': require('../pipeline').jsFilesToInject, |
||||||
|
'views/**/*.html': require('../pipeline').jsFilesToInject, |
||||||
|
'views/**/*.ejs': require('../pipeline').jsFilesToInject |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
prodJs: { |
||||||
|
options: { |
||||||
|
startTag: '<!--SCRIPTS-->', |
||||||
|
endTag: '<!--SCRIPTS END-->', |
||||||
|
fileTmpl: '<script src="%s"></script>', |
||||||
|
appRoot: '.tmp/public' |
||||||
|
}, |
||||||
|
files: { |
||||||
|
'.tmp/public/**/*.html': ['.tmp/public/min/production.min.js'], |
||||||
|
'views/**/*.html': ['.tmp/public/min/production.min.js'], |
||||||
|
'views/**/*.ejs': ['.tmp/public/min/production.min.js'] |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
prodJsRelative: { |
||||||
|
options: { |
||||||
|
startTag: '<!--SCRIPTS-->', |
||||||
|
endTag: '<!--SCRIPTS END-->', |
||||||
|
fileTmpl: '<script src="%s"></script>', |
||||||
|
appRoot: '.tmp/public', |
||||||
|
relative: true |
||||||
|
}, |
||||||
|
files: { |
||||||
|
'.tmp/public/**/*.html': ['.tmp/public/min/production.min.js'], |
||||||
|
'views/**/*.html': ['.tmp/public/min/production.min.js'], |
||||||
|
'views/**/*.ejs': ['.tmp/public/min/production.min.js'] |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
devStyles: { |
||||||
|
options: { |
||||||
|
startTag: '<!--STYLES-->', |
||||||
|
endTag: '<!--STYLES END-->', |
||||||
|
fileTmpl: '<link rel="stylesheet" href="%s">', |
||||||
|
appRoot: '.tmp/public' |
||||||
|
}, |
||||||
|
|
||||||
|
files: { |
||||||
|
'.tmp/public/**/*.html': require('../pipeline').cssFilesToInject, |
||||||
|
'views/**/*.html': require('../pipeline').cssFilesToInject, |
||||||
|
'views/**/*.ejs': require('../pipeline').cssFilesToInject |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
devStylesRelative: { |
||||||
|
options: { |
||||||
|
startTag: '<!--STYLES-->', |
||||||
|
endTag: '<!--STYLES END-->', |
||||||
|
fileTmpl: '<link rel="stylesheet" href="%s">', |
||||||
|
appRoot: '.tmp/public', |
||||||
|
relative: true |
||||||
|
}, |
||||||
|
|
||||||
|
files: { |
||||||
|
'.tmp/public/**/*.html': require('../pipeline').cssFilesToInject, |
||||||
|
'views/**/*.html': require('../pipeline').cssFilesToInject, |
||||||
|
'views/**/*.ejs': require('../pipeline').cssFilesToInject |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
prodStyles: { |
||||||
|
options: { |
||||||
|
startTag: '<!--STYLES-->', |
||||||
|
endTag: '<!--STYLES END-->', |
||||||
|
fileTmpl: '<link rel="stylesheet" href="%s">', |
||||||
|
appRoot: '.tmp/public' |
||||||
|
}, |
||||||
|
files: { |
||||||
|
'.tmp/public/index.html': ['.tmp/public/min/production.min.css'], |
||||||
|
'views/**/*.html': ['.tmp/public/min/production.min.css'], |
||||||
|
'views/**/*.ejs': ['.tmp/public/min/production.min.css'] |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
prodStylesRelative: { |
||||||
|
options: { |
||||||
|
startTag: '<!--STYLES-->', |
||||||
|
endTag: '<!--STYLES END-->', |
||||||
|
fileTmpl: '<link rel="stylesheet" href="%s">', |
||||||
|
appRoot: '.tmp/public', |
||||||
|
relative: true |
||||||
|
}, |
||||||
|
files: { |
||||||
|
'.tmp/public/index.html': ['.tmp/public/min/production.min.css'], |
||||||
|
'views/**/*.html': ['.tmp/public/min/production.min.css'], |
||||||
|
'views/**/*.ejs': ['.tmp/public/min/production.min.css'] |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
// Bring in JST template object
|
||||||
|
devTpl: { |
||||||
|
options: { |
||||||
|
startTag: '<!--TEMPLATES-->', |
||||||
|
endTag: '<!--TEMPLATES END-->', |
||||||
|
fileTmpl: '<script type="text/javascript" src="%s"></script>', |
||||||
|
appRoot: '.tmp/public' |
||||||
|
}, |
||||||
|
files: { |
||||||
|
'.tmp/public/index.html': ['.tmp/public/jst.js'], |
||||||
|
'views/**/*.html': ['.tmp/public/jst.js'], |
||||||
|
'views/**/*.ejs': ['.tmp/public/jst.js'] |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
devJsJade: { |
||||||
|
options: { |
||||||
|
startTag: '// SCRIPTS', |
||||||
|
endTag: '// SCRIPTS END', |
||||||
|
fileTmpl: 'script(src="%s")', |
||||||
|
appRoot: '.tmp/public' |
||||||
|
}, |
||||||
|
files: { |
||||||
|
'views/**/*.jade': require('../pipeline').jsFilesToInject |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
devJsRelativeJade: { |
||||||
|
options: { |
||||||
|
startTag: '// SCRIPTS', |
||||||
|
endTag: '// SCRIPTS END', |
||||||
|
fileTmpl: 'script(src="%s")', |
||||||
|
appRoot: '.tmp/public', |
||||||
|
relative: true |
||||||
|
}, |
||||||
|
files: { |
||||||
|
'views/**/*.jade': require('../pipeline').jsFilesToInject |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
prodJsJade: { |
||||||
|
options: { |
||||||
|
startTag: '// SCRIPTS', |
||||||
|
endTag: '// SCRIPTS END', |
||||||
|
fileTmpl: 'script(src="%s")', |
||||||
|
appRoot: '.tmp/public' |
||||||
|
}, |
||||||
|
files: { |
||||||
|
'views/**/*.jade': ['.tmp/public/min/production.min.js'] |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
prodJsRelativeJade: { |
||||||
|
options: { |
||||||
|
startTag: '// SCRIPTS', |
||||||
|
endTag: '// SCRIPTS END', |
||||||
|
fileTmpl: 'script(src="%s")', |
||||||
|
appRoot: '.tmp/public', |
||||||
|
relative: true |
||||||
|
}, |
||||||
|
files: { |
||||||
|
'views/**/*.jade': ['.tmp/public/min/production.min.js'] |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
devStylesJade: { |
||||||
|
options: { |
||||||
|
startTag: '// STYLES', |
||||||
|
endTag: '// STYLES END', |
||||||
|
fileTmpl: 'link(rel="stylesheet", href="%s")', |
||||||
|
appRoot: '.tmp/public' |
||||||
|
}, |
||||||
|
|
||||||
|
files: { |
||||||
|
'views/**/*.jade': require('../pipeline').cssFilesToInject |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
devStylesRelativeJade: { |
||||||
|
options: { |
||||||
|
startTag: '// STYLES', |
||||||
|
endTag: '// STYLES END', |
||||||
|
fileTmpl: 'link(rel="stylesheet", href="%s")', |
||||||
|
appRoot: '.tmp/public', |
||||||
|
relative: true |
||||||
|
}, |
||||||
|
|
||||||
|
files: { |
||||||
|
'views/**/*.jade': require('../pipeline').cssFilesToInject |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
prodStylesJade: { |
||||||
|
options: { |
||||||
|
startTag: '// STYLES', |
||||||
|
endTag: '// STYLES END', |
||||||
|
fileTmpl: 'link(rel="stylesheet", href="%s")', |
||||||
|
appRoot: '.tmp/public' |
||||||
|
}, |
||||||
|
files: { |
||||||
|
'views/**/*.jade': ['.tmp/public/min/production.min.css'] |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
prodStylesRelativeJade: { |
||||||
|
options: { |
||||||
|
startTag: '// STYLES', |
||||||
|
endTag: '// STYLES END', |
||||||
|
fileTmpl: 'link(rel="stylesheet", href="%s")', |
||||||
|
appRoot: '.tmp/public', |
||||||
|
relative: true |
||||||
|
}, |
||||||
|
files: { |
||||||
|
'views/**/*.jade': ['.tmp/public/min/production.min.css'] |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
// Bring in JST template object
|
||||||
|
devTplJade: { |
||||||
|
options: { |
||||||
|
startTag: '// TEMPLATES', |
||||||
|
endTag: '// TEMPLATES END', |
||||||
|
fileTmpl: 'script(type="text/javascript", src="%s")', |
||||||
|
appRoot: '.tmp/public' |
||||||
|
}, |
||||||
|
files: { |
||||||
|
'views/**/*.jade': ['.tmp/public/jst.js'] |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
grunt.loadNpmTasks('grunt-sails-linker'); |
||||||
|
}; |
@ -0,0 +1,27 @@ |
|||||||
|
/** |
||||||
|
* A grunt task to keep directories in sync. It is very similar to grunt-contrib-copy |
||||||
|
* but tries to copy only those files that has actually changed. |
||||||
|
* |
||||||
|
* --------------------------------------------------------------- |
||||||
|
* |
||||||
|
* Synchronize files from the `assets` folder to `.tmp/public`, |
||||||
|
* smashing anything that's already there. |
||||||
|
* |
||||||
|
* For usage docs see: |
||||||
|
* https://github.com/tomusdrw/grunt-sync
|
||||||
|
* |
||||||
|
*/ |
||||||
|
module.exports = function(grunt) { |
||||||
|
|
||||||
|
grunt.config.set('sync', { |
||||||
|
dev: { |
||||||
|
files: [{ |
||||||
|
cwd: './assets', |
||||||
|
src: ['**/*.!(coffee)'], |
||||||
|
dest: '.tmp/public' |
||||||
|
}] |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
grunt.loadNpmTasks('grunt-sync'); |
||||||
|
}; |
@ -0,0 +1,22 @@ |
|||||||
|
/** |
||||||
|
* Minify files with UglifyJS. |
||||||
|
* |
||||||
|
* --------------------------------------------------------------- |
||||||
|
* |
||||||
|
* Minifies client-side javascript `assets`. |
||||||
|
* |
||||||
|
* For usage docs see: |
||||||
|
* https://github.com/gruntjs/grunt-contrib-uglify
|
||||||
|
* |
||||||
|
*/ |
||||||
|
module.exports = function(grunt) { |
||||||
|
|
||||||
|
grunt.config.set('uglify', { |
||||||
|
dist: { |
||||||
|
src: ['.tmp/public/concat/production.js'], |
||||||
|
dest: '.tmp/public/min/production.min.js' |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-uglify'); |
||||||
|
}; |
@ -0,0 +1,34 @@ |
|||||||
|
/** |
||||||
|
* Run predefined tasks whenever watched file patterns are added, changed or deleted. |
||||||
|
* |
||||||
|
* --------------------------------------------------------------- |
||||||
|
* |
||||||
|
* Watch for changes on |
||||||
|
* - files in the `assets` folder |
||||||
|
* - the `tasks/pipeline.js` file |
||||||
|
* and re-run the appropriate tasks. |
||||||
|
* |
||||||
|
* For usage docs see: |
||||||
|
* https://github.com/gruntjs/grunt-contrib-watch
|
||||||
|
* |
||||||
|
*/ |
||||||
|
module.exports = function(grunt) { |
||||||
|
|
||||||
|
grunt.config.set('watch', { |
||||||
|
api: { |
||||||
|
|
||||||
|
// API files to watch:
|
||||||
|
files: ['api/**/*', '!**/node_modules/**'] |
||||||
|
}, |
||||||
|
assets: { |
||||||
|
|
||||||
|
// Assets to watch:
|
||||||
|
files: ['assets/**/*', 'tasks/pipeline.js', '!**/node_modules/**'], |
||||||
|
|
||||||
|
// When assets are changed:
|
||||||
|
tasks: ['syncAssets' , 'linkAssets'] |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-watch'); |
||||||
|
}; |
@ -0,0 +1,64 @@ |
|||||||
|
/** |
||||||
|
* grunt/pipeline.js |
||||||
|
* |
||||||
|
* The order in which your css, javascript, and template files should be |
||||||
|
* compiled and linked from your views and static HTML files. |
||||||
|
* |
||||||
|
* (Note that you can take advantage of Grunt-style wildcard/glob/splat expressions |
||||||
|
* for matching multiple files.) |
||||||
|
*/ |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// CSS files to inject in order
|
||||||
|
//
|
||||||
|
// (if you're using LESS with the built-in default config, you'll want
|
||||||
|
// to change `assets/styles/importer.less` instead.)
|
||||||
|
var cssFilesToInject = [ |
||||||
|
'styles/**/*.css' |
||||||
|
]; |
||||||
|
|
||||||
|
|
||||||
|
// Client-side javascript files to inject in order
|
||||||
|
// (uses Grunt-style wildcard/glob/splat expressions)
|
||||||
|
var jsFilesToInject = [ |
||||||
|
|
||||||
|
// Load sails.io before everything else
|
||||||
|
'js/dependencies/sails.io.js', |
||||||
|
|
||||||
|
// Dependencies like jQuery, or Angular are brought in here
|
||||||
|
'js/dependencies/**/*.js', |
||||||
|
|
||||||
|
// All of the rest of your client-side js files
|
||||||
|
// will be injected here in no particular order.
|
||||||
|
'js/**/*.js' |
||||||
|
]; |
||||||
|
|
||||||
|
|
||||||
|
// Client-side HTML templates are injected using the sources below
|
||||||
|
// The ordering of these templates shouldn't matter.
|
||||||
|
// (uses Grunt-style wildcard/glob/splat expressions)
|
||||||
|
//
|
||||||
|
// By default, Sails uses JST templates and precompiles them into
|
||||||
|
// functions for you. If you want to use jade, handlebars, dust, etc.,
|
||||||
|
// with the linker, no problem-- you'll just want to make sure the precompiled
|
||||||
|
// templates get spit out to the same file. Be sure and check out `tasks/README.md`
|
||||||
|
// for information on customizing and installing new tasks.
|
||||||
|
var templateFilesToInject = [ |
||||||
|
'templates/**/*.html' |
||||||
|
]; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Prefix relative paths to source files so they point to the proper locations
|
||||||
|
// (i.e. where the other Grunt tasks spit them out, or in some cases, where
|
||||||
|
// they reside in the first place)
|
||||||
|
module.exports.cssFilesToInject = cssFilesToInject.map(function(path) { |
||||||
|
return '.tmp/public/' + path; |
||||||
|
}); |
||||||
|
module.exports.jsFilesToInject = jsFilesToInject.map(function(path) { |
||||||
|
return '.tmp/public/' + path; |
||||||
|
}); |
||||||
|
module.exports.templateFilesToInject = templateFilesToInject.map(function(path) { |
||||||
|
return 'assets/' + path; |
||||||
|
}); |
@ -0,0 +1,8 @@ |
|||||||
|
module.exports = function (grunt) { |
||||||
|
grunt.registerTask('build', [ |
||||||
|
'compileAssets', |
||||||
|
'linkAssetsBuild', |
||||||
|
'clean:build', |
||||||
|
'copy:build' |
||||||
|
]); |
||||||
|
}; |
@ -0,0 +1,11 @@ |
|||||||
|
module.exports = function (grunt) { |
||||||
|
grunt.registerTask('buildProd', [ |
||||||
|
'compileAssets', |
||||||
|
'concat', |
||||||
|
'uglify', |
||||||
|
'cssmin', |
||||||
|
'linkAssetsBuildProd', |
||||||
|
'clean:build', |
||||||
|
'copy:build' |
||||||
|
]); |
||||||
|
}; |
@ -0,0 +1,9 @@ |
|||||||
|
module.exports = function (grunt) { |
||||||
|
grunt.registerTask('compileAssets', [ |
||||||
|
'clean:dev', |
||||||
|
'jst:dev', |
||||||
|
'less:dev', |
||||||
|
'copy:dev', |
||||||
|
'coffee:dev' |
||||||
|
]); |
||||||
|
}; |
@ -0,0 +1,3 @@ |
|||||||
|
module.exports = function (grunt) { |
||||||
|
grunt.registerTask('default', ['compileAssets', 'linkAssets', 'watch']); |
||||||
|
}; |
@ -0,0 +1,10 @@ |
|||||||
|
module.exports = function (grunt) { |
||||||
|
grunt.registerTask('linkAssets', [ |
||||||
|
'sails-linker:devJs', |
||||||
|
'sails-linker:devStyles', |
||||||
|
'sails-linker:devTpl', |
||||||
|
'sails-linker:devJsJade', |
||||||
|
'sails-linker:devStylesJade', |
||||||
|
'sails-linker:devTplJade' |
||||||
|
]); |
||||||
|
}; |
@ -0,0 +1,10 @@ |
|||||||
|
module.exports = function (grunt) { |
||||||
|
grunt.registerTask('linkAssetsBuild', [ |
||||||
|
'sails-linker:devJsRelative', |
||||||
|
'sails-linker:devStylesRelative', |
||||||
|
'sails-linker:devTpl', |
||||||
|
'sails-linker:devJsRelativeJade', |
||||||
|
'sails-linker:devStylesRelativeJade', |
||||||
|
'sails-linker:devTplJade' |
||||||
|
]); |
||||||
|
}; |
@ -0,0 +1,10 @@ |
|||||||
|
module.exports = function (grunt) { |
||||||
|
grunt.registerTask('linkAssetsBuildProd', [ |
||||||
|
'sails-linker:prodJsRelative', |
||||||
|
'sails-linker:prodStylesRelative', |
||||||
|
'sails-linker:devTpl', |
||||||
|
'sails-linker:prodJsRelativeJade', |
||||||
|
'sails-linker:prodStylesRelativeJade', |
||||||
|
'sails-linker:devTplJade' |
||||||
|
]); |
||||||
|
}; |
@ -0,0 +1,14 @@ |
|||||||
|
module.exports = function (grunt) { |
||||||
|
grunt.registerTask('prod', [ |
||||||
|
'compileAssets', |
||||||
|
'concat', |
||||||
|
'uglify', |
||||||
|
'cssmin', |
||||||
|
'sails-linker:prodJs', |
||||||
|
'sails-linker:prodStyles', |
||||||
|
'sails-linker:devTpl', |
||||||
|
'sails-linker:prodJsJade', |
||||||
|
'sails-linker:prodStylesJade', |
||||||
|
'sails-linker:devTplJade' |
||||||
|
]); |
||||||
|
}; |
@ -0,0 +1,8 @@ |
|||||||
|
module.exports = function (grunt) { |
||||||
|
grunt.registerTask('syncAssets', [ |
||||||
|
'jst:dev', |
||||||
|
'less:dev', |
||||||
|
'sync:dev', |
||||||
|
'coffee:dev' |
||||||
|
]); |
||||||
|
}; |
@ -0,0 +1,76 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<!-- |
||||||
|
|
||||||
|
|
||||||
|
444444444 000000000 333333333333333 |
||||||
|
4::::::::4 00:::::::::00 3:::::::::::::::33 |
||||||
|
4:::::::::4 00:::::::::::::00 3::::::33333::::::3 |
||||||
|
4::::44::::4 0:::::::000:::::::03333333 3:::::3 |
||||||
|
4::::4 4::::4 0::::::0 0::::::0 3:::::3 |
||||||
|
4::::4 4::::4 0:::::0 0:::::0 3:::::3 |
||||||
|
4::::4 4::::4 0:::::0 0:::::0 33333333:::::3 |
||||||
|
4::::444444::::4440:::::0 000 0:::::0 3:::::::::::3 |
||||||
|
4::::::::::::::::40:::::0 000 0:::::0 33333333:::::3 |
||||||
|
4444444444:::::4440:::::0 0:::::0 3:::::3 |
||||||
|
4::::4 0:::::0 0:::::0 3:::::3 |
||||||
|
4::::4 0::::::0 0::::::0 3:::::3 |
||||||
|
4::::4 0:::::::000:::::::03333333 3:::::3 |
||||||
|
44::::::44 00:::::::::::::00 3::::::33333::::::3 |
||||||
|
4::::::::4 00:::::::::00 3:::::::::::::::33 |
||||||
|
4444444444 000000000 333333333333333 |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
This is the default "403: Forbidden" page. |
||||||
|
User agents that don't "Accept" HTML will see a JSON version instead. |
||||||
|
You can customize the control logic for your needs in `config/403.js` |
||||||
|
|
||||||
|
You can trigger this response from one of your controllers or policies with: |
||||||
|
`return res.forbidden( msg );` |
||||||
|
(where `msg` is an optional error message to include in the response) |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--> |
||||||
|
<html> |
||||||
|
<head> |
||||||
|
<title>Forbidden</title> |
||||||
|
<link href='http://sailsjs.org/styles/fonts.css' rel='stylesheet'/> |
||||||
|
<style> |
||||||
|
/* Styles included inline since you'll probably be deleting or replacing this page anyway */ |
||||||
|
html,body{text-align:left;font-size:1em}html,body,img,form,textarea,input,fieldset,div,p,div,ul,li,ol,dl,dt,dd,h1,h2,h3,h4,h5,h6,pre,code{margin:0;padding:0}ul,li{list-style:none}img{display:block}a img{border:0}a{text-decoration:none;font-weight:normal;font-family:inherit}*:active,*:focus{outline:0;-moz-outline-style:none}h1,h2,h3,h4,h5,h6,h7{font-weight:normal;font-size:1em}.clearfix:after{clear:both;content:".";display:block;font-size:0;height:0;line-height:0;visibility:hidden}.page .ocean{background:url('http://sailsjs.com/images/waves.png') #0c8da0 no-repeat center 0;height:315px}.page .ocean img{margin-right:auto;margin-left:auto}.page .waves{display:block;padding-top:25px;margin-right:auto;margin-left:auto}.page .main{display:block;margin-top:90px}.page .logo{width:150px;margin-top:3.5em;margin-left:auto;margin-right:auto}.page .fishy{display:block;padding-top:100px}.page .help{padding-top:2em}.page h1{font-family:"Open Sans","Myriad Pro",Arial,sans-serif;font-weight:bold;font-size:1.7em;color:#001c20;text-align:center}.page h2{font-family:"Open Sans","Myriad Pro",Arial,sans-serif;font-weight:300;font-size:1.5em;color:#001c20;text-align:center}.page p{font-family:"Open Sans","Myriad Pro",Arial,sans-serif;font-size:1.25em;color:#001c20;text-align:center}.page a{color:#118798}.page a:hover{color:#b1eef7} |
||||||
|
</style> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
|
||||||
|
<div class="page"> |
||||||
|
<div class="ocean"> |
||||||
|
<img class="fishy" src="http://sailsjs.com/images/image_devInTub.png"> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="main"> |
||||||
|
<h1> |
||||||
|
Forbidden |
||||||
|
</h1> |
||||||
|
<h2> |
||||||
|
<% if (typeof error !== 'undefined') { %> |
||||||
|
<%= error %> |
||||||
|
<% } else { %> |
||||||
|
You don't have permission to see the page you're trying to reach. |
||||||
|
<% } %> |
||||||
|
</h2> |
||||||
|
<p class="help"> |
||||||
|
<a href="http://en.wikipedia.org/wiki/HTTP_403">Why</a> might this be happening? |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="logo"> |
||||||
|
<a href="http://sailsjs.org"> |
||||||
|
<img src="http://sailsjs.org/images/logo.png"> |
||||||
|
</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
</body> |
||||||
|
</html> |
@ -0,0 +1,76 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<!-- |
||||||
|
|
||||||
|
|
||||||
|
444444444 000000000 444444444 |
||||||
|
4::::::::4 00:::::::::00 4::::::::4 |
||||||
|
4:::::::::4 00:::::::::::::00 4:::::::::4 |
||||||
|
4::::44::::4 0:::::::000:::::::0 4::::44::::4 |
||||||
|
4::::4 4::::4 0::::::0 0::::::0 4::::4 4::::4 |
||||||
|
4::::4 4::::4 0:::::0 0:::::0 4::::4 4::::4 |
||||||
|
4::::4 4::::4 0:::::0 0:::::0 4::::4 4::::4 |
||||||
|
4::::444444::::4440:::::0 000 0:::::04::::444444::::444 |
||||||
|
4::::::::::::::::40:::::0 000 0:::::04::::::::::::::::4 |
||||||
|
4444444444:::::4440:::::0 0:::::04444444444:::::444 |
||||||
|
4::::4 0:::::0 0:::::0 4::::4 |
||||||
|
4::::4 0::::::0 0::::::0 4::::4 |
||||||
|
4::::4 0:::::::000:::::::0 4::::4 |
||||||
|
44::::::44 00:::::::::::::00 44::::::44 |
||||||
|
4::::::::4 00:::::::::00 4::::::::4 |
||||||
|
4444444444 000000000 4444444444 |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
This is the default "404: Not Found" page. |
||||||
|
User agents that don't "Accept" HTML will see a JSON version instead. |
||||||
|
You can customize the control logic for your needs in `config/404.js` |
||||||
|
|
||||||
|
Sails considers a request to be in a "404: Not Found" state when a user |
||||||
|
requests a URL which doesn't match any of your app's routes or blueprints. |
||||||
|
|
||||||
|
You can also trigger this response from one of your controllers or policies with: |
||||||
|
`return res.notFound();` |
||||||
|
|
||||||
|
|
||||||
|
--> |
||||||
|
<html> |
||||||
|
<head> |
||||||
|
<title>Page Not Found</title> |
||||||
|
<link href='http://sailsjs.org/styles/fonts.css' rel='stylesheet'/> |
||||||
|
<style> |
||||||
|
/* Styles included inline since you'll probably be deleting this page anyway */ |
||||||
|
html,body{text-align:left;font-size:1em}html,body,img,form,textarea,input,fieldset,div,p,div,ul,li,ol,dl,dt,dd,h1,h2,h3,h4,h5,h6,pre,code{margin:0;padding:0}ul,li{list-style:none}img{display:block}a img{border:0}a{text-decoration:none;font-weight:normal;font-family:inherit}*:active,*:focus{outline:0;-moz-outline-style:none}h1,h2,h3,h4,h5,h6,h7{font-weight:normal;font-size:1em}.clearfix:after{clear:both;content:".";display:block;font-size:0;height:0;line-height:0;visibility:hidden}.fourohfour .ocean{background:url('http://sailsjs.com/images/waves.png') #0c8da0 no-repeat center 0;height:315px}.fourohfour .ocean img{margin-right:auto;margin-left:auto}.fourohfour .waves{display:block;padding-top:25px;margin-right:auto;margin-left:auto}.fourohfour .main{display:block;margin-top:90px}.fourohfour .logo{width:150px;margin-top:3.5em;margin-left:auto;margin-right:auto}.fourohfour .fishy{display:block;padding-top:27px}.fourohfour .help{padding-top:2em}.fourohfour h1{font-family:"Open Sans","Myriad Pro",Arial,sans-serif;font-weight:bold;font-size:1.7em;color:#001c20;text-align:center}.fourohfour h2{font-family:"Open Sans","Myriad Pro",Arial,sans-serif;font-weight:300;font-size:1.5em;color:#001c20;text-align:center}.fourohfour p{font-family:"Open Sans","Myriad Pro",Arial,sans-serif;font-size:1.25em;color:#001c20;text-align:center}.fourohfour a{color:#118798}.fourohfour a:hover{color:#b1eef7} |
||||||
|
</style> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
|
||||||
|
<div class="fourohfour"> |
||||||
|
<div class="ocean"> |
||||||
|
<img class="fishy" src="http://sailsjs.org/images/fishy4.png"> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="main"> |
||||||
|
<h1> |
||||||
|
Something's fishy here. |
||||||
|
</h1> |
||||||
|
<h2> |
||||||
|
<% if (typeof error!== 'undefined') { %> |
||||||
|
<%= error %> |
||||||
|
<% } else { %> |
||||||
|
The page you were trying to reach doesn't exist. |
||||||
|
<% } %> |
||||||
|
</h2> |
||||||
|
<p class="help"> |
||||||
|
<a href="http://en.wikipedia.org/wiki/HTTP_404">Why</a> might this be happening? |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="logo"> |
||||||
|
<a href="http://sailsjs.org"> |
||||||
|
<img src="http://sailsjs.org/images/logo.png"> |
||||||
|
</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
</body> |
||||||
|
</html> |
File diff suppressed because one or more lines are too long
@ -0,0 +1,74 @@ |
|||||||
|
<!-- Default home page --> |
||||||
|
<link type="text/css" href='http://sailsjs.org/styles/fonts.css' rel='stylesheet'/> |
||||||
|
<style> |
||||||
|
/* Styles included inline since you'll probably be deleting this page anyway */ |
||||||
|
html,body{text-align:left;font-size:1em}html,body,img,form,textarea,input,fieldset,div,p,div,ul,li,ol,dl,dt,dd,h1,h2,h3,h4,h5,h6,pre,code{margin:0;padding:0}ul,li{list-style:none}img{display:block}a img{border:0}a{text-decoration:none;font-weight:normal;font-family:inherit}*:active,*:focus{outline:0;-moz-outline-style:none}h1,h2,h3,h4,h5,h6{font-weight:normal}div.clear{clear:both}.clearfix:after{clear:both;content:".";display:block;font-size:0;height:0;line-height:0;visibility:hidden}body{font-family:"Open Sans",Arial,sans-serif;font-weight:300;}.top-bar {width: 100%; background-color: #e4f0f1; padding: 15px 0;}.top-bar .container img {float: left;}.top-bar .container ul {float: right; padding-top: 25px;}.top-bar .container li {float: left; width: 125px; text-align: center; font-size: 15px; color:#000; font-weight: 600;}.top-bar .container a li:hover {color: #118798; -webkit-transition:color 200ms; -moz-transition:color 200ms; -o-transition:color 200ms;transition:color 200ms;}.container{width: 80%; max-width: 1200px; margin: auto;}div.header {-webkit-transition: 6s; -moz-transition: 6s; -o-transition: 6s;transition: 6s; background: rgba(4, 36, 41, 0.89) url(http://sailsjs.org/images/img_sailsShadow.png) no-repeat 42% bottom; padding: 100px 0 65px;}.header h1#main-title{color: #fff; font-weight: 300; font-size: 2.5em;}.header h3{color: #b1eef7; font-style: italic; font-weight: 300;}.header h3 code{font-style: normal!important; background-color: rgba(255,255,255,0.5); font-weight: 300; color:#0e6471; margin: 0px 5px;}div.main.container{padding: 50px 0;}h1 {color: #118798; font-weight: 300;}code {font-size: inherit; font-family: 'Consolas', 'Monaco', monospace; padding:4px 5px 1px; background-color: #f3f5f7}a{color: #118798; font-weight: 300; text-decoration: underline;}a:hover {color: #0e6471; -webkit-transition:color 200ms; -moz-transition:color 200ms; -o-transition:color 200ms;transition:color 200ms;}p{line-height: 1.5em;}blockquote{background-color: #e4f0f1; padding: 25px; line-height: 1.5em; margin: 15px 0;}blockquote span{font-weight: 600; padding-right: 5px;}ul.getting-started{padding: 25px 75px 25px 0; width: 70%; float: left; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;}ul.getting-started li{padding: 25px 0;}ul.getting-started li h3 {padding-bottom: 10px; font-size: 25px; font-weight: 300;}.sprite{background:url(http://sailsjs.org/images/newapp.sprite.png) no-repeat; position: absolute; left: 0; top:0;}.getting-started .sprite{margin-left:10px;padding-left:60px;height:42px;width:0; float: left;}.getting-started .one{background-position:0 0}.getting-started .two{background-position:0 -42px}.getting-started .three{background-position:0 -83px}div.step {position: relative; padding-left: 70px; opacity: 0.9;}div.step:hover{ opacity: 1;}div.links {float: left; width: 30%; max-width: 325px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; background-color: #f3f5f7; border: 1px solid #ebebeb; padding: 25px 45px 35px;}div.links h3 {color: #727272; text-align: center; font-size: 28px; font-weight: 300;}div.links h4 {color: #727272; font-size: 17px; font-weight: 600; padding: 15px 0 10px;}div.links .link-list a {text-decoration: none; font-weight: 400;}div.links .link-list a li {padding: 0px 0px 5px 10px;}div.default-page{min-width: 1200px;}.pocket{display:none;} |
||||||
|
</style> |
||||||
|
<script type="text/javascript"> |
||||||
|
setTimeout(function sunrise () { |
||||||
|
document.getElementsByClassName('header')[0].style.backgroundColor = '#118798'; |
||||||
|
}, 0); |
||||||
|
</script> |
||||||
|
|
||||||
|
<div class="default-page"> |
||||||
|
<div class="header"> |
||||||
|
<h1 id="main-title" class="container"><%= __('A brand new app.') %></h1> |
||||||
|
<h3 class="container">You're looking at: <code><%= view.pathFromApp + '.' +view.ext %></code></h3> |
||||||
|
</div> |
||||||
|
<div class="main container clearfix"> |
||||||
|
<!-- <h1>Getting started</h1> |
||||||
|
<p>Don't worry, we've got your back.</p> --> |
||||||
|
<ul class="getting-started"> |
||||||
|
<li class="clearfix"> |
||||||
|
<div class="step"> |
||||||
|
<div class="sprite one"></div> |
||||||
|
<h3>Generate a REST API.</h3> |
||||||
|
<p> |
||||||
|
Run <code>sails generate api user</code>. This will create two files: a <a href="http://sailsjs.org/#!/documentation/concepts/ORM/Models.html">model</a> <code class="pocket">api/models/User.js</code> and a <a href="http://sailsjs.org/#!/documentation/concepts/Controllers">controller</a><code class="pocket">api/controllers/UserController.js</code>. |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
</li> |
||||||
|
<li class="clearfix"> |
||||||
|
<div class="step"> |
||||||
|
<div class="sprite two"></div> |
||||||
|
<h3> |
||||||
|
Lift your app. |
||||||
|
</h3> |
||||||
|
<p> |
||||||
|
Run <code>sails lift</code> to start up your app server. If you visit <a target="_blank" href="http://localhost:1337/user"><code>http://localhost:1337/user</code></a> in your browser, you'll see a <a href="http://sailsjs.org/#!/documentation/reference/blueprint-api">WebSocket-compatible</a> user API. |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
</li> |
||||||
|
<li class="clearfix"> |
||||||
|
<div class="step"> |
||||||
|
<div class="sprite three"></div> |
||||||
|
<h3> |
||||||
|
Dive in. |
||||||
|
</h3> |
||||||
|
<p>Blueprints are just the beginning. You'll probably also want to learn how to customize your app's <a href="http://sailsjs.org/#!/documentation/concepts/Routes">routes</a>, set up <a href="http://sailsjs.org/#!/documentation/concepts/Policies">security policies</a>, configure your <a href="http://sailsjs.org/#!/documentation/reference/sails.config/sails.config.connections.html">data sources</a>, and build custom <a target="_blank" href="http://sailsjs.org/#!/documentation/concepts/Controllers?q=actions">controller actions</a>. For more help getting started, check out the links on this page.</p> |
||||||
|
|
||||||
|
</div> |
||||||
|
</li> |
||||||
|
</ul> |
||||||
|
<div class="links"> |
||||||
|
<!-- <h3>Links</h3> --> |
||||||
|
<ul class="link-list"> |
||||||
|
|
||||||
|
<h4>Docs</h4> |
||||||
|
<a target="_blank" href="http://sailsjs.org/#!/documentation/anatomy/myApp"><li>App Structure</li></a> |
||||||
|
<a target="_blank" href="http://sailsjs.org/#!/documentation/reference"><li>Reference</li></a> |
||||||
|
<a target="_blank" href="http://sailsjs.org/#!/documentation/concepts/extending-sails/Adapters/adapterList.html"><li>Supported Databases</li></a> |
||||||
|
|
||||||
|
<h4>Tutorials</h4> |
||||||
|
<a target="_blank" href="https://github.com/sails101"><li>Sails 101</li></a> |
||||||
|
|
||||||
|
<h4>Community</h4> |
||||||
|
<a target="_blank" href="http://stackoverflow.com/search?q=sails.js"><li>StackOverFlow</li></a> |
||||||
|
<a target="_blank" href="https://github.com/balderdashy/sails"><li>GitHub</li></a> |
||||||
|
<a target="_blank" href="https://groups.google.com/forum/#!forum/sailsjs"><li>Google Group</li></a> |
||||||
|
<a target="_blank" href="http://webchat.freenode.net/"><li>IRC (#sailsjs on freenode)</li></a> |
||||||
|
|
||||||
|
</ul> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
@ -0,0 +1,91 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html> |
||||||
|
<head> |
||||||
|
<title>New Sails App</title> |
||||||
|
|
||||||
|
<!-- Viewport mobile tag for sensible mobile support --> |
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> |
||||||
|
|
||||||
|
|
||||||
|
<!-- |
||||||
|
Stylesheets and Preprocessors |
||||||
|
============================== |
||||||
|
|
||||||
|
You can always bring in CSS files manually with `<link>` tags, or asynchronously |
||||||
|
using a solution like AMD (RequireJS). Or, if you like, you can take advantage |
||||||
|
of Sails' conventional asset pipeline (boilerplate Gruntfile). |
||||||
|
|
||||||
|
By default, stylesheets from your `assets/styles` folder are included |
||||||
|
here automatically (between STYLES and STYLES END). Both CSS (.css) and LESS (.less) |
||||||
|
are supported. In production, your styles will be minified and concatenated into |
||||||
|
a single file. |
||||||
|
|
||||||
|
To customize any part of the built-in behavior, just edit `tasks/pipeline.js`. |
||||||
|
For example, here are a few things you could do: |
||||||
|
|
||||||
|
+ Change the order of your CSS files |
||||||
|
+ Import stylesheets from other directories |
||||||
|
+ Use a different or additional preprocessor, like SASS, SCSS or Stylus |
||||||
|
--> |
||||||
|
|
||||||
|
<!--STYLES--> |
||||||
|
<!--STYLES END--> |
||||||
|
</head> |
||||||
|
|
||||||
|
<body> |
||||||
|
<%- body %> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- |
||||||
|
Client-side Templates |
||||||
|
======================== |
||||||
|
|
||||||
|
HTML templates are important prerequisites of modern, rich client applications. |
||||||
|
To work their magic, frameworks like Backbone, Angular, Ember, and Knockout require |
||||||
|
that you load these templates client-side. |
||||||
|
|
||||||
|
By default, your Gruntfile is configured to automatically load and precompile |
||||||
|
client-side JST templates in your `assets/templates` folder, then |
||||||
|
include them here automatically (between TEMPLATES and TEMPLATES END). |
||||||
|
|
||||||
|
To customize this behavior to fit your needs, just edit `tasks/pipeline.js`. |
||||||
|
For example, here are a few things you could do: |
||||||
|
|
||||||
|
+ Import templates from other directories |
||||||
|
+ Use a different template engine (handlebars, jade, dust, etc.) |
||||||
|
+ Internationalize your client-side templates using a server-side |
||||||
|
stringfile before they're served. |
||||||
|
--> |
||||||
|
|
||||||
|
<!--TEMPLATES--> |
||||||
|
<!--TEMPLATES END--> |
||||||
|
|
||||||
|
|
||||||
|
<!-- |
||||||
|
|
||||||
|
Client-side Javascript |
||||||
|
======================== |
||||||
|
|
||||||
|
You can always bring in JS files manually with `script` tags, or asynchronously |
||||||
|
on the client using a solution like AMD (RequireJS). Or, if you like, you can |
||||||
|
take advantage of Sails' conventional asset pipeline (boilerplate Gruntfile). |
||||||
|
|
||||||
|
By default, files in your `assets/js` folder are included here |
||||||
|
automatically (between SCRIPTS and SCRIPTS END). Both JavaScript (.js) and |
||||||
|
CoffeeScript (.coffee) are supported. In production, your scripts will be minified |
||||||
|
and concatenated into a single file. |
||||||
|
|
||||||
|
To customize any part of the built-in behavior, just edit `tasks/pipeline.js`. |
||||||
|
For example, here are a few things you could do: |
||||||
|
|
||||||
|
+ Change the order of your scripts |
||||||
|
+ Import scripts from other directories |
||||||
|
+ Use a different preprocessor, like TypeScript |
||||||
|
|
||||||
|
--> |
||||||
|
|
||||||
|
<!--SCRIPTS--> |
||||||
|
<!--SCRIPTS END--> |
||||||
|
</body> |
||||||
|
</html> |
Loading…
Reference in new issue