diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4df9e9a --- /dev/null +++ b/.gitignore @@ -0,0 +1,84 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless + +# FuseBox cache +.fusebox/ + +#built folder +built/ +# package-lock.json file +package-lock.json + +#vscode file +.vscode/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..38b5ca9 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +## Backend-mongoDB + +Backend microservices api demo. +Essential features of login panel: User Registration , User Login, Forgot Password, Update Password; all done in Node.js with Express and MongoDB. + +[**Swagger-Ui**](https://swagger.io/) is used to visualize the application. + +**User Authentication** enabled using [Passport](http://www.passportjs.org/) + +**Role Based Access Control** on the routes and can be configured accroding to need to provide limited access based on the role of user. + +## Run +1. Install dependencies ``` npm install ``` +2. Configure MongoDB uri in ``` config/development.ts ``` +3. Get SendGrid API Key from [SendGrid](https://sendgrid.com) and set it in ``` .env ``` file +4. *(Optional)* Default role is user and you can customize acl in ``` src/app/config/nacl.json ``` +5. Run ``` tsc ``` in your terminal to compile the code +6. Run ``` node built/app.js ``` to run the project + +[Postman](https://www.getpostman.com/) is recommended to send various requests e.g. GET, POST, etc. + +* Register user by ``` http:localhost:9000/api/user/register ``` and you will see the user stored in MongoDB + +* Now, you can try various other methods such as Forgot Password, Update Password and play around with other custom routes. + +* You can perform authentication using ``` auth/ ``` routes. + +* You can also query the stored data in database using ``` api/query/ ``` routes. + +### References +* For learning more about ACL library used here: [express-acl](https://www.npmjs.com/package/express-acl) +* Library used for [pagination](https://www.npmjs.com/package/mongoose-paginate) +* Library used for swagger-docs: [swagger-jsdoc](https://www.npmjs.com/package/swagger-jsdoc) + + + diff --git a/built/api/common/common.controller.js b/built/api/common/common.controller.js index 175620c..270a7a0 100644 --- a/built/api/common/common.controller.js +++ b/built/api/common/common.controller.js @@ -8,8 +8,9 @@ var common_1 = require("../../common/common"); // Get list of things function get(req, res) { var col = req.params.collection; + var page = req.query.page; var Model = mongoose.model(req.params.collection); - Model.find({ $and: [{ $or: [{ is_deleted: false }, { is_deleted: null }] }] }, function (err, annos) { + Model.paginate({ $and: [{ $or: [{ is_deleted: false }, { is_deleted: null }] }] }, { page: page, limit: 2 }, function (err, annos) { if (err) { res.send(common_1.send_response(null, true, common_1.parse_error(err))); } @@ -249,7 +250,7 @@ function destroy(req, res) { if (err) { return res.send(common_1.send_response(null, true, common_1.parse_error(err))); } - return res.status(204).send(common_1.send_response({})); + return res.send(common_1.send_response(null, false, "User deleted Successfully!")); }); }); } diff --git a/built/api/common/index.js b/built/api/common/index.js index 011bfc9..ebc5ae4 100644 --- a/built/api/common/index.js +++ b/built/api/common/index.js @@ -2,7 +2,9 @@ var express = require("express"); var controller = require("./common.controller"); var auth = require("../../auth/auth.service"); +var acl = require("express-acl"); var router = express.Router(); +router.use(acl.authorize); router.get('/:collection', auth.isAuthenticated(), controller.get); router.get('/:collection/:id', auth.isAuthenticated(), controller.getById); router.get('/:collection/getbyuser/:user', auth.isAuthenticated(), controller.getByUser); diff --git a/built/api/user/index.js b/built/api/user/index.js index 4cbfbd9..5bef42b 100644 --- a/built/api/user/index.js +++ b/built/api/user/index.js @@ -1,19 +1,28 @@ -'use strict'; -Object.defineProperty(exports, "__esModule", { value: true }); +"use strict"; var express = require("express"); var controller = require("./user.controller"); var auth = require("../../auth/auth.service"); +var acl = require("express-acl"); +var options = { + path: "src/config/", + baseUrl: "/", + defaultRole: "user" +}; +acl.config(options); var router = express.Router(); var multer = require("multer"); -var upload = multer({ dest: './public/upload/' }); -router.post('/register', controller.register_user); -router.post('/forgotpassword', controller.forgotpassword); -router.post('/register_verify', controller.register_verify); -router.post('/resetPassword', controller.resetPassword); -router.post('/welcome_user', controller.welcome_user); -router.post('/verifytoken', controller.verifytoken); -router.post('/updatepassword', auth.isAuthenticated(), controller.updatePassword); +var upload = multer({ dest: "./public/upload/" }); +router.use(acl.authorize); +router.post("/register", controller.register_user); +router.post("/forgotpassword", controller.forgotpassword); +router.post("/register_verify", controller.register_verify); +router.post("/resetPassword", controller.resetPassword); +router.post("/welcome_user", controller.welcome_user); +router.post("/verifytoken", controller.verifytoken); +router.post("/updatepassword", auth.isAuthenticated(), controller.updatePassword); +router.get("/acl-test", function (req, res) { + res.send("acl is working!!!"); +}); /* For mobile side */ -router.post('/upload/avatar', auth.isAuthenticated(), upload.single('file'), controller.uploadpic); -/* END */ +router.post("/upload/avatar", auth.isAuthenticated(), upload.single("file"), controller.uploadpic); module.exports = router; diff --git a/built/api/user/user.controller.js b/built/api/user/user.controller.js index 4e57a6e..61ac417 100644 --- a/built/api/user/user.controller.js +++ b/built/api/user/user.controller.js @@ -2,83 +2,125 @@ Object.defineProperty(exports, "__esModule", { value: true }); var mongoose = require("mongoose"); var crypto = require("crypto"); +var sgMail = require("@sendgrid/mail"); +var auth = require("../../auth/auth.service"); var local_env_1 = require("../../config/local.env"); var common_1 = require("../../common/common"); +var dotenv = require("dotenv"); +dotenv.config(); +//sendGrid api key +sgMail.setApiKey(process.env.SENDGRID_API_KEY); /* Update password from admin panel */ function updatePassword(req, res) { - var User = mongoose.model('User'); + var User = mongoose.model("User"); + console.log("user: " + User); User.findOne({ _id: req.user._id }, function (err, user) { if (err) { res.send(common_1.send_response(null, true, "User not found!")); } else { - var isAuth = user.authenticate(req.body.old_password); - if (isAuth === true) { - user.password = req.body.new_password; - user.save(function (err, saved) { - if (err) { - res.send(common_1.send_response(null, true, common_1.parse_error(err))); + if (!req.body.old_password || + !req.body.new_password || + !req.body.confirm_password) { + res.send(common_1.send_response(null, true, "Please enter your old password and new password")); + } + else { + var isAuth = user.authenticate(req.body.old_password); + if (isAuth === true) { + if (req.body.new_password !== req.body.confirm_password) { + res.send(common_1.send_response(null, true, " New password and Confirm password do not match, try again!")); } else { - res.send(common_1.send_response(null, false, saved)); + user.password = req.body.new_password; + user.save(function (err, saved) { + if (err) { + res.send(common_1.send_response(null, true, common_1.parse_error(err))); + } + else { + res.send(common_1.send_response(null, false, "password updated!")); + } + }); } - }); - } - else { - res.send(common_1.send_response(null, true, "Old password is wrong!")); + } + else { + res.send(common_1.send_response(null, true, "Old password is wrong!")); + } } } }); } exports.updatePassword = updatePassword; -; /* Verify token whether token exist in forgot password model or changed */ function verifytoken(req, res) { - var ForgotPassword = mongoose.model('Forgotpassword'); + var ForgotPassword = mongoose.model("Forgotpassword"); var data = req.body; ForgotPassword.findOne({ token: data.token }, function (err, user) { if (user == null) { - res.json({ data: null, is_error: true, message: 'Token invalid!' }); + res.json({ data: null, is_error: true, message: "Token invalid!" }); } else if (user.is_changed == true) { - res.json({ data: user, is_error: true, message: 'This link is no longer available.Please request a new link!' }); + res.json({ + data: user, + is_error: true, + message: "This link is no longer available.Please request a new link!" + }); } else { - res.json({ data: user, is_error: false, message: 'Valid token!' }); + res.json({ data: user, is_error: false, message: "Valid token!" }); } }); } exports.verifytoken = verifytoken; /* Forgot password api for sending mail with link */ function forgotpassword(req, res) { - var User = mongoose.model('User'); - var ForgotPassword = mongoose.model('Forgotpassword'); + var User = mongoose.model("User"); + var ForgotPassword = mongoose.model("Forgotpassword"); var data = req.body; User.findOne({ email: data.email }, function (err, user) { if (user == null) { - res.json({ data: null, is_error: true, message: 'User not found!' }); + res.json({ data: null, is_error: true, message: "User not found!" }); } else { var today = new Date(); //Generate Hash - var secret = 'a3s5d46a5sd684asdaasdkn!@312'; - var hash = crypto.createHmac('sha256', secret) + var secret = "a3s5d46a5sd684asdaasdkn!@312"; + var hash = crypto + .createHmac("sha256", secret) .update(user._id + user.email + user._id + today) - .digest('hex'); + .digest("hex"); var email_data = { - user: usersetup._id, - token: hash, + user: user._id, + token: hash }; - var email_data = new ForgotPassword(email_data); + var email_data = new ForgotPassword(email_data, function (err) { + if (err) { + console.log("data not pushed in database"); + } + else + res.send(common_1.send_response(null, false, "Data pushed in database!")); + }); ForgotPassword.create(email_data, function (error, data) { var mail_data = { - 'replace_var': { - username: user.first_name, - link: local_env_1.default.CLIENT_URL + '/reset_password.html?token=' + hash - }, - 'send_to': user.email, - 'subject': 'Forgot Password' + to: user.email, + from: process.env.EMAIL_ID, + subject: "Forgot Password", + text: "Click the following link to reset the password: " + + local_env_1.default.CLIENT_URL + + "/resetPassword?token=" + + hash }; + sgMail.send(mail_data).then(function (sent) { + if (sent) { + res.json({ data: null, is_error: false, message: "Mail sent!" }); + } + else { + res.json({ + data: null, + is_error: true, + message: "Mail sending failed!" + }); + } + }); res.json({ data: user, is_error: false }); }); } @@ -87,60 +129,67 @@ function forgotpassword(req, res) { exports.forgotpassword = forgotpassword; /** Reset Password **/ function resetPassword(req, res) { - var User = mongoose.model('User'); - var Forgotpassword = mongoose.model('Forgotpassword'); + var User = mongoose.model("User"); + var Forgotpassword = mongoose.model("Forgotpassword"); var params = req.body; - if (!params - || !params.token - || !params.new_password) { - res.send(common_1.send_response(null, true, 'Validation error!')); + console.log("params: " + params); + if (!params || !params.token || !params.new_password) { + res.send(common_1.send_response(null, true, "Validation error!")); } else { if (params.new_password.length <= 5) { res.send(common_1.send_response(null, true, "Password must be of minimum 6 characters!")); } else { - Forgotpassword - .findOne({ token: params.token }) - .exec(function (err, forgot) { + Forgotpassword.findOne({ token: params.token }).exec(function (err, forgot) { if (err) { res.send(common_1.send_response(null, true, err.message)); } else { - console.log(forgot.user); - User.findOne({ _id: forgot.user }) - .exec(function (err, user) { - console.log(user); + console.log("forgot: " + forgot.user); + User.findOne({ _id: forgot.user }).exec(function (err, user) { if (err) { res.send(common_1.send_response(null, true, err.message)); } else { if (user) { - user.password = params.new_password; - user.save(function (err, user) { - if (err) { - res.send(common_1.send_response(null, true, err.message)); + if (!params.new_password || !params.confirm_password) { + res.send(common_1.send_response(null, true, "Please enter new_password and/or confirm_password")); + } + else { + if (params.new_password !== params.confirm_password) { + res.send(common_1.send_response(null, true, "Password do not match. Try again!")); } else { - forgot.is_changed = true; - forgot.save(function (err, user) { + user.password = params.new_password; + console.log("user.password is(changed):" + user.password); + user.save(function (err, user) { if (err) { res.send(common_1.send_response(null, true, err.message)); } else { - // remove model object from user - user = user.toJSON(); - // delete password key - delete user.password; - res.send(common_1.send_response(user, false, 'Your password is changed successfully now you can login with new password from the app.')); - //res.send(send_response(user)); + forgot.is_changed = true; + forgot.save(function (err, user) { + if (err) { + res.send(common_1.send_response(null, true, err.message)); + } + else { + // remove model object from user + user = user.toJSON(); + // delete password key + delete user.password; + res.send(common_1.send_response(null, false, "Your password is changed successfully now you can login with new password from the app.")); + // res.send(send_response(user, false, "password changed!")); + console.log("Password successfully changed!!"); + } + }); } }); } - }); + } } else { - res.send(common_1.send_response(null, true, 'User not found!')); + res.send(common_1.send_response(null, true, "User not found!")); } } }); @@ -150,41 +199,51 @@ function resetPassword(req, res) { } } exports.resetPassword = resetPassword; -; /* Verification api after user register from website */ function register_verify(req, res) { - var User = mongoose.model('User'); + var User = mongoose.model("User"); var data = req.body; User.findOne({ email: data.email }, function (err, user) { if (user == null) { - res.json({ data: null, is_error: true, message: 'Invalid user detail!' }); + res.json({ data: null, is_error: true, message: "Invalid user detail!" }); } else { var today = new Date(); //Generate Hash - var secret = 'a3s5d46a5sd684asdaasdkn!@312'; - var hash = crypto.createHmac('sha256', secret) + var secret = "a3s5d46a5sd684asdaasdkn!@312"; + var hash = crypto + .createHmac("sha256", secret) .update(user._id + user.email + user._id + today) - .digest('hex'); + .digest("hex"); var mail_data = { - 'replace_var': { - username: user.first_name, - link: local_env_1.default.CLIENT_URL + '/#/register_verify/' + user._id - }, - 'send_to': user.email, - 'subject': 'Register Verify' + to: user.email, + from: process.env.EMAIL_ID, + subject: "Register Verify", + text: "Your email is verified" }; + sgMail.send(mail_data).then(function (sent) { + if (sent) { + res.json({ data: null, is_error: false, message: "Mail sent!" }); + } + else { + res.json({ + data: null, + is_error: true, + message: "Mail sending failed!" + }); + } + }); } }); } exports.register_verify = register_verify; /* Mail to user for welcoming after registration */ function welcome_user(req, res) { - var User = mongoose.model('User'); + var User = mongoose.model("User"); var data = req.body; User.findOne({ email: data.email }, function (err, user) { if (user == null) { - res.json({ data: null, is_error: true, message: 'Invalid user!' }); + res.json({ data: null, is_error: true, message: "Invalid user!" }); } else { user.is_verify = true; @@ -195,23 +254,27 @@ function welcome_user(req, res) { else { var today = new Date(); //Generate Hash - var secret = 'a3s5d46a5sd684asdaasdkn!@312'; - var hash = crypto.createHmac('sha256', secret) + var secret = "a3s5d46a5sd684asdaasdkn!@312"; + var hash = crypto + .createHmac("sha256", secret) .update(user._id + user.email + user._id + today) - .digest('hex'); + .digest("hex"); var mail_data = { - 'replace_var': { - username: user.first_name - }, - 'send_to': user.email, - 'subject': 'Welcome!' + to: user.email, + from: process.env.EMAIL_ID, + subject: "Welcome!", + text: "Welcome " + user.first_name }; - mailsender.send_mail('/welcome_user.html', mail_data, function (response) { - if (response.is_error) { - res.json({ data: null, is_error: true, message: 'Mail sending failed!' }); + sgMail.send(mail_data).then(function (sent) { + if (sent) { + res.json({ data: null, is_error: false, message: "Mail sent!" }); } else { - res.json({ data: null, is_error: false, message: 'Mail sent!' }); + res.json({ + data: null, + is_error: true, + message: "Mail sending failed!" + }); } }); } @@ -222,43 +285,65 @@ function welcome_user(req, res) { exports.welcome_user = welcome_user; /* Register user api from app */ function register_user(req, res) { - var Model = mongoose.model('User'); + var Model = mongoose.model("User"); var data = req.body; - Model.create(data, function (err, user) { - if (err) { - console.log("asaaaa"); - res.send(common_1.send_response(null, true, common_1.parse_error(err))); + console.log("password: " + data.password); + if (!data.email || !data.password || !data.confirm_password) { + res.send(common_1.send_response(null, true, "Please enter email and password and confirm password")); + } + else { + if (data.password !== data.confirm_password) { + res.send(common_1.send_response(null, true, "passwords do not match!")); } else { - console.log("Asda"); - var today = new Date(); - //Generate Hash - var secret = 'a3s5d46a5sd684asdaasdkn!@312'; - var hash = crypto.createHmac('sha256', secret) - .update(user._id + user.email + user._id + today) - .digest('hex'); - var mail_data = { - 'replace_var': { - username: user.first_name - }, - 'send_to': user.email, - 'subject': 'Welcome!' - }; - // var token = auth.signToken(user._id, user.role); - var data = { user: user }; - res.send(common_1.send_response(null, true, "Register success. please check your inbox")); + Model.create(data, function (err, user) { + if (err) { + console.log("asaaaa"); + res.send(common_1.send_response(null, true, common_1.parse_error(err))); + } + else { + console.log("Asda"); + var today = new Date(); + //Generate Hash + var secret = "a3s5d46a5sd684asdaasdkn!@312"; + var hash = crypto + .createHmac("sha256", secret) + .update(user._id + user.email + user._id + today) + .digest("hex"); + var mail_data = { + to: user.email, + from: process.env.EMAIL_ID, + subject: "Welcome " + user.first_name + "!", + text: "Welcome to our website!" + }; + sgMail.send(mail_data).then(function (sent) { + if (sent) { + res.json({ data: null, is_error: false, message: "Mail sent!" }); + } + else { + res.json({ + data: null, + is_error: true, + message: "Mail sending failed!" + }); + } + }); + var token = auth.signToken(user._id, user.role); + var data = { user: user }; + res.send(common_1.send_response(null, true, "Register success. please check your inbox")); + } + }); } - }); + } } exports.register_user = register_user; -; /** * User profile pic change API * @param req * @param res */ function uploadpic(req, res) { - var Model = mongoose.model('User'); + var Model = mongoose.model("User"); Model.findOne({ _id: req.user._id }, function (err, mod) { if (err) { res.send(common_1.send_response(null, true, "Could not find User")); @@ -282,4 +367,3 @@ function uploadpic(req, res) { }); } exports.uploadpic = uploadpic; -; diff --git a/built/app.js b/built/app.js index a1cbcaa..0b1dead 100644 --- a/built/app.js +++ b/built/app.js @@ -4,28 +4,43 @@ */ Object.defineProperty(exports, "__esModule", { value: true }); console.log("Loading ... "); -'use strict'; +"use strict"; // Set default node environment to development -process.env.NODE_ENV = process.env.NODE_ENV || 'development'; -process.env.TZ = 'Asia/Kolkata'; +process.env.NODE_ENV = process.env.NODE_ENV || "development"; +process.env.TZ = "Asia/Kolkata"; var express = require("express"); var mongoose = require("mongoose"); var environment_1 = require("./config/environment"); var cors = require("cors"); var http_mod = require("http"); var socketIo_mod = require("socket.io"); +var swaggerJSDoc = require("swagger-jsdoc"); +var path = require("path"); var usernames = {}; +// swagger config +var swaggerDefinition = { + info: { + title: "DotBackend-MongoDB", + version: "1.0.0", + description: "User module with SignUp, Authentication and Authorization features" + } +}; +var options = { + swaggerDefinition: swaggerDefinition, + apis: ["./public/swagger-doc.js"] +}; +var swaggerSpec = swaggerJSDoc(options); var server = new http_mod.Server(express); var io = socketIo_mod(server); // Connect to database mongoose.connect(environment_1.default.mongo.uri); -mongoose.connection.on('error', function (err) { - console.error('MongoDB connection error: ' + err); +mongoose.connection.on("error", function (err) { + console.error("MongoDB connection error: " + err); process.exit(-1); }); // Populate DB with sample data if (environment_1.default.seedDB) { - require('./config/seed'); + require("./config/seed"); } // Setup server var app = express(); @@ -33,8 +48,8 @@ var http = require("http"); var server = http.createServer(app); var socketIo = require("socket.io"); var socketio = new socketIo(server, { - serveClient: environment_1.default.env !== 'production', - path: '/socket.io' + serveClient: environment_1.default.env !== "production", + path: "/socket.io" }); //console.log(socketio); //var io = new Server(); @@ -44,7 +59,7 @@ function logger(req, res, next) { // console.log(new Date(), req.method, req.url); // console.log(req.hostname); // attach companyid in req - var cid = req.get('companyId'); + var cid = req.get("companyId"); if (cid && cid !== null && cid !== undefined && cid !== "null") { req.companyId = cid; } @@ -54,11 +69,11 @@ function logger(req, res, next) { headers["Access-Control-Allow-Origin"] = "*"; headers["Access-Control-Allow-Methods"] = "POST, GET, PUT, DELETE, OPTIONS"; headers["Access-Control-Allow-Credentials"] = false; - headers["Access-Control-Max-Age"] = '86400'; // 24 hours + headers["Access-Control-Max-Age"] = "86400"; // 24 hours // headers["Access-Control-Allow-Headers"] = "X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept, companyId";//"Content-Type, Accept";// - headers['Access-Control-Allow-Headers: Authorization, Content-Type']; - if (req.method === 'OPTIONS') { - console.log('!OPTIONS'); + headers["Access-Control-Allow-Headers: Authorization, Content-Type"]; + if (req.method === "OPTIONS") { + console.log("!OPTIONS"); res.writeHead(200, headers); //res.end(); res.send(); @@ -68,16 +83,30 @@ function logger(req, res, next) { } } app.use(cors()); +// swagger +app.get("/swagger.json", function (req, res) { + res.setHeader("Content-Type", "application/x-www-form-urlencoded"); + res.setHeader("Access-Control-Allow-Origin", "*"); + res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); + // res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); + res.setHeader("Access-Control-Allow-Credentials", true); + res.send(swaggerSpec); +}); +app.use(express.static(path.join(__dirname, "../public"))); //app.use(logger); -require('./config/socketio')(socketio); -require('./config/express')(app); -require('./models')(app, mongoose); -require('./routes')(app); -require('./common/common'); +require("./config/socketio")(socketio); +require("./config/express")(app); +require("./models")(app, mongoose); +require("./routes")(app); +require("./common/common"); function checkAuth(err, req, res, next) { - if (err.name.indexOf('Unauthorized') !== -1) { + if (err.name.indexOf("Unauthorized") !== -1) { res.status(401); - res.send({ data: null, is_error: true, message: "Unauthorized Request, Please sign in first." }); + res.send({ + data: null, + is_error: true, + message: "Unauthorized Request, Please sign in first." + }); } else { return next(); @@ -86,9 +115,9 @@ function checkAuth(err, req, res, next) { app.use(checkAuth); // Start server server.listen(environment_1.default.port, environment_1.default.ip, function () { - console.log('Express server listening on %d, in %s mode', environment_1.default.port, app.get('env')); + console.log("Express server listening on %d, in %s mode", environment_1.default.port, app.get("env")); }); -io.sockets.on('connection', function (socket) { +io.sockets.on("connection", function (socket) { console.log("Socket connection"); }); // Expose app diff --git a/built/auth/auth.service.js b/built/auth/auth.service.js index 928e6fc..55191cb 100644 --- a/built/auth/auth.service.js +++ b/built/auth/auth.service.js @@ -4,6 +4,7 @@ var environment_1 = require("../config/environment"); var jwt = require("jsonwebtoken"); var expressJwt = require("express-jwt"); var compose = require("composable-middleware"); +// import { default as User } from '../models/user.model'; var user_model_1 = require("../models/user.model"); var validateJwt = expressJwt({ secret: environment_1.default.secrets.session }); /** @@ -22,7 +23,7 @@ function isAuthenticated() { }) // Attach user to request .use(function (req, res, next) { - user_model_1.default.findById(req.user._id, function (err, user) { + user_model_1.default.User.findById(req.user._id, function (err, user) { if (err) return next(err); if (!user) diff --git a/built/auth/facebook/passport.js b/built/auth/facebook/passport.js index 7da6e81..e6bc969 100644 --- a/built/auth/facebook/passport.js +++ b/built/auth/facebook/passport.js @@ -4,6 +4,7 @@ var passport = require("passport"); var facebook = require("passport-facebook"); var FacebookStrategy = facebook.Strategy; function setup(User, config) { + config = config.default; passport.use(new FacebookStrategy({ clientID: config.facebook.clientID, clientSecret: config.facebook.clientSecret, diff --git a/built/auth/google/passport.js b/built/auth/google/passport.js index 722b318..474e5cd 100644 --- a/built/auth/google/passport.js +++ b/built/auth/google/passport.js @@ -5,6 +5,7 @@ var passport = require("passport"); var google = require("passport-google-oauth"); var GoogleStrategy = google.OAuth2Strategy; function setup(User, config) { + config = config.default; passport.use(new GoogleStrategy({ clientID: config.google.clientID, clientSecret: config.google.clientSecret, diff --git a/built/auth/index.js b/built/auth/index.js index 84aca30..eba30c4 100644 --- a/built/auth/index.js +++ b/built/auth/index.js @@ -3,12 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true }); var express = require("express"); var config = require("../config/environment"); var User = require("../models/user.model"); +var acl = require("express-acl"); // Passport Configuration require('./local/passport').setup(User, config); require('./facebook/passport').setup(User, config); require('./google/passport').setup(User, config); require('./twitter/passport').setup(User, config); var router = express.Router(); +router.use(acl.authorize); router.use('/local', require('./local')); router.use('/facebook', require('./facebook')); router.use('/twitter', require('./twitter')); diff --git a/built/auth/local/passport.js b/built/auth/local/passport.js index 56aff4e..cd0610f 100644 --- a/built/auth/local/passport.js +++ b/built/auth/local/passport.js @@ -3,12 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true }); var passport = require("passport"); var local = require("passport-local"); var LocalStrategy = local.Strategy; +var user_model_1 = require("../../models/user.model"); function setup(User, config) { passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' // this is the virtual field on the model }, function (email, password, done) { - User.findOne({ + user_model_1.default.User.findOne({ email: email }, function (err, user) { if (err) diff --git a/built/auth/twitter/passport.js b/built/auth/twitter/passport.js index 8810477..18018fb 100644 --- a/built/auth/twitter/passport.js +++ b/built/auth/twitter/passport.js @@ -1,9 +1,10 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +var passport = require('passport'); +var twitter = require('passport-twitter'); +var TwitterStrategy = twitter.Strategy; function setup(User, config) { - var passport = require('passport'); - var twitter = require('passport-twitter'); - var TwitterStrategy = twitter.Strategy; + config = config.default; passport.use(new TwitterStrategy({ consumerKey: config.twitter.clientID, consumerSecret: config.twitter.clientSecret, diff --git a/built/config/environment/production.js b/built/config/environment/production.js index bb0d5eb..c743a08 100644 --- a/built/config/environment/production.js +++ b/built/config/environment/production.js @@ -14,5 +14,5 @@ module.exports = { // MongoDB connection options mongo: { uri: 'mongodb://now:samcom84@162.250.121.171:27777/now' - } + }, }; diff --git a/built/config/local.env.js b/built/config/local.env.js index fe33f5a..863b051 100644 --- a/built/config/local.env.js +++ b/built/config/local.env.js @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); // You will need to set these on the server you deploy to. exports.default = { DOMAIN: 'http://anydomainhere.com/', - CLIENT_URL: 'http://anydomainhere.com/', + CLIENT_URL: 'http://localhost:9000', SESSION_SECRET: "dotwhitelable-secret", FACEBOOK_ID: 'app-id', FACEBOOK_SECRET: 'secret', diff --git a/built/config/seed.js b/built/config/seed.js index 8302ad3..b544020 100644 --- a/built/config/seed.js +++ b/built/config/seed.js @@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); // Insert seed models below var user_model_1 = require("../models/user.model"); // Create Default Admin -var admin = new user_model_1.default({ +var admin = new user_model_1.default.User({ first_name: 'Admin', last_name: 'now', user_name: "admin", @@ -18,7 +18,7 @@ var admin = new user_model_1.default({ phone_number: '9898245452', is_verify: true }); -user_model_1.default.create(admin, function (err, user) { +user_model_1.default.User.create(admin, function (err, user) { if (err) { console.log("Error creating default admin : " + err); } diff --git a/built/models/user.model.js b/built/models/user.model.js index 16d3482..1c97881 100644 --- a/built/models/user.model.js +++ b/built/models/user.model.js @@ -7,6 +7,7 @@ var crypto = require("crypto"); var authTypes = ['github', 'twitter', 'facebook', 'google']; var mongoH = require("mongoose-hidden"); var mongooseHidden = (mongoH)({ defaultHidden: { password: true } }); +var mongoosePaginate = require("mongoose-paginate"); var schemaOptions = { toObject: { virtuals: true }, toJSON: { virtuals: true } @@ -32,6 +33,10 @@ var UserSchema = new Schema({ last_updated: { type: Date, default: null }, last_login: { type: Date, default: null }, }, schemaOptions); +var ForgotPasswordSchema = new Schema({ + user: String, + token: String +}, schemaOptions); UserSchema.plugin(autopopulate); UserSchema.plugin(mongooseHidden); /** @@ -177,4 +182,11 @@ UserSchema.methods = { return pwd; } }; -exports.default = mongoose.model('User', UserSchema); +UserSchema.plugin(mongoosePaginate); +ForgotPasswordSchema.plugin(mongoosePaginate); +// export = mongoose.model('User', UserSchema); +// export = mongoose.model('Forgotpassword', ForgotPasswordSchema); +exports.default = { + User: mongoose.model('User', UserSchema), + Forgotpassword: mongoose.model('Forgotpassword', ForgotPasswordSchema) +}; diff --git a/package.json b/package.json index f486283..e717b3d 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "author": "ankit", "license": "ISC", "dependencies": { + "@sendgrid/mail": "^6.3.1", "body-parser": "^1.18.3", "composable-middleware": "^0.3.0", "compression": "^1.7.3", @@ -17,8 +18,10 @@ "cors": "^2.8.4", "crypto": "^1.0.1", "dedupe": "^2.1.0", + "dotenv": "^6.1.0", "errorhandler": "^1.5.0", "express": "^4.16.3", + "express-acl": "^2.0.4", "express-jwt": "^5.3.1", "express-session": "^1.15.6", "grunt": "^1.0.3", @@ -27,9 +30,10 @@ "jsonwebtoken": "^8.3.0", "lodash": "^4.17.11", "method-override": "^3.0.0", - "mongoose": "^4.8.5", + "mongoose": "^4.13.17", "mongoose-autopopulate": "^0.8.1", "mongoose-hidden": "^1.6.0", + "mongoose-paginate": "^5.0.3", "morgan": "^1.9.1", "multer": "^1.4.0", "passport": "^0.4.0", @@ -39,6 +43,7 @@ "passport-twitter": "^1.0.4", "path": "^0.12.7", "socket.io": "^2.1.1", + "swagger-jsdoc": "^3.2.3", "time-grunt": "^1.4.0", "validator": "^10.8.0" }, diff --git a/public/api-docs/favicon-16x16.png b/public/api-docs/favicon-16x16.png new file mode 100644 index 0000000..0f7e13b Binary files /dev/null and b/public/api-docs/favicon-16x16.png differ diff --git a/public/api-docs/favicon-32x32.png b/public/api-docs/favicon-32x32.png new file mode 100644 index 0000000..b0a3352 Binary files /dev/null and b/public/api-docs/favicon-32x32.png differ diff --git a/public/api-docs/index.html b/public/api-docs/index.html new file mode 100644 index 0000000..16e1ecd --- /dev/null +++ b/public/api-docs/index.html @@ -0,0 +1,98 @@ + + + +
+ +>>u&mn;if(_!==h>>>u&mn)break;_&&(l+=(1<i&&(c=c.removeBefore(r,u,a-l)),c&&h
a&&(a=c.size),o(u)||(c=c.map(function(e){return H(e)})),i.push(c)}return a>e.size&&(e=e.setSize(a)),Ie(e,t,i)}function $e(e){return es)return k();var e=i.next();return r||t===bn?e:t===_n?w(t,u-1,void 0,e):w(t,u-1,e.value[1],e)})},c}function dt(e,t,n){var r=Dt(e);return r.__iterateUncached=function(r,i){var o=this;if(i)return this.cacheResult().__iterate(r,i);var a=0;return e.__iterate(function(e,i,s){return t.call(n,e,i,s)&&++a&&r(e,i,o)}),a},r.__iteratorUncached=function(r,i){var o=this;if(i)return this.cacheResult().__iterator(r,i);var a=e.__iterator(xn,i),s=!0;return new x(function(){if(!s)return k();var e=a.next();if(e.done)return e;var i=e.value,u=i[0],c=i[1];return t.call(n,c,u,o)?r===xn?e:w(r,u,c,e):(s=!1,k())})},r}function mt(e,t,n,r){var i=Dt(e);return i.__iterateUncached=function(i,o){var a=this;if(o)return this.cacheResult().__iterate(i,o);var s=!0,u=0;return e.__iterate(function(e,o,c){if(!s||!(s=t.call(n,e,o,c)))return u++,i(e,r?o:u-1,a)}),u},i.__iteratorUncached=function(i,o){var a=this;if(o)return this.cacheResult().__iterator(i,o);var s=e.__iterator(xn,o),u=!0,c=0;return new x(function(){var e,o,l;do{if(e=s.next(),e.done)return r||i===bn?e:i===_n?w(i,c++,void 0,e):w(i,c++,e.value[1],e);var p=e.value;o=p[0],l=p[1],u&&(u=t.call(n,l,o,a))}while(u);return i===xn?e:w(i,o,l,e)})},i}function vt(e,t){var r=a(e),i=[e].concat(t).map(function(e){return o(e)?r&&(e=n(e)):e=r?L(e):z(Array.isArray(e)?e:[e]),e}).filter(function(e){return 0!==e.size});if(0===i.length)return e;if(1===i.length){var u=i[0];if(u===e||r&&a(u)||s(e)&&s(u))return u}var c=new I(i);return r?c=c.toKeyedSeq():s(e)||(c=c.toSetSeq()),c=c.flatten(!0),c.size=i.reduce(function(e,t){if(void 0!==e){var n=t.size;if(void 0!==n)return e+n}},0),c}function gt(e,t,n){var r=Dt(e);return r.__iterateUncached=function(r,i){function a(e,c){var l=this;e.__iterate(function(e,i){return(!t||c=Kn)return Me(e,f,c,s,d);if(l&&!d&&2===f.length&&Se(f[1^p]))return f[1^p];if(l&&d&&1===f.length&&Se(d))return d;var m=e&&e===this.ownerID,v=l?d?c:c^u:c|u,g=l?d?Re(f,p,d,m):Be(f,p,m):Fe(f,p,d,m);return m?(this.bitmap=v,this.nodes=g,this):new de(e,v,g)},me.prototype.get=function(e,t,n,r){void 0===t&&(t=oe(n));var i=(0===e?t:t>>>e)&mn,o=this.nodes[i];return o?o.get(e+hn,t,n,r):r},me.prototype.update=function(e,t,n,r,i,o,a){void 0===n&&(n=oe(r));var s=(0===t?n:n>>>t)&mn,u=i===vn,c=this.nodes,l=c[s];if(u&&!l)return this;var p=Ee(l,e,t+hn,n,r,i,o,a);if(p===l)return this;var f=this.count;if(l){if(!p&&--f5e3)return e.textContent;return function(e){for(var n,r,i,o,a,s=e.textContent,u=0,c=s[0],l=1,p=e.innerHTML="",f=0;r=n,n=f<7&&"\\"==n?1:l;){if(l=c,c=s[++u],o=p.length>1,!l||f>8&&"\n"==l||[/\S/.test(l),1,1,!/[$\w]/.test(l),("/"==n||"\n"==n)&&o,'"'==n&&o,"'"==n&&o,s[u-4]+r+n=="--\x3e",r+n=="*/"][f])for(p&&(e.appendChild(a=t.createElement("span")).setAttribute("style",["color: #555; font-weight: bold;","","","color: #555;",""][f?f<3?2:f>6?4:f>3?3:+/^(a(bstract|lias|nd|rguments|rray|s(m|sert)?|uto)|b(ase|egin|ool(ean)?|reak|yte)|c(ase|atch|har|hecked|lass|lone|ompl|onst|ontinue)|de(bugger|cimal|clare|f(ault|er)?|init|l(egate|ete)?)|do|double|e(cho|ls?if|lse(if)?|nd|nsure|num|vent|x(cept|ec|p(licit|ort)|te(nds|nsion|rn)))|f(allthrough|alse|inal(ly)?|ixed|loat|or(each)?|riend|rom|unc(tion)?)|global|goto|guard|i(f|mp(lements|licit|ort)|n(it|clude(_once)?|line|out|stanceof|t(erface|ernal)?)?|s)|l(ambda|et|ock|ong)|m(icrolight|odule|utable)|NaN|n(amespace|ative|ext|ew|il|ot|ull)|o(bject|perator|r|ut|verride)|p(ackage|arams|rivate|rotected|rotocol|ublic)|r(aise|e(adonly|do|f|gister|peat|quire(_once)?|scue|strict|try|turn))|s(byte|ealed|elf|hort|igned|izeof|tatic|tring|truct|ubscript|uper|ynchronized|witch)|t(emplate|hen|his|hrows?|ransient|rue|ry|ype(alias|def|id|name|of))|u(n(checked|def(ined)?|ion|less|signed|til)|se|sing)|v(ar|irtual|oid|olatile)|w(char_t|hen|here|hile|ith)|xor|yield)$/.test(p):0]),a.appendChild(t.createTextNode(p))),i=f&&f<7?f:i,p="",f=11;![1,/[\/{}[(\-+*=<>:;|\\.,?!&@~]/.test(l),/[\])]/.test(l),/[$\w]/.test(l),"/"==l&&i<2&&"<"!=n,'"'==l,"'"==l,l+c+s[u+1]+s[u+2]=="\x3c!--",l+c=="/*",l+c=="//","#"==l][--f];);p+=l}}(e)}function b(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"key",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:R.default.Map();if(!R.default.Map.isMap(e)||!e.size)return R.default.List();if(Array.isArray(t)||(t=[t]),t.length<1)return e.merge(n);var r=R.default.List(),i=t[0],o=!0,a=!1,s=void 0;try{for(var u,c=(0,D.default)(e.entries());!(o=(u=c.next()).done);o=!0){var l=u.value,p=(0,C.default)(l,2),f=p[0],h=p[1],d=b(h,t.slice(1),n.set(i,f));r=R.default.List.isList(d)?r.concat(d):r.push(d)}}catch(e){a=!0,s=e}finally{try{!o&&c.return&&c.return()}finally{if(a)throw s}}return r}function x(e){return(0,z.default)((0,B.default)(e))}function w(e){return x(e.replace(/\.[^.\/]*$/,""))}Object.defineProperty(t,"__esModule",{value:!0}),t.shallowEqualKeys=t.buildFormData=t.sorters=t.btoa=t.parseSearch=t.getSampleSchema=t.validateParam=t.validateString=t.validateBoolean=t.validateFile=t.validateInteger=t.validateNumber=t.propChecker=t.errorLog=t.memoize=t.isImmutable=void 0;var k=n(41),E=r(k),S=n(19),C=r(S),A=n(90),D=r(A),M=n(33),O=r(M),T=n(42),P=r(T),I=n(52),j=r(I);t.objectify=i,t.arrayify=o,t.fromJSOrdered=a,t.bindToState=s,t.normalizeArray=u,t.isFn=c,t.isObject=l,t.isFunc=p,t.isArray=f,t.objMap=h,t.objReduce=d,t.systemThunkMiddleware=m,t.defaultStatusCode=v,t.getList=g,t.formatXml=y,t.highlight=_,t.mapToList=b,t.pascalCase=x,t.pascalCaseFilename=w;var N=n(10),R=r(N),F=n(876),B=r(F),L=n(400),z=r(L),q=n(398),U=r(q),W=n(392),K=r(W),H=n(891),V=r(H),G=n(111),J=r(G),X=n(165),Y=n(51),$=r(Y),Z="default",Q=t.isImmutable=function(e){return R.default.Iterable.isIterable(e)},ee=(t.memoize=U.default,t.errorLog=function(e){return function(){return function(t){return function(n){try{t(n)}catch(t){e().errActions.newThrownErr(t,n)}}}}},t.propChecker=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];return(0,j.default)(e).length!==(0,j.default)(t).length||((0,V.default)(e,function(e,n){if(r.includes(n))return!1;var i=t[n];return R.default.Iterable.isIterable(e)?!R.default.is(e,i):("object"!==(void 0===e?"undefined":(0,P.default)(e))||"object"!==(void 0===i?"undefined":(0,P.default)(i)))&&e!==i})||n.some(function(n){return!(0,J.default)(e[n],t[n])}))},t.validateNumber=function(e){if(!/^-?\d+(\.?\d+)?$/.test(e))return"Value must be a number"}),te=t.validateInteger=function(e){if(!/^-?\d+$/.test(e))return"Value must be an integer"},ne=t.validateFile=function(e){if(e&&!(e instanceof $.default.File))return"Value must be a file"},re=t.validateBoolean=function(e){if("true"!==e&&"false"!==e&&!0!==e&&!1!==e)return"Value must be a boolean"},ie=t.validateString=function(e){if(e&&"string"!=typeof e)return"Value must be a string"};t.validateParam=function(e,t){var n=[],r=t&&"body"===e.get("in")?e.get("value_xml"):e.get("value"),i=e.get("required"),o=e.get("type");if(o&&(i||r)){var a="string"===o&&r&&!ie(r),s="array"===o&&Array.isArray(r)&&r.length,u="array"===o&&R.default.List.isList(r)&&r.count(),c="file"===o&&r instanceof $.default.File,l="boolean"===o&&!re(r),p="number"===o&&!ee(r),f="integer"===o&&!te(r);if(i&&!(a||s||u||c||l||p||f))return n.push("Required field is not provided"),n;if("string"===o){var h=ie(r);if(!h)return n;n.push(h)}else if("boolean"===o){var d=re(r);if(!d)return n;n.push(d)}else if("number"===o){var m=ee(r);if(!m)return n;n.push(m)}else if("integer"===o){var v=te(r);if(!v)return n;n.push(v)}else if("array"===o){var g=void 0;if(!r.count())return n;g=e.getIn(["items","type"]),r.forEach(function(e,t){var r=void 0;"number"===g?r=ee(e):"integer"===g?r=te(e):"string"===g&&(r=ie(e)),r&&n.push({index:t,error:r})})}else if("file"===o){var y=ne(r);if(!y)return n;n.push(y)}}return n},t.getSampleSchema=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(/xml/.test(t)){if(!e.xml||!e.xml.name){if(e.xml=e.xml||{},!e.$$ref)return e.type||e.items||e.properties||e.additionalProperties?'\n\x3c!-- XML example cannot be generated --\x3e':null;var r=e.$$ref.match(/\S*\/(\S+)$/);e.xml.name=r[1]}return(0,X.memoizedCreateXMLExample)(e,n)}return(0,E.default)((0,X.memoizedSampleFromSchema)(e,n),null,2)},t.parseSearch=function(){var e={},t=window.location.search;if(""!=t){var n=t.substr(1).split("&");for(var r in n)r=n[r].split("="),e[decodeURIComponent(r[0])]=decodeURIComponent(r[1])}return e},t.btoa=function(t){var n=void 0;return n=t instanceof e?t:new e(t.toString(),"utf-8"),n.toString("base64")},t.sorters={operationsSorter:{alpha:function(e,t){return e.get("path").localeCompare(t.get("path"))},method:function(e,t){return e.get("method").localeCompare(t.get("method"))}},tagsSorter:{alpha:function(e,t){return e.localeCompare(t)}}},t.buildFormData=function(e){var t=[];for(var n in e){var r=e[n];void 0!==r&&""!==r&&t.push([n,"=",encodeURIComponent(r).replace(/%20/g,"+")].join(""))}return t.join("&")},t.shallowEqualKeys=function(e,t,n){return!!(0,K.default)(n,function(n){return(0,J.default)(e[n],t[n])})}}).call(t,n(44).Buffer)},function(e,t,n){"use strict";function r(e,t){return 1===e.nodeType&&e.getAttribute(d)===String(t)||8===e.nodeType&&e.nodeValue===" react-text: "+t+" "||8===e.nodeType&&e.nodeValue===" react-empty: "+t+" "}function i(e){for(var t;t=e._renderedComponent;)e=t;return e}function o(e,t){var n=i(e);n._hostNode=t,t[v]=n}function a(e){var t=e._hostNode;t&&(delete t[v],e._hostNode=null)}function s(e,t){if(!(e._flags&m.hasCachedChildNodes)){var n=e._renderedChildren,a=t.firstChild;e:for(var s in n)if(n.hasOwnProperty(s)){var u=n[s],c=i(u)._domID;if(0!==c){for(;null!==a;a=a.nextSibling)if(r(a,c)){o(u,a);continue e}p("32",c)}}e._flags|=m.hasCachedChildNodes}}function u(e){if(e[v])return e[v];for(var t=[];!e[v];){if(t.push(e),!e.parentNode)return null;e=e.parentNode}for(var n,r;e&&(r=e[v]);e=t.pop())n=r,t.length&&s(r,e);return n}function c(e){var t=u(e);return null!=t&&t._hostNode===e?t:null}function l(e){if(void 0===e._hostNode&&p("33"),e._hostNode)return e._hostNode;for(var t=[];!e._hostNode;)t.push(e),e._hostParent||p("34"),e=e._hostParent;for(;t.length;e=t.pop())s(e,e._hostNode);return e._hostNode}var p=n(9),f=n(83),h=n(411),d=(n(7),f.ID_ATTRIBUTE_NAME),m=h,v="__reactInternalInstance$"+Math.random().toString(36).slice(2),g={getClosestInstanceFromNode:u,getInstanceFromNode:c,getNodeFromInstance:l,precacheChildNodes:s,precacheNode:o,uncacheNode:a};e.exports=g},function(e,t){var n=e.exports={version:"2.5.0"};"number"==typeof __e&&(__e=n)},function(e,t,n){"use strict";function r(e){var t={};return null!==e&&Object.keys(e).forEach(function(n){e[n].forEach(function(e){t[String(e)]=n})}),t}function i(e,t){if(t=t||{},Object.keys(t).forEach(function(t){if(-1===a.indexOf(t))throw new o('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')}),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.defaultStyle=t.defaultStyle||null,this.styleAliases=r(t.styleAliases||null),-1===s.indexOf(this.kind))throw new o('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}var o=n(106),a=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],s=["scalar","sequence","mapping"];e.exports=i},function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){var r=n(181)("wks"),i=n(130),o=n(21).Symbol,a="function"==typeof o;(e.exports=function(e){return r[e]||(r[e]=a&&o[e]||(a?o:i)("Symbol."+e))}).store=r},function(e,t,n){"use strict";t.__esModule=!0;var r=n(33),i=function(e){return e&&e.__esModule?e:{default:e}}(r);t.default=i.default||function(e){for(var t=1;t5?c-5:0),p=5;p5?c-5:0),p=5;ps&&(n=s-u),c=n;c>=0;c--){for(var p=!0,f=0;fi&&(r=i):r=i;var o=t.length;if(o%2!=0)throw new TypeError("Invalid hex string");r>o/2&&(r=o/2);for(var a=0;a