parent
5d6e061e1c
commit
3bb34d5d18
|
@ -0,0 +1,3 @@
|
|||
assets/dependencies/**/*.js
|
||||
views/**/*.ejs
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
{
|
||||
// ╔═╗╔═╗╦ ╦╔╗╔╔╦╗┬─┐┌─┐
|
||||
// ║╣ ╚═╗║ ║║║║ ║ ├┬┘│
|
||||
// o╚═╝╚═╝╩═╝╩╝╚╝ ╩ ┴└─└─┘
|
||||
// A set of basic code conventions (similar to a .jshintrc file) designed to
|
||||
// encourage quality and consistency across your Sails app's code base.
|
||||
// These rules are checked against automatically any time you run `npm test`.
|
||||
//
|
||||
// > An additional eslintrc override file is included in the `assets/` folder
|
||||
// > right out of the box. This is specifically to allow for variations in acceptable
|
||||
// > global variables between front-end JavaScript code designed to run in the browser
|
||||
// > vs. backend code designed to run in a Node.js/Sails process.
|
||||
//
|
||||
// > Note: If you're using mocha, you'll want to add an extra override file to your
|
||||
// > `test/` folder so that eslint will tolerate mocha-specific globals like `before`
|
||||
// > and `describe`.
|
||||
// Designed for ESLint v4.
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// For more information about any of the rules below, check out the relevant
|
||||
// reference page on eslint.org. For example, to get details on "no-sequences",
|
||||
// you would visit `http://eslint.org/docs/rules/no-sequences`. If you're unsure
|
||||
// or could use some advice, come by https://sailsjs.com/support.
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
||||
"env": {
|
||||
"node": true
|
||||
},
|
||||
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 8,
|
||||
"ecmaFeatures": {
|
||||
"experimentalObjectRestSpread": true
|
||||
}
|
||||
},
|
||||
|
||||
"globals": {
|
||||
// If "no-undef" is enabled below, be sure to list all global variables that
|
||||
// are used in this app's backend code (including the globalIds of models):
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
"Promise": true,
|
||||
"sails": true,
|
||||
"_": true,
|
||||
"async": true
|
||||
// …and any others (e.g. `"Organization": true`)
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
},
|
||||
|
||||
"rules": {
|
||||
"callback-return": ["error", ["done", "proceed", "next", "onwards", "callback", "cb"]],
|
||||
"camelcase": ["warn", {"properties":"always"}],
|
||||
"comma-style": ["warn", "last"],
|
||||
"curly": ["error"],
|
||||
"eqeqeq": ["error", "always"],
|
||||
"eol-last": ["warn"],
|
||||
"handle-callback-err": ["error"],
|
||||
"indent": ["warn", 2, {
|
||||
"SwitchCase": 1,
|
||||
"MemberExpression": "off",
|
||||
"FunctionDeclaration": {"body":1, "parameters":"off"},
|
||||
"FunctionExpression": {"body":1, "parameters":"off"},
|
||||
"CallExpression": {"arguments":"off"},
|
||||
"ArrayExpression": 1,
|
||||
"ObjectExpression": 1,
|
||||
"ignoredNodes": ["ConditionalExpression"]
|
||||
}],
|
||||
"linebreak-style": ["error", "unix"],
|
||||
"no-dupe-keys": ["error"],
|
||||
"no-duplicate-case": ["error"],
|
||||
"no-extra-semi": ["warn"],
|
||||
"no-labels": ["error"],
|
||||
"no-mixed-spaces-and-tabs": [2, "smart-tabs"],
|
||||
"no-redeclare": ["warn"],
|
||||
"no-return-assign": ["error", "always"],
|
||||
"no-sequences": ["error"],
|
||||
"no-trailing-spaces": ["warn"],
|
||||
"no-undef": ["off"],
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// ^^Note: If this "no-undef" rule is enabled (set to `["error"]`), then all model globals
|
||||
// (e.g. `"Organization": true`) should be included above under "globals".
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
"no-unexpected-multiline": ["warn"],
|
||||
"no-unreachable": ["warn"],
|
||||
"no-unused-vars": ["warn", {"caughtErrors":"all", "caughtErrorsIgnorePattern": "^unused($|[A-Z].*$)", "argsIgnorePattern": "^unused($|[A-Z].*$)", "varsIgnorePattern": "^unused($|[A-Z].*$)" }],
|
||||
"no-use-before-define": ["error", {"functions":false}],
|
||||
"one-var": ["warn", "never"],
|
||||
"prefer-arrow-callback": ["warn", {"allowNamedFunctions":true}],
|
||||
"quotes": ["warn", "single", {"avoidEscape":false, "allowTemplateLiterals":true}],
|
||||
"semi": ["error", "always"],
|
||||
"semi-spacing": ["warn", {"before":false, "after":true}],
|
||||
"semi-style": ["warn", "last"]
|
||||
}
|
||||
|
||||
}
|
|
@ -1,5 +1,4 @@
|
|||
language: node_js
|
||||
warnings_are_errors: false
|
||||
node_js:
|
||||
- "node"
|
||||
deploy:
|
||||
|
@ -12,7 +11,4 @@ deploy:
|
|||
env: "example-app-environment"
|
||||
bucket_name: "the-target-S3-bucket"
|
||||
|
||||
before_script:
|
||||
- npm install
|
||||
|
||||
script: npm test
|
||||
#script: node testfile
|
||||
|
|
|
@ -13,9 +13,11 @@
|
|||
* https://sailsjs.com/anatomy/Gruntfile.js
|
||||
*/
|
||||
module.exports = function(grunt) {
|
||||
var loadGruntTasks = require('sails-hook-grunt/accessible/load-grunt-tasks')
|
||||
|
||||
var loadGruntTasks = require('sails-hook-grunt/accessible/load-grunt-tasks');
|
||||
|
||||
// Load Grunt task configurations (from `tasks/config/`) and Grunt
|
||||
// task registrations (from `tasks/register/`).
|
||||
loadGruntTasks(__dirname, grunt)
|
||||
}
|
||||
loadGruntTasks(__dirname, grunt);
|
||||
|
||||
};
|
||||
|
|
|
@ -26,3 +26,4 @@ Note: Generators are usually run using the globally-installed `sails` CLI (comm
|
|||
-->
|
||||
|
||||
[![Build Status](https://travis-ci.org/miacona96/RoE-pipe.svg?branch=master)](https://travis-ci.org/miacona96/RoE-pipe)
|
||||
|
||||
|
|
|
@ -114,7 +114,7 @@ module.exports = {
|
|||
}
|
||||
}
|
||||
|
||||
passportHelper.callback(req, res, (err, user, info, status) => {
|
||||
passportHelper.callback(req, res, function (err, user, info, status) {
|
||||
if (err || !user) {
|
||||
sails.log.warn(user, err, info, status)
|
||||
if (!err && info) {
|
||||
|
@ -123,7 +123,7 @@ module.exports = {
|
|||
return negotiateError(err)
|
||||
}
|
||||
|
||||
req.login(user, (err) => {
|
||||
req.login(user, function (err) {
|
||||
if (err) {
|
||||
sails.log.warn(err)
|
||||
return negotiateError(err)
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
'use strict'
|
||||
/**
|
||||
* BooksController
|
||||
*
|
||||
|
@ -6,8 +5,6 @@
|
|||
* @help :: See https://sailsjs.com/docs/concepts/actions
|
||||
*/
|
||||
|
||||
const HttpError = require('../errors/HttpError')
|
||||
|
||||
module.exports = {
|
||||
publish: async function (req, res) {
|
||||
try {
|
||||
|
@ -15,36 +12,21 @@ module.exports = {
|
|||
const host = req.hostname
|
||||
let result
|
||||
|
||||
if (!host) throw new HttpError(400, 'Missing hostname')
|
||||
if (!body) throw new HttpError(400, 'Missing body')
|
||||
if (!body.title || !body.author || !body.version || !req.file('opds')) throw new Error('Body is not formatted correctly')
|
||||
const data = {
|
||||
source: host,
|
||||
title: body.title,
|
||||
author: body.author,
|
||||
version: body.version
|
||||
}
|
||||
if (body.isbn) data.isbn = body.isbn
|
||||
const bookExists = await Book.findOne(data)
|
||||
if (!host) throw new Error('Missing hostname')
|
||||
if (!body) throw new Error('Missing body')
|
||||
|
||||
const bookExists = await Book.findOne(body)
|
||||
|
||||
if (bookExists) {
|
||||
throw new HttpError(400, 'Version already exists')
|
||||
throw new Error('Version already exists')
|
||||
} else {
|
||||
result = await Book.create(data).fetch()
|
||||
result = await Book.create(body)
|
||||
}
|
||||
|
||||
req.file('opds').upload(sails.config.skipperConfig, async function (err, uploaded) {
|
||||
if (err) {
|
||||
await Book.destroy({ id: result.id })
|
||||
throw new HttpError(500, err.message)
|
||||
}
|
||||
await Book.update({ id: result.id }, { storage: uploaded[0].fd })
|
||||
return res.json({
|
||||
...result
|
||||
})
|
||||
})
|
||||
} catch (e) {
|
||||
if (e instanceof HttpError) return e.send(res)
|
||||
return res.status(400).json({
|
||||
error: e.message
|
||||
})
|
||||
|
@ -54,16 +36,17 @@ module.exports = {
|
|||
list: async function (req, res) {
|
||||
try {
|
||||
const body = req.allParams()
|
||||
if (!body) throw new HttpError(400, 'Missing parameters')
|
||||
const numPerPage = 50
|
||||
const page = body.page || 1
|
||||
if (!body) throw new Error('Missing parameters')
|
||||
|
||||
const books = await Book.find(body).sort('createdAt DESC').skip(page * numPerPage - numPerPage).limit(numPerPage)
|
||||
if (!books.length) throw new HttpError(404, 'No books matching those parameters were found.')
|
||||
const books = await Book.find(body)
|
||||
|
||||
if (!books.length) {
|
||||
return res.status(404).json({
|
||||
error: 'No books matching those parameters were found.'
|
||||
})
|
||||
}
|
||||
return res.json(books)
|
||||
} catch (e) {
|
||||
if (e instanceof HttpError) return e.send(res)
|
||||
return res.status(500).json({
|
||||
error: e.message
|
||||
})
|
||||
|
|
|
@ -2,7 +2,6 @@ module.exports = {
|
|||
show: function (req, res) {
|
||||
res.view('pages/temp', {
|
||||
email: req.user.email
|
||||
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,23 +11,22 @@ module.exports = {
|
|||
*/
|
||||
create: async function (req, res, next) {
|
||||
const passportHelper = await sails.helpers.passport()
|
||||
passportHelper.protocols.local.register(req.body, (err, user) => {
|
||||
if (err) {
|
||||
return res.status(500).json({
|
||||
error: err.toString() })
|
||||
}
|
||||
passportHelper.protocols.local.register(req.body, function (err, user) {
|
||||
if (err) return res.status(500).json({
|
||||
error: err.toString()
|
||||
})
|
||||
|
||||
res.json(user)
|
||||
})
|
||||
},
|
||||
|
||||
update: async function (req, res, next) {
|
||||
const passportHelper = await sails.helpers.passport()
|
||||
passportHelper.protocols.local.update(req.body, (err, user) => {
|
||||
if (err) {
|
||||
return res.status(500).json({
|
||||
passportHelper.protocols.local.update(req.body, function (err, user) {
|
||||
if (err) return res.status(500).json({
|
||||
error: err.toString()
|
||||
})
|
||||
}
|
||||
|
||||
res.json(user)
|
||||
})
|
||||
},
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
class HttpError extends Error {
|
||||
constructor (status, message, hint) {
|
||||
super(message)
|
||||
if (typeof status !== 'number') throw new Error('HttpError status must be an integer')
|
||||
this.status = status
|
||||
this.hint = hint || 'none'
|
||||
}
|
||||
send (res) {
|
||||
return res.status(this.status).json({
|
||||
error: this.message,
|
||||
hint: this.hint
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = HttpError
|
|
@ -19,12 +19,12 @@ module.exports = {
|
|||
}
|
||||
|
||||
const passport = require('passport')
|
||||
passport.serializeUser((user, next) => {
|
||||
passport.serializeUser(function (user, next) {
|
||||
next(null, user.id)
|
||||
})
|
||||
passport.deserializeUser((id, next) => {
|
||||
passport.deserializeUser(function (id, next) {
|
||||
return User.findOne({id: id})
|
||||
.then((user) => {
|
||||
.then(function (user) {
|
||||
next(null, user)
|
||||
return user
|
||||
}).catch(next)
|
||||
|
@ -72,7 +72,7 @@ function PassportHelper () {
|
|||
const strategies = sails.config.passport
|
||||
const provider = req.param('provider')
|
||||
|
||||
if (!_.has(strategies, provider)) { return res.redirect('/login') }
|
||||
if (!_.has(strategies, provider)) return res.redirect('/login')
|
||||
|
||||
passport.authenticate(provider, {})(req, res, req.next)
|
||||
}
|
||||
|
@ -89,7 +89,7 @@ function PassportHelper () {
|
|||
} else if (action === 'disconnect' && req.user) {
|
||||
this.protocols.local.disconnect(req, res, next)
|
||||
} else {
|
||||
return next(new Error('Invalid action'))
|
||||
next(new Error('Invalid action'))
|
||||
}
|
||||
} else {
|
||||
if (action === 'disconnect' && req.user) {
|
||||
|
@ -111,10 +111,10 @@ function PassportHelper () {
|
|||
}
|
||||
|
||||
// if the profile object from passport has an email, use it
|
||||
if (profile.emails && profile.emails[0]) { userAttrs.email = profile.emails[0].value }
|
||||
if (!userAttrs.email) { return next(new Error('No email available')) }
|
||||
if (profile.emails && profile.emails[0]) userAttrs.email = profile.emails[0].value
|
||||
if (!userAttrs.email) return next(new Error('No email available'))
|
||||
|
||||
const passport = await Passport.findOne({
|
||||
const pass = await Passport.findOne({
|
||||
provider,
|
||||
identifier: q.identifier.toString()
|
||||
})
|
||||
|
@ -128,24 +128,25 @@ function PassportHelper () {
|
|||
...q,
|
||||
user: user.id
|
||||
})
|
||||
next(null, user)
|
||||
} else { // existing user logging in
|
||||
if (_.has(q, 'tokens') && q.tokens !== passport.tokens) {
|
||||
passport.tokens = q.tokens
|
||||
}
|
||||
await passport.save()
|
||||
user = User.findOne(passport.user)
|
||||
next(null, user)
|
||||
}
|
||||
return next(null, user)
|
||||
} else { // user logged in and trying to add new Passport
|
||||
if (!passport) {
|
||||
await Passport.create({
|
||||
...q,
|
||||
user: req.user.id
|
||||
})
|
||||
next(null, req.user)
|
||||
} else { // no action, user already logged in and passport exists
|
||||
|
||||
next(null, user)
|
||||
}
|
||||
return next(null, req.user)
|
||||
}
|
||||
}
|
||||
this.disconnect = async function (req, res, next) {
|
||||
|
@ -161,7 +162,7 @@ function PassportHelper () {
|
|||
next(null, user)
|
||||
return user
|
||||
} catch (e) {
|
||||
return next(e)
|
||||
next(e)
|
||||
}
|
||||
}
|
||||
this.getPassport = function () {
|
||||
|
|
|
@ -15,23 +15,23 @@ module.exports = {
|
|||
id: {
|
||||
type: 'number',
|
||||
unique: true,
|
||||
autoIncrement: true
|
||||
autoIncrement: true,
|
||||
columnName: '_id'
|
||||
},
|
||||
source: { type: 'string' },
|
||||
storage: { type: 'string' },
|
||||
title: {type: 'string', required: true},
|
||||
author: {type: 'string'},
|
||||
isbn: {type: 'string'},
|
||||
version: {type: 'string'},
|
||||
isbn: { type: 'string' }
|
||||
|
||||
// ╔═╗╔╦╗╔╗ ╔═╗╔╦╗╔═╗
|
||||
// ║╣ ║║║╠╩╗║╣ ║║╚═╗
|
||||
// ╚═╝╩ ╩╚═╝╚═╝═╩╝╚═╝
|
||||
|
||||
|
||||
// ╔═╗╔═╗╔═╗╔═╗╔═╗╦╔═╗╔╦╗╦╔═╗╔╗╔╔═╗
|
||||
// ╠═╣╚═╗╚═╗║ ║║ ║╠═╣ ║ ║║ ║║║║╚═╗
|
||||
// ╩ ╩╚═╝╚═╝╚═╝╚═╝╩╩ ╩ ╩ ╩╚═╝╝╚╝╚═╝
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
}
|
||||
|
|
|
@ -28,7 +28,8 @@ module.exports = {
|
|||
id: {
|
||||
type: 'number',
|
||||
unique: true,
|
||||
autoIncrement: true
|
||||
autoIncrement: true,
|
||||
columnName: '_id'
|
||||
},
|
||||
// local, oauth2, etc
|
||||
protocol: {
|
||||
|
|
|
@ -14,7 +14,8 @@ module.exports = {
|
|||
id: {
|
||||
type: 'number',
|
||||
unique: true,
|
||||
autoIncrement: true
|
||||
autoIncrement: true,
|
||||
columnName: '_id'
|
||||
},
|
||||
email: {
|
||||
type: 'string',
|
||||
|
|
40
app.js
40
app.js
|
@ -20,31 +20,35 @@
|
|||
* https://sailsjs.com/anatomy/app.js
|
||||
*/
|
||||
|
||||
|
||||
// Ensure we're in the project directory, so cwd-relative paths work as expected
|
||||
// no matter where we actually lift from.
|
||||
// > Note: This is not required in order to lift, but it is a convenient default.
|
||||
process.chdir(__dirname)
|
||||
process.chdir(__dirname);
|
||||
|
||||
|
||||
|
||||
// Attempt to import `sails` dependency, as well as `rc` (for loading `.sailsrc` files).
|
||||
var sails
|
||||
var rc
|
||||
var sails;
|
||||
var rc;
|
||||
try {
|
||||
sails = require('sails')
|
||||
rc = require('sails/accessible/rc')
|
||||
sails = require('sails');
|
||||
rc = require('sails/accessible/rc');
|
||||
} catch (err) {
|
||||
console.error('Encountered an error when attempting to require(\'sails\'):')
|
||||
console.error(err.stack)
|
||||
console.error('--')
|
||||
console.error('To run an app using `node app.js`, you need to have Sails installed')
|
||||
console.error('locally (`./node_modules/sails`). To do that, just make sure you\'re')
|
||||
console.error('in the same directory as your app and run `npm install`.')
|
||||
console.error()
|
||||
console.error('If Sails is installed globally (i.e. `npm install -g sails`) you can')
|
||||
console.error('also run this app with `sails lift`. Running with `sails lift` will')
|
||||
console.error('not run this file (`app.js`), but it will do exactly the same thing.')
|
||||
console.error('(It even uses your app directory\'s local Sails install, if possible.)')
|
||||
return
|
||||
console.error('Encountered an error when attempting to require(\'sails\'):');
|
||||
console.error(err.stack);
|
||||
console.error('--');
|
||||
console.error('To run an app using `node app.js`, you need to have Sails installed');
|
||||
console.error('locally (`./node_modules/sails`). To do that, just make sure you\'re');
|
||||
console.error('in the same directory as your app and run `npm install`.');
|
||||
console.error();
|
||||
console.error('If Sails is installed globally (i.e. `npm install -g sails`) you can');
|
||||
console.error('also run this app with `sails lift`. Running with `sails lift` will');
|
||||
console.error('not run this file (`app.js`), but it will do exactly the same thing.');
|
||||
console.error('(It even uses your app directory\'s local Sails install, if possible.)');
|
||||
return;
|
||||
}//-•
|
||||
|
||||
|
||||
// Start server
|
||||
sails.lift(rc('sails'))
|
||||
sails.lift(rc('sails'));
|
||||
|
|
|
@ -53,9 +53,9 @@ export const setLoggedIn = (data) => (dispatch, getState) => {
|
|||
export const checkEmail = email => async (dispatch, getState) => {
|
||||
dispatch(setWorking(true))
|
||||
dispatch(clearError())
|
||||
if (/^([a-zA-Z0-9_\-.]+)@([a-zA-Z0-9_\-.]+)\.([a-zA-Z]{2,5})$/.test(email)) {
|
||||
if (/^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/.test(email)) {
|
||||
try {
|
||||
await Ajax.post({
|
||||
const res = await Ajax.post({
|
||||
url: '/auth/email_exists',
|
||||
data: {
|
||||
email
|
||||
|
@ -103,7 +103,7 @@ export const checkPassword = (email, password) => async (dispatch, getState) =>
|
|||
export const signup = (email, password) => async (dispatch, getState) => {
|
||||
dispatch(setWorking(true))
|
||||
dispatch(clearError())
|
||||
if (/^([a-zA-Z0-9_\-.]+)@([a-zA-Z0-9_\-.]+)\.([a-zA-Z]{2,5})$/.test(email)) {
|
||||
if (/^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/.test(email)) {
|
||||
try {
|
||||
await Ajax.post({
|
||||
url: '/auth/email_available',
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
import React from 'react'
|
||||
|
||||
import '../../styles/shared/underlineinput.scss'
|
||||
import STYLE from '../../styles/shared/underlineinput.scss'
|
||||
|
||||
const UnderlineInput = props => (
|
||||
<div className='underlined-input'>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
'use strict'
|
||||
|
||||
import React from 'react'
|
||||
import '../../styles/shared/carousel.scss'
|
||||
import STYLE from '../../styles/shared/carousel.scss'
|
||||
|
||||
class Carousel extends React.Component {
|
||||
constructor () {
|
||||
|
|
|
@ -13,52 +13,45 @@ class AjaxError extends Error {
|
|||
|
||||
export default class Ajax {
|
||||
static async get (opts) {
|
||||
return Ajax.ajax({
|
||||
...(opts || {}),
|
||||
method: 'get'
|
||||
})
|
||||
if (!opts) opts = {}
|
||||
opts.method = 'get'
|
||||
return Ajax.ajax(opts)
|
||||
}
|
||||
static async post (opts) {
|
||||
return Ajax.ajax({
|
||||
...(opts || {}),
|
||||
method: 'post'
|
||||
})
|
||||
if (!opts) opts = {}
|
||||
opts.method = 'post'
|
||||
return Ajax.ajax(opts)
|
||||
}
|
||||
static async put (opts) {
|
||||
return Ajax.ajax({
|
||||
...(opts || {}),
|
||||
method: 'put'
|
||||
})
|
||||
if (!opts) opts = {}
|
||||
opts.method = 'put'
|
||||
return Ajax.ajax(opts)
|
||||
}
|
||||
static async patch (opts) {
|
||||
return Ajax.ajax({
|
||||
...(opts || {}),
|
||||
method: 'patch'
|
||||
})
|
||||
if (!opts) opts = {}
|
||||
opts.method = 'patch'
|
||||
return Ajax.ajax(opts)
|
||||
}
|
||||
static async delete (opts) {
|
||||
return Ajax.ajax({
|
||||
...(opts || {}),
|
||||
method: 'delete'
|
||||
})
|
||||
if (!opts) opts = {}
|
||||
opts.method = 'delete'
|
||||
return Ajax.ajax(opts)
|
||||
}
|
||||
static async head (opts) {
|
||||
return Ajax.ajax({
|
||||
...(opts || {}),
|
||||
method: 'head'
|
||||
})
|
||||
if (!opts) opts = {}
|
||||
opts.method = 'head'
|
||||
return Ajax.ajax(opts)
|
||||
}
|
||||
static async options (opts) {
|
||||
return Ajax.ajax({
|
||||
...(opts || {}),
|
||||
method: 'options'
|
||||
})
|
||||
if (!opts) opts = {}
|
||||
opts.method = 'options'
|
||||
return Ajax.ajax(opts)
|
||||
}
|
||||
static ajax (opts) {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!opts) { reject(new Error('Missing required options parameter.')) }
|
||||
if (!opts) reject(new Error('Missing required options parameter.'))
|
||||
if (opts.method) {
|
||||
if (!['get', 'post', 'put', 'patch', 'delete', 'head', 'options'].includes(opts.method.toLowerCase())) { reject(new Error('opts.method must be one of: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS.')) }
|
||||
if (!['get', 'post', 'put', 'patch', 'delete', 'head', 'options'].includes(opts.method.toLowerCase())) reject(new Error('opts.method must be one of: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS.'))
|
||||
opts.method = opts.method.toUpperCase()
|
||||
}
|
||||
|
||||
|
@ -81,7 +74,7 @@ export default class Ajax {
|
|||
}
|
||||
|
||||
xhr.onload = () => {
|
||||
if (xhr.status !== 200) { return xhr.onerror() }
|
||||
if (xhr.status !== 200) return xhr.onerror()
|
||||
var data = xhr.response
|
||||
resolve({
|
||||
data,
|
||||
|
@ -117,9 +110,9 @@ export default class Ajax {
|
|||
|
||||
xhr.open(opts.method || 'GET', opts.url + qs || window.location.href)
|
||||
if (opts.headers) {
|
||||
for (let key in opts.headers) { xhr.setRequestHeader(key, opts.headers[key]) }
|
||||
for (let key in opts.headers) xhr.setRequestHeader(key, opts.headers[key])
|
||||
}
|
||||
if (ajaxcfg.access_token && !(opts.headers || {}).Authorization) { xhr.setRequestHeader('Authorization', 'Bearer ' + ajaxcfg.access_token) }
|
||||
if (ajaxcfg.access_token && !(opts.headers || {}).Authorization) xhr.setRequestHeader('Authorization', 'Bearer ' + ajaxcfg.access_token)
|
||||
xhr.send(fd)
|
||||
})
|
||||
}
|
||||
|
@ -139,8 +132,8 @@ export default class Ajax {
|
|||
}
|
||||
// try original request
|
||||
xhr.onload = () => {
|
||||
if (xhr.status !== 200) { return xhr.onerror() }
|
||||
if (ajaxcfg.refresh) { ajaxcfg.refresh(xhr.response) }
|
||||
if (xhr.status !== 200) return xhr.onerror()
|
||||
if (ajaxcfg.refresh) ajaxcfg.refresh(xhr.response)
|
||||
var json = JSON.parse(xhr.response)
|
||||
ajaxcfg.access_token = json.access_token
|
||||
ajaxcfg.refresh_token = json.refresh_token
|
||||
|
@ -156,11 +149,11 @@ export default class Ajax {
|
|||
})
|
||||
}
|
||||
static setTokenData (tokens) {
|
||||
if (!tokens) { throw new Error('Missing tokens.') }
|
||||
if (!tokens.access_token && !tokens.refresh_token && !tokens.refresh_url) { throw new Error('Missing at least one of: access_token, refresh_token, refresh_url.') }
|
||||
if (tokens.access_token) { ajaxcfg.access_token = tokens.access_token }
|
||||
if (tokens.refresh_token) { ajaxcfg.refresh_token = tokens.refresh_token }
|
||||
if (tokens.refresh_url) { ajaxcfg.refresh_url = tokens.refresh_url }
|
||||
if (!tokens) throw new Error('Missing tokens.')
|
||||
if (!tokens.access_token && !tokens.refresh_token && !tokens.refresh_url) throw new Error('Missing at least one of: access_token, refresh_token, refresh_url.')
|
||||
if (tokens.access_token) ajaxcfg.access_token = tokens.access_token
|
||||
if (tokens.refresh_token) ajaxcfg.refresh_token = tokens.refresh_token
|
||||
if (tokens.refresh_url) ajaxcfg.refresh_url = tokens.refresh_url
|
||||
return true
|
||||
}
|
||||
static onRefresh (func) {
|
||||
|
|
|
@ -8,7 +8,7 @@ import UnderlineInput from './components/UnderlineInput'
|
|||
import reducer from './reducers/login'
|
||||
import {setEmail, setPassword, setCarousel, checkEmail, checkPassword, signup} from './actions/login'
|
||||
|
||||
import '../styles/login.scss'
|
||||
import STYLE from '../styles/login.scss'
|
||||
|
||||
class App extends React.Component {
|
||||
constructor () {
|
||||
|
|
|
@ -19,6 +19,7 @@ module.exports.blueprints = {
|
|||
|
||||
// actions: false,
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* Automatically expose RESTful routes for your models? *
|
||||
|
@ -27,6 +28,7 @@ module.exports.blueprints = {
|
|||
|
||||
// rest: true,
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* Automatically expose CRUD "shortcut" routes to GET requests? *
|
||||
|
@ -36,4 +38,4 @@ module.exports.blueprints = {
|
|||
|
||||
// shortcuts: true,
|
||||
|
||||
}
|
||||
};
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
*/
|
||||
|
||||
module.exports.bootstrap = async function(done) {
|
||||
|
||||
// By convention, this is a good place to set up fake data during development.
|
||||
//
|
||||
// For example:
|
||||
|
@ -28,5 +29,6 @@ module.exports.bootstrap = async function (done) {
|
|||
|
||||
// Don't forget to trigger `done()` when this bootstrap function's logic is finished.
|
||||
// (otherwise your server will never lift, since it's waiting on the bootstrap)
|
||||
return done()
|
||||
}
|
||||
return done();
|
||||
|
||||
};
|
||||
|
|
|
@ -20,4 +20,4 @@ module.exports.custom = {
|
|||
// stripeSecret: 'sk_test_Zzd814nldl91104qor5911gjald',
|
||||
// …
|
||||
|
||||
}
|
||||
};
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
|
||||
module.exports.datastores = {
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* Your app's default datastore. *
|
||||
|
@ -50,6 +51,7 @@ module.exports.datastores = {
|
|||
// adapter: 'sails-mysql',
|
||||
// url: 'mysql://user:password@host:port/database',
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -59,15 +59,15 @@ module.exports = {
|
|||
// --------------------------------------------------------------------------
|
||||
|
||||
/****************************************************************************
|
||||
* *
|
||||
* *
|
||||
* More adapter-specific options *
|
||||
* *
|
||||
* *
|
||||
* > For example, for some hosted PostgreSQL providers (like Heroku), the *
|
||||
* > extra `ssl: true` option is mandatory and must be provided. *
|
||||
* *
|
||||
* More info: *
|
||||
* https://sailsjs.com/config/datastores *
|
||||
* *
|
||||
* *
|
||||
* More info: *
|
||||
* https://sailsjs.com/config/datastores *
|
||||
* *
|
||||
****************************************************************************/
|
||||
// ssl: true,
|
||||
|
||||
|
|
|
@ -57,19 +57,17 @@ module.exports = {
|
|||
// sails_datastores__default__url=mysql://admin:myc00lpAssw2D@db.example.com:3306/my_prod_db
|
||||
// ```
|
||||
// --------------------------------------------------------------------------
|
||||
adapter: 'sails-postgresql',
|
||||
url: sails.config.DATASTORE_URL
|
||||
|
||||
/****************************************************************************
|
||||
* *
|
||||
* *
|
||||
* More adapter-specific options *
|
||||
* *
|
||||
* *
|
||||
* > For example, for some hosted PostgreSQL providers (like Heroku), the *
|
||||
* > extra `ssl: true` option is mandatory and must be provided. *
|
||||
* *
|
||||
* More info: *
|
||||
* https://sailsjs.com/config/datastores *
|
||||
* *
|
||||
* *
|
||||
* More info: *
|
||||
* https://sailsjs.com/config/datastores *
|
||||
* *
|
||||
****************************************************************************/
|
||||
// ssl: true,
|
||||
|
||||
|
@ -240,8 +238,8 @@ module.exports = {
|
|||
* *
|
||||
***************************************************************************/
|
||||
onlyAllowOrigins: [
|
||||
'https://ec2-18-219-76-43.us-east-2.compute.amazonaws.com'
|
||||
]
|
||||
'https://ec2-18-219-76-43.us-east-2.compute.amazonaws.com',
|
||||
],
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
|
|
|
@ -47,6 +47,6 @@ module.exports.globals = {
|
|||
* *
|
||||
****************************************************************************/
|
||||
|
||||
sails: true
|
||||
sails: true,
|
||||
|
||||
}
|
||||
};
|
||||
|
|
|
@ -63,10 +63,10 @@ module.exports.http = {
|
|||
* *
|
||||
***************************************************************************/
|
||||
|
||||
bodyParser: (function _configureBodyParser () {
|
||||
var skipper = require('skipper')
|
||||
var middlewareFn = skipper({ strict: true })
|
||||
return middlewareFn
|
||||
})()
|
||||
// bodyParser: (function _configureBodyParser(){
|
||||
// var skipper = require('skipper');
|
||||
// var middlewareFn = skipper({ strict: true });
|
||||
// return middlewareFn;
|
||||
// })(),
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ module.exports.i18n = {
|
|||
* *
|
||||
***************************************************************************/
|
||||
|
||||
locales: ['en', 'es', 'fr', 'de']
|
||||
locales: ['en', 'es', 'fr', 'de'],
|
||||
|
||||
/****************************************************************************
|
||||
* *
|
||||
|
@ -42,4 +42,4 @@ module.exports.i18n = {
|
|||
|
||||
// localesDirectory: 'config/locales'
|
||||
|
||||
}
|
||||
};
|
||||
|
|
|
@ -26,4 +26,4 @@ module.exports.log = {
|
|||
|
||||
// level: 'info'
|
||||
|
||||
}
|
||||
};
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
|
||||
module.exports.models = {
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* Whether the `.create()` and `.update()` model methods should ignore *
|
||||
|
@ -36,6 +37,7 @@ module.exports.models = {
|
|||
|
||||
// schema: true,
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* How and whether Sails will attempt to automatically rebuild the *
|
||||
|
@ -53,6 +55,7 @@ module.exports.models = {
|
|||
|
||||
// migrate: 'alter',
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* Base attributes that are included in all of your models by default. *
|
||||
|
@ -66,9 +69,9 @@ module.exports.models = {
|
|||
***************************************************************************/
|
||||
|
||||
attributes: {
|
||||
createdAt: { type: 'number', autoCreatedAt: true },
|
||||
updatedAt: { type: 'number', autoUpdatedAt: true },
|
||||
id: { type: 'number', autoIncrement: true }
|
||||
createdAt: { type: 'number', autoCreatedAt: true, },
|
||||
updatedAt: { type: 'number', autoUpdatedAt: true, },
|
||||
id: { type: 'number', autoIncrement: true, },
|
||||
//--------------------------------------------------------------------------
|
||||
// /\ Using MongoDB?
|
||||
// || Replace `id` above with this instead:
|
||||
|
@ -82,6 +85,7 @@ module.exports.models = {
|
|||
//--------------------------------------------------------------------------
|
||||
},
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* *
|
||||
* The set of DEKs (data encryption keys) for at-rest encryption. *
|
||||
|
@ -100,6 +104,7 @@ module.exports.models = {
|
|||
default: 'nuF29j3StsGhRTut9dIrCxCNyYegcwH30FxnZ3kkdiA='
|
||||
},
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* Whether or not implicit records for associations should be cleaned up *
|
||||
|
@ -115,4 +120,5 @@ module.exports.models = {
|
|||
|
||||
cascadeOnDestroy: true
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -24,7 +24,7 @@ module.exports.protocols = {
|
|||
const user = await User.findOne({
|
||||
email: identifier
|
||||
})
|
||||
if (!user) { throw new Error('an account with that email was not found') }
|
||||
if (!user) throw new Error('an account with that email was not found')
|
||||
|
||||
const passport = await Passport.findOne({
|
||||
protocol: 'local',
|
||||
|
@ -32,7 +32,7 @@ module.exports.protocols = {
|
|||
})
|
||||
if (passport) {
|
||||
const res = await Passport.validatePassword(password, passport)
|
||||
if (!res) { throw new Error('incorrect password') }
|
||||
if (!res) throw new Error('incorrect password')
|
||||
return next(null, user)
|
||||
} else {
|
||||
throw new Error('that account does not have password login enabled')
|
||||
|
@ -45,7 +45,7 @@ module.exports.protocols = {
|
|||
try {
|
||||
const token = generateToken()
|
||||
const password = user.password
|
||||
if (!password.length) { throw new Error('password cannot be blank') }
|
||||
if (!password.length) throw new Error('password cannot be blank')
|
||||
delete user.password
|
||||
|
||||
const newUser = await User.create(user).fetch()
|
||||
|
@ -93,7 +93,7 @@ module.exports.protocols = {
|
|||
}
|
||||
}
|
||||
|
||||
const EMAIL_REGEX = /^(([^<>()[\].,;:\s@"]+(\.[^<>()[\].,;:\s@"]+)*)|(".+"))@(([^<>()[\].,;:\s@"]+\.)+[^<>()[\].,;:\s@"]{2,})$/i
|
||||
const EMAIL_REGEX = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i
|
||||
|
||||
function validateEmail (email) {
|
||||
return EMAIL_REGEX.test(email)
|
||||
|
|
|
@ -66,14 +66,17 @@ module.exports.routes = {
|
|||
'POST /api/publish': 'BooksController.publish',
|
||||
|
||||
'GET /api/books': 'BooksController.list',
|
||||
'GET /api/me': 'UserController.me'
|
||||
'GET /api/me': 'UserController.me',
|
||||
|
||||
|
||||
// ╦ ╦╔═╗╔╗ ╦ ╦╔═╗╔═╗╦╔═╔═╗
|
||||
// ║║║║╣ ╠╩╗╠═╣║ ║║ ║╠╩╗╚═╗
|
||||
// ╚╩╝╚═╝╚═╝╩ ╩╚═╝╚═╝╩ ╩╚═╝
|
||||
|
||||
|
||||
// ╔╦╗╦╔═╗╔═╗
|
||||
// ║║║║╚═╗║
|
||||
// ╩ ╩╩╚═╝╚═╝
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -34,6 +34,7 @@ module.exports.security = {
|
|||
// allowCredentials: false,
|
||||
// },
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* *
|
||||
* By default, Sails' built-in CSRF protection is disabled to facilitate *
|
||||
|
@ -50,4 +51,4 @@ module.exports.security = {
|
|||
|
||||
// csrf: false
|
||||
|
||||
}
|
||||
};
|
||||
|
|
|
@ -18,7 +18,8 @@ module.exports.session = {
|
|||
* of your users, forcing them to log in again. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
secret: 'b7f0374251c4d79227067c286fe97ea5'
|
||||
secret: 'b7f0374251c4d79227067c286fe97ea5',
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
|
@ -35,4 +36,4 @@ module.exports.session = {
|
|||
// return !!req.path.match(req._sails.LOOKS_LIKE_ASSET_RX);
|
||||
// },
|
||||
|
||||
}
|
||||
};
|
||||
|
|
|
@ -29,6 +29,7 @@ module.exports.sockets = {
|
|||
|
||||
// transports: [ 'websocket' ],
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* `beforeConnect` *
|
||||
|
@ -49,6 +50,7 @@ module.exports.sockets = {
|
|||
//
|
||||
// },
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* `afterDisconnect` *
|
||||
|
@ -66,6 +68,7 @@ module.exports.sockets = {
|
|||
//
|
||||
// },
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* Whether to expose a 'GET /__getcookie' route that sets an HTTP-only *
|
||||
|
@ -75,4 +78,5 @@ module.exports.sockets = {
|
|||
|
||||
// grant3rdPartyCookie: true,
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -38,4 +38,4 @@ module.exports.views = {
|
|||
|
||||
layout: 'layouts/layout'
|
||||
|
||||
}
|
||||
};
|
||||
|
|
22
package.json
22
package.json
|
@ -11,7 +11,6 @@
|
|||
"async": "2.0.1",
|
||||
"base64url": "^3.0.0",
|
||||
"bcrypt": "^3.0.2",
|
||||
"eslint-plugin-react": "^7.11.1",
|
||||
"express-rate-limit": "^3.2.1",
|
||||
"forever": "^0.15.3",
|
||||
"grunt": "^1.0.3",
|
||||
|
@ -24,26 +23,23 @@
|
|||
"sails": "^1.0.2",
|
||||
"sails-hook-grunt": "^3.0.2",
|
||||
"sails-hook-orm": "^2.1.1",
|
||||
"sails-hook-sockets": "^1.4.0",
|
||||
"sails-postgresql": "^1.0.1"
|
||||
"sails-hook-sockets": "^1.4.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@sailshq/eslint": "^4.19.3",
|
||||
"@babel/core": "^7.1.2",
|
||||
"@babel/plugin-proposal-object-rest-spread": "^7.0.0",
|
||||
"@babel/polyfill": "^7.0.0",
|
||||
"@babel/preset-env": "^7.1.0",
|
||||
"@babel/preset-react": "^7.0.0",
|
||||
"babel-eslint": "^10.0.1",
|
||||
"babel-loader": "^8.0.4",
|
||||
"css-loader": "^1.0.1",
|
||||
"eslint": "^5.8.0",
|
||||
"html-webpack-plugin": "^3.2.0",
|
||||
"mini-css-extract-plugin": "^0.4.4",
|
||||
"node-sass": "^4.9.4",
|
||||
"npm-run-all": "^4.1.3",
|
||||
"rimraf": "^2.6.2",
|
||||
"sass-loader": "^7.1.0",
|
||||
"standard": "^12.0.1",
|
||||
"style-loader": "^0.23.1",
|
||||
"webpack": "^4.23.1",
|
||||
"webpack-cli": "^3.1.2",
|
||||
|
@ -62,9 +58,8 @@
|
|||
"forever": "sudo NODE_ENV='production' ./node_modules/.bin/forever start app.js",
|
||||
"stop": "sudo ./node_modules/.bin/forever stopall",
|
||||
"test": "npm run lint && npm run custom-tests && echo 'Done.'",
|
||||
"lint": "standard && echo '✔ Your .js files look good.'",
|
||||
"debug": "node --inspect app.js",
|
||||
"custom-tests": "echo 'Nothing yet'"
|
||||
"lint": "eslint . --max-warnings=0 --report-unused-disable-directives && echo '✔ Your .js files look good.'",
|
||||
"debug": "node --inspect app.js"
|
||||
},
|
||||
"main": "app.js",
|
||||
"repository": {
|
||||
|
@ -78,12 +73,7 @@
|
|||
},
|
||||
"standard": {
|
||||
"globals": [
|
||||
"sails",
|
||||
"User",
|
||||
"Book",
|
||||
"Passport",
|
||||
"_"
|
||||
],
|
||||
"parser": "babel-eslint"
|
||||
"sails"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
*
|
||||
*/
|
||||
module.exports = function(grunt) {
|
||||
|
||||
grunt.config.set('babel', {
|
||||
dist: {
|
||||
options: {
|
||||
|
@ -24,7 +25,7 @@ module.exports = function (grunt) {
|
|||
}
|
||||
]
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// This Grunt plugin is part of the default asset pipeline in Sails,
|
||||
|
@ -49,4 +50,5 @@ module.exports = function (grunt) {
|
|||
// grunt.loadNpmTasks('grunt-babel');
|
||||
// ```
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
*
|
||||
*/
|
||||
module.exports = function(grunt) {
|
||||
|
||||
grunt.config.set('clean', {
|
||||
dev: ['.tmp/public/**'],
|
||||
build: ['www'],
|
||||
|
@ -22,7 +23,7 @@ module.exports = function (grunt) {
|
|||
'www/templates',
|
||||
'www/dependencies'
|
||||
]
|
||||
})
|
||||
});
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// This Grunt plugin is part of the default asset pipeline in Sails,
|
||||
|
@ -47,4 +48,5 @@ module.exports = function (grunt) {
|
|||
// grunt.loadNpmTasks('grunt-contrib-clean');
|
||||
// ```
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
*
|
||||
*/
|
||||
module.exports = function(grunt) {
|
||||
|
||||
grunt.config.set('coffee', {
|
||||
dev: {
|
||||
options: {
|
||||
|
@ -26,7 +27,7 @@ module.exports = function (grunt) {
|
|||
ext: '.js'
|
||||
}]
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// This Grunt plugin is part of the default asset pipeline in Sails,
|
||||
|
@ -51,4 +52,5 @@ module.exports = function (grunt) {
|
|||
// grunt.loadNpmTasks('grunt-contrib-coffee');
|
||||
// ```
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
*
|
||||
*/
|
||||
module.exports = function(grunt) {
|
||||
|
||||
grunt.config.set('concat', {
|
||||
js: {
|
||||
src: require('../pipeline').jsFilesToInject,
|
||||
|
@ -20,7 +21,7 @@ module.exports = function (grunt) {
|
|||
src: require('../pipeline').cssFilesToInject,
|
||||
dest: '.tmp/public/concat/production.css'
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// This Grunt plugin is part of the default asset pipeline in Sails,
|
||||
|
@ -45,4 +46,5 @@ module.exports = function (grunt) {
|
|||
// grunt.loadNpmTasks('grunt-contrib-concat');
|
||||
// ```
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
*
|
||||
*/
|
||||
module.exports = function(grunt) {
|
||||
|
||||
grunt.config.set('copy', {
|
||||
dev: {
|
||||
files: [{
|
||||
|
@ -34,8 +35,8 @@ module.exports = function (grunt) {
|
|||
src: ['**/*'],
|
||||
dest: '.tmp/public/dist'
|
||||
}]
|
||||
}
|
||||
})
|
||||
},
|
||||
});
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// This Grunt plugin is part of the default asset pipeline in Sails,
|
||||
|
@ -60,4 +61,5 @@ module.exports = function (grunt) {
|
|||
// grunt.loadNpmTasks('grunt-contrib-copy');
|
||||
// ```
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -12,12 +12,13 @@
|
|||
*
|
||||
*/
|
||||
module.exports = function(grunt) {
|
||||
|
||||
grunt.config.set('cssmin', {
|
||||
dist: {
|
||||
src: ['.tmp/public/concat/production.css'],
|
||||
dest: '.tmp/public/min/production.min.css'
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// This Grunt plugin is part of the default asset pipeline in Sails,
|
||||
|
@ -42,4 +43,5 @@ module.exports = function (grunt) {
|
|||
// grunt.loadNpmTasks('grunt-contrib-cssmin');
|
||||
// ```
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
*
|
||||
*/
|
||||
module.exports = function(grunt) {
|
||||
|
||||
grunt.config.set('hash', {
|
||||
options: {
|
||||
mapping: '',
|
||||
|
@ -19,9 +20,9 @@ module.exports = function (grunt) {
|
|||
hashLength: 8,
|
||||
hashFunction: function(source, encoding){
|
||||
if (!source || !encoding) {
|
||||
throw new Error('Consistency violation: Cannot compute unique hash for production .css/.js cache-busting suffix, because `source` and/or `encoding` are falsey-- but they should be truthy strings! Here they are, respectively:\nsource: ' + require('util').inspect(source, { depth: null }) + '\nencoding: ' + require('util').inspect(encoding, { depth: null }))
|
||||
throw new Error('Consistency violation: Cannot compute unique hash for production .css/.js cache-busting suffix, because `source` and/or `encoding` are falsey-- but they should be truthy strings! Here they are, respectively:\nsource: '+require('util').inspect(source, {depth:null})+'\nencoding: '+require('util').inspect(encoding, {depth:null}));
|
||||
}
|
||||
return require('crypto').createHash('sha1').update(source, encoding).digest('hex')
|
||||
return require('crypto').createHash('sha1').update(source, encoding).digest('hex');
|
||||
}
|
||||
},
|
||||
js: {
|
||||
|
@ -32,7 +33,7 @@ module.exports = function (grunt) {
|
|||
src: '.tmp/public/min/*.css',
|
||||
dest: '.tmp/public/hash/'
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// This Grunt plugin is part of the default asset pipeline in Sails,
|
||||
|
@ -57,4 +58,5 @@ module.exports = function (grunt) {
|
|||
// grunt.loadNpmTasks('grunt-hash');
|
||||
// ```
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
*/
|
||||
|
||||
module.exports = function(grunt) {
|
||||
|
||||
grunt.config.set('jst', {
|
||||
dev: {
|
||||
|
||||
|
@ -25,13 +26,14 @@ module.exports = function (grunt) {
|
|||
// default interpolation. If you want to parse templates with the default _.template behavior
|
||||
// (i.e. using <div><%= this.id %></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
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// This Grunt plugin is part of the default asset pipeline in Sails,
|
||||
|
@ -56,4 +58,5 @@ module.exports = function (grunt) {
|
|||
// grunt.loadNpmTasks('grunt-contrib-jst');
|
||||
// ```
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
*
|
||||
*/
|
||||
module.exports = function(grunt) {
|
||||
|
||||
grunt.config.set('less', {
|
||||
dev: {
|
||||
files: [{
|
||||
|
@ -20,7 +21,7 @@ module.exports = function (grunt) {
|
|||
ext: '.css'
|
||||
}]
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// This Grunt plugin is part of the default asset pipeline in Sails,
|
||||
|
@ -45,4 +46,5 @@ module.exports = function (grunt) {
|
|||
// grunt.loadNpmTasks('grunt-contrib-less');
|
||||
// ```
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -12,8 +12,10 @@
|
|||
*
|
||||
*/
|
||||
module.exports = function(grunt) {
|
||||
|
||||
grunt.config.set('sails-linker', {
|
||||
|
||||
|
||||
// ╦╔═╗╦ ╦╔═╗╔═╗╔═╗╦═╗╦╔═╗╔╦╗
|
||||
// ║╠═╣╚╗╔╝╠═╣╚═╗║ ╠╦╝║╠═╝ ║
|
||||
// ╚╝╩ ╩ ╚╝ ╩ ╩╚═╝╚═╝╩╚═╩╩ ╩
|
||||
|
@ -39,7 +41,7 @@ module.exports = function (grunt) {
|
|||
startTag: '<!--SCRIPTS-->',
|
||||
endTag: '<!--SCRIPTS END-->',
|
||||
fileTmpl: '<script src="%s"></script>',
|
||||
appRoot: '.tmp/public'
|
||||
appRoot: '.tmp/public',
|
||||
// relative: true
|
||||
// ^^ Uncomment this if compiling assets for use in PhoneGap, CDN, etc.
|
||||
// (but be note that this can break custom font URLs)
|
||||
|
@ -70,7 +72,7 @@ module.exports = function (grunt) {
|
|||
startTag: '<!--SCRIPTS-->',
|
||||
endTag: '<!--SCRIPTS END-->',
|
||||
fileTmpl: '<script src="%s"></script>',
|
||||
appRoot: '.tmp/public'
|
||||
appRoot: '.tmp/public',
|
||||
// relative: true
|
||||
// ^^ Uncomment this if compiling assets for use in PhoneGap, CDN, etc.
|
||||
// (but be note that this can break custom font URLs)
|
||||
|
@ -82,6 +84,7 @@ module.exports = function (grunt) {
|
|||
}
|
||||
},
|
||||
|
||||
|
||||
// ╔═╗╔╦╗╦ ╦╦ ╔═╗╔═╗╦ ╦╔═╗╔═╗╔╦╗╔═╗
|
||||
// ╚═╗ ║ ╚╦╝║ ║╣ ╚═╗╠═╣║╣ ║╣ ║ ╚═╗
|
||||
// ╚═╝ ╩ ╩ ╩═╝╚═╝╚═╝╩ ╩╚═╝╚═╝ ╩ ╚═╝
|
||||
|
@ -108,7 +111,7 @@ module.exports = function (grunt) {
|
|||
startTag: '<!--STYLES-->',
|
||||
endTag: '<!--STYLES END-->',
|
||||
fileTmpl: '<link rel="stylesheet" href="%s">',
|
||||
appRoot: '.tmp/public'
|
||||
appRoot: '.tmp/public',
|
||||
// relative: true
|
||||
// ^^ Uncomment this if compiling assets for use in PhoneGap, CDN, etc.
|
||||
// (but be note that this can break custom font URLs)
|
||||
|
@ -140,7 +143,7 @@ module.exports = function (grunt) {
|
|||
startTag: '<!--STYLES-->',
|
||||
endTag: '<!--STYLES END-->',
|
||||
fileTmpl: '<link rel="stylesheet" href="%s">',
|
||||
appRoot: '.tmp/public'
|
||||
appRoot: '.tmp/public',
|
||||
// relative: true
|
||||
// ^^ Uncomment this if compiling assets for use in PhoneGap, CDN, etc.
|
||||
// (but be note that this can break custom font URLs)
|
||||
|
@ -152,6 +155,7 @@ module.exports = function (grunt) {
|
|||
}
|
||||
},
|
||||
|
||||
|
||||
// ╔═╗╦═╗╔═╗╔═╗╔═╗╔╦╗╔═╗╦╦ ╔═╗╔╦╗ ╦ ╦╔╦╗╔╦╗╦ ╔╦╗╔═╗╔╦╗╔═╗╦ ╔═╗╔╦╗╔═╗╔═╗
|
||||
// ╠═╝╠╦╝║╣ ║ ║ ║║║║╠═╝║║ ║╣ ║║ ╠═╣ ║ ║║║║ ║ ║╣ ║║║╠═╝║ ╠═╣ ║ ║╣ ╚═╗
|
||||
// ╩ ╩╚═╚═╝╚═╝╚═╝╩ ╩╩ ╩╩═╝╚═╝═╩╝ ╩ ╩ ╩ ╩ ╩╩═╝ ╩ ╚═╝╩ ╩╩ ╩═╝╩ ╩ ╩ ╚═╝╚═╝
|
||||
|
@ -176,7 +180,7 @@ module.exports = function (grunt) {
|
|||
startTag: '<!--TEMPLATES-->',
|
||||
endTag: '<!--TEMPLATES END-->',
|
||||
fileTmpl: '<script type="text/javascript" src="%s"></script>',
|
||||
appRoot: '.tmp/public'
|
||||
appRoot: '.tmp/public',
|
||||
// relative: true
|
||||
// ^^ Uncomment this if compiling assets for use in PhoneGap, CDN, etc.
|
||||
// (but be note that this can break custom font URLs)
|
||||
|
@ -186,9 +190,9 @@ module.exports = function (grunt) {
|
|||
'views/**/*.html': ['.tmp/public/jst.js'],
|
||||
'views/**/*.ejs': ['.tmp/public/jst.js']
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
})// </ grunt.config.set() >
|
||||
});//</ grunt.config.set() >
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// This Grunt plugin is part of the default asset pipeline in Sails,
|
||||
|
@ -213,4 +217,5 @@ module.exports = function (grunt) {
|
|||
// grunt.loadNpmTasks('grunt-sails-linker');
|
||||
// ```
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
*
|
||||
*/
|
||||
module.exports = function(grunt) {
|
||||
|
||||
grunt.config.set('sync', {
|
||||
dev: {
|
||||
files: [{
|
||||
|
@ -19,7 +20,7 @@ module.exports = function (grunt) {
|
|||
dest: '.tmp/public'
|
||||
}]
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// This Grunt plugin is part of the default asset pipeline in Sails,
|
||||
|
@ -44,4 +45,5 @@ module.exports = function (grunt) {
|
|||
// grunt.loadNpmTasks('grunt-sync');
|
||||
// ```
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
*
|
||||
*/
|
||||
module.exports = function(grunt) {
|
||||
|
||||
grunt.config.set('uglify', {
|
||||
dist: {
|
||||
src: ['.tmp/public/concat/production.js'],
|
||||
|
@ -23,7 +24,7 @@ module.exports = function (grunt) {
|
|||
'Promise',
|
||||
'File',
|
||||
'Location',
|
||||
'RttcRefPlaceholder'
|
||||
'RttcRefPlaceholder',
|
||||
],
|
||||
keep_fnames: true//eslint-disable-line
|
||||
},
|
||||
|
@ -31,7 +32,7 @@ module.exports = function (grunt) {
|
|||
keep_fnames: true//eslint-disable-line
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// This Grunt plugin is part of the default asset pipeline in Sails,
|
||||
|
@ -56,4 +57,6 @@ module.exports = function (grunt) {
|
|||
// grunt.loadNpmTasks('grunt-contrib-uglify');
|
||||
// ```
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
*
|
||||
*/
|
||||
module.exports = function(grunt) {
|
||||
|
||||
grunt.config.set('watch', {
|
||||
assets: {
|
||||
|
||||
|
@ -26,7 +27,7 @@ module.exports = function (grunt) {
|
|||
'linkAssets'
|
||||
]
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
// This Grunt plugin is part of the default asset pipeline in Sails,
|
||||
|
@ -51,4 +52,5 @@ module.exports = function (grunt) {
|
|||
// grunt.loadNpmTasks('grunt-contrib-watch');
|
||||
// ```
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
* https://sailsjs.com/anatomy/tasks/pipeline.js
|
||||
*/
|
||||
|
||||
|
||||
|
||||
// ██████╗ ██╗ █████╗ ██╗███╗ ██╗ ██████╗███████╗███████╗
|
||||
// ██╔══██╗██║ ██╔══██╗██║████╗ ██║ ██╔════╝██╔════╝██╔════╝
|
||||
// ██████╔╝██║ ███████║██║██╔██╗ ██║ ██║ ███████╗███████╗
|
||||
|
@ -38,7 +40,8 @@ var cssFilesToInject = [
|
|||
// in no particular order. To customize the ordering, add additional
|
||||
// items here, _above_ this one.
|
||||
'styles/**/*.css'
|
||||
]
|
||||
];
|
||||
|
||||
|
||||
// ██████╗██╗ ██╗███████╗███╗ ██╗████████╗ ███████╗██╗██████╗ ███████╗
|
||||
// ██╔════╝██║ ██║██╔════╝████╗ ██║╚══██╔══╝ ██╔════╝██║██╔══██╗██╔════╝
|
||||
|
@ -70,7 +73,8 @@ var jsFilesToInject = [
|
|||
// in no particular order. To customize the ordering, add additional items
|
||||
// here, _above_ this one.
|
||||
'js/**/*.js'
|
||||
]
|
||||
];
|
||||
|
||||
|
||||
// ██████╗██╗ ██╗███████╗███╗ ██╗████████╗ ███████╗██╗██████╗ ███████╗
|
||||
// ██╔════╝██║ ██║██╔════╝████╗ ██║╚══██╔══╝ ██╔════╝██║██╔══██╗██╔════╝
|
||||
|
@ -99,7 +103,9 @@ var jsFilesToInject = [
|
|||
//
|
||||
var templateFilesToInject = [
|
||||
'templates/**/*.html'
|
||||
]
|
||||
];
|
||||
|
||||
|
||||
|
||||
// ███╗ ███╗██╗███████╗ ██████╗ ███████╗███████╗████████╗██╗ ██╗██████╗
|
||||
// ████╗ ████║██║██╔════╝██╔════╝ ██╔════╝██╔════╝╚══██╔══╝██║ ██║██╔══██╗
|
||||
|
@ -113,7 +119,7 @@ var templateFilesToInject = [
|
|||
// the code below, unless you are modifying the default asset pipeline.**
|
||||
|
||||
// Default path for public folder (see documentation on sailsjs.com for more information)
|
||||
var tmpPath = '.tmp/public/'
|
||||
var tmpPath = '.tmp/public/';
|
||||
|
||||
// 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
|
||||
|
@ -121,21 +127,21 @@ var tmpPath = '.tmp/public/'
|
|||
module.exports.cssFilesToInject = cssFilesToInject.map((cssPath)=>{
|
||||
// If we're ignoring the file, make sure the ! is at the beginning of the path
|
||||
if (cssPath[0] === '!') {
|
||||
return require('path').join('!' + tmpPath, cssPath.substr(1))
|
||||
return require('path').join('!' + tmpPath, cssPath.substr(1));
|
||||
}
|
||||
return require('path').join(tmpPath, cssPath)
|
||||
})
|
||||
return require('path').join(tmpPath, cssPath);
|
||||
});
|
||||
module.exports.jsFilesToInject = jsFilesToInject.map((jsPath)=>{
|
||||
// If we're ignoring the file, make sure the ! is at the beginning of the path
|
||||
if (jsPath[0] === '!') {
|
||||
return require('path').join('!' + tmpPath, jsPath.substr(1))
|
||||
return require('path').join('!' + tmpPath, jsPath.substr(1));
|
||||
}
|
||||
return require('path').join(tmpPath, jsPath)
|
||||
})
|
||||
return require('path').join(tmpPath, jsPath);
|
||||
});
|
||||
module.exports.templateFilesToInject = templateFilesToInject.map((tplPath)=>{
|
||||
// If we're ignoring the file, make sure the ! is at the beginning of the path
|
||||
if (tplPath[0] === '!') {
|
||||
return require('path').join('!assets/', tplPath.substr(1))
|
||||
return require('path').join('!assets/', tplPath.substr(1));
|
||||
}
|
||||
return require('path').join('assets/', tplPath)
|
||||
})
|
||||
return require('path').join('assets/', tplPath);
|
||||
});
|
||||
|
|
|
@ -18,5 +18,5 @@ module.exports = function (grunt) {
|
|||
'linkAssetsBuild',
|
||||
'clean:build',
|
||||
'copy:build'
|
||||
])
|
||||
}
|
||||
]);
|
||||
};
|
||||
|
|
|
@ -25,5 +25,6 @@ module.exports = function (grunt) {
|
|||
'clean:build',
|
||||
'copy:build',
|
||||
'clean:afterBuildProd'
|
||||
])
|
||||
}
|
||||
]);
|
||||
};
|
||||
|
||||
|
|
|
@ -14,5 +14,5 @@ module.exports = function (grunt) {
|
|||
'less:dev',
|
||||
'copy:dev',
|
||||
'coffee:dev'
|
||||
])
|
||||
}
|
||||
]);
|
||||
};
|
||||
|
|
|
@ -13,11 +13,15 @@
|
|||
*
|
||||
*/
|
||||
module.exports = function (grunt) {
|
||||
|
||||
|
||||
grunt.registerTask('default', [
|
||||
// 'polyfill:dev', //« uncomment to ALSO transpile during development (for broader browser compat.)
|
||||
'compileAssets',
|
||||
// 'babel', //« uncomment to ALSO transpile during development (for broader browser compat.)
|
||||
'linkAssets',
|
||||
'watch'
|
||||
])
|
||||
}
|
||||
]);
|
||||
|
||||
|
||||
};
|
||||
|
|
|
@ -12,5 +12,5 @@ module.exports = function (grunt) {
|
|||
'sails-linker:devJs',
|
||||
'sails-linker:devStyles',
|
||||
'sails-linker:clientSideTemplates'
|
||||
])
|
||||
}
|
||||
]);
|
||||
};
|
||||
|
|
|
@ -12,5 +12,5 @@ module.exports = function (grunt) {
|
|||
'sails-linker:devJsBuild',
|
||||
'sails-linker:devStylesBuild',
|
||||
'sails-linker:clientSideTemplatesBuild'
|
||||
])
|
||||
}
|
||||
]);
|
||||
};
|
||||
|
|
|
@ -12,5 +12,5 @@ module.exports = function (grunt) {
|
|||
'sails-linker:prodJsBuild',
|
||||
'sails-linker:prodStylesBuild',
|
||||
'sails-linker:clientSideTemplatesBuild'
|
||||
])
|
||||
}
|
||||
]);
|
||||
};
|
||||
|
|
|
@ -9,19 +9,20 @@
|
|||
*/
|
||||
module.exports = function(grunt) {
|
||||
grunt.registerTask('polyfill:prod', 'Add the polyfill file to the top of the list of files to concatenate', ()=>{
|
||||
grunt.config.set('concat.js.src', [require('sails-hook-grunt/accessible/babel-polyfill')].concat(grunt.config.get('concat.js.src')))
|
||||
})
|
||||
grunt.config.set('concat.js.src', [require('sails-hook-grunt/accessible/babel-polyfill')].concat(grunt.config.get('concat.js.src')));
|
||||
});
|
||||
grunt.registerTask('polyfill:dev', 'Add the polyfill file to the top of the list of files to copy and link', ()=>{
|
||||
grunt.config.set('copy.dev.files', grunt.config.get('copy.dev.files').concat({
|
||||
expand: true,
|
||||
cwd: require('path').dirname(require('sails-hook-grunt/accessible/babel-polyfill')),
|
||||
src: require('path').basename(require('sails-hook-grunt/accessible/babel-polyfill')),
|
||||
dest: '.tmp/public/polyfill'
|
||||
}))
|
||||
var devLinkFiles = grunt.config.get('sails-linker.devJs.files')
|
||||
}));
|
||||
var devLinkFiles = grunt.config.get('sails-linker.devJs.files');
|
||||
grunt.config.set('sails-linker.devJs.files', Object.keys(devLinkFiles).reduce((linkerConfigSoFar, glob)=>{
|
||||
linkerConfigSoFar[glob] = ['.tmp/public/polyfill/polyfill.min.js'].concat(devLinkFiles[glob])
|
||||
return linkerConfigSoFar
|
||||
}, {}))
|
||||
})
|
||||
}
|
||||
linkerConfigSoFar[glob] = ['.tmp/public/polyfill/polyfill.min.js'].concat(devLinkFiles[glob]);
|
||||
return linkerConfigSoFar;
|
||||
}, {}));
|
||||
});
|
||||
};
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ module.exports = function (grunt) {
|
|||
'cssmin',
|
||||
'sails-linker:prodJs',
|
||||
'sails-linker:prodStyles',
|
||||
'sails-linker:clientSideTemplates'
|
||||
])
|
||||
}
|
||||
'sails-linker:clientSideTemplates',
|
||||
]);
|
||||
};
|
||||
|
||||
|
|
|
@ -13,5 +13,5 @@ module.exports = function (grunt) {
|
|||
'less:dev',
|
||||
'sync:dev',
|
||||
'coffee:dev'
|
||||
])
|
||||
}
|
||||
]);
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue