diff --git a/lib/pretender-hacks.js b/lib/pretender-hacks.js index 174625a..2e26aef 100644 --- a/lib/pretender-hacks.js +++ b/lib/pretender-hacks.js @@ -1,4 +1,10 @@ import qs from 'qs'; +import chalk from 'chalk'; +import Inflector from 'i'; +import { classify } from 'ember-cli-string-utils'; + +const { singularize } = Inflector(); +const targetNamespace = typeof global === 'object' ? global : window; // HACK START: Pretender Request Parameter Type Casting Hack: Because types are important. window.Pretender.prototype._handlerFor = function(verb, url, request) { @@ -124,3 +130,53 @@ function getDefaultStatusCode(verb) { return 500; } // END: Pretender Response Defaults UX Hack + + +// HACK: Pretender REST defaults hack: For better UX +['get', 'put', 'post', 'delete'].forEach((verb) => { + window.Pretender.prototype[verb] = function (path, handler, async) { + const fullPath = (this.urlPrefix || '') + (this.namespace ? ('/' + this.namespace) : '') + path; + const targetHandler = handler || getDefaultRouteHandler(verb.toUpperCase(), fullPath); + const timing = async ? async.timing || this.timing : this.timing; + // console.log('timing is', timing); + // console.log('async is', async); + return this.register(verb.toUpperCase(), fullPath, targetHandler, timing); + } +}); +// END: Pretender REST default hack: For better UX + +function getDefaultRouteHandler(verb, path) { + const paths = path.split(/\//g); + const lastPath = paths[paths.length - 1]; + const pluralResourceName = lastPath.includes(':') ? paths[paths.length - 2] : lastPath; + const resourceName = singularize(pluralResourceName); + const ResourceModel = targetNamespace.MemServer.Models[classify(resourceName)]; + + if (!ResourceModel) { + throw new Error(chalk.red(`[MemServer] ${verb} ${path} route handler cannot be generated automatically: ${classify(resourceName)} is not a valid MemServer.Model, please check that your route name matches the model reference or create a custom handler function`)); + } else if (verb === 'GET') { + if (lastPath.includes(':')) { + return (request) => { + return { [resourceName]: ResourceModel.serializer(ResourceModel.find(request.params.id)) }; + } + } + + return (request) => { + return { [pluralResourceName]: ResourceModel.serializer(ResourceModel.findAll()) }; + }; + } else if (verb === 'POST') { + return (request) => { + const resourceParams = request.params[resourceName]; + + return { [resourceName]: ResourceModel.serializer(ResourceModel.insert(resourceParams)) }; + }; + } else if (verb === 'PUT') { + return (request) => { + const resourceParams = request.params[resourceName]; + + return { [resourceName]: ResourceModel.serializer(ResourceModel.update(resourceParams)) }; + }; + } else if (verb === 'DELETE') { + return (request) => { ResourceModel.delete({ id: request.params.id }) }; + } +} diff --git a/lib/server.js b/lib/server.js index 614521f..a0a78a7 100644 --- a/lib/server.js +++ b/lib/server.js @@ -13,19 +13,6 @@ export default function(Server, options={}) { window.Pretender.prototype.urlPrefix = options.urlPrefix; window.Pretender.prototype.timing = options.timing; - // HACK: Pretender REST defaults hack: For better UX - ['get', 'put', 'post', 'delete'].forEach((verb) => { - window.Pretender.prototype[verb] = function (path, handler, async) { - const fullPath = (this.urlPrefix || '') + (this.namespace ? ('/' + this.namespace) : '') + path; - const targetHandler = handler || getDefaultRouteHandler(verb.toUpperCase(), fullPath); - const timing = async ? async.timing || this.timing : this.timing; - // console.log('timing is', timing); - // console.log('async is', async); - return this.register(verb.toUpperCase(), fullPath, targetHandler, timing); - } - }); - // END: Pretender REST default hack: For better UX - let pretender = new window.Pretender(function() { const MemServer = chalk.cyan('[MemServer]'); @@ -72,42 +59,6 @@ export default function(Server, options={}) { return pretender; } -function getDefaultRouteHandler(verb, path) { - const paths = path.split(/\//g); - const lastPath = paths[paths.length - 1]; - const pluralResourceName = lastPath.includes(':') ? paths[paths.length - 2] : lastPath; - const resourceName = singularize(pluralResourceName); - const ResourceModel = targetNamespace.MemServer.Models[classify(resourceName)]; - - if (!ResourceModel) { - throw new Error(chalk.red(`[MemServer] ${verb} ${path} route handler cannot be generated automatically: ${classify(resourceName)} is not a valid MemServer.Model, please check that your route name matches the model reference or create a custom handler function`)); - } else if (verb === 'GET') { - if (lastPath.includes(':')) { - return (request) => { - return { [resourceName]: ResourceModel.serializer(ResourceModel.find(request.params.id)) }; - } - } - - return (request) => { - return { [pluralResourceName]: ResourceModel.serializer(ResourceModel.findAll()) }; - }; - } else if (verb === 'POST') { - return (request) => { - const resourceParams = request.params[resourceName]; - - return { [resourceName]: ResourceModel.serializer(ResourceModel.insert(resourceParams)) }; - }; - } else if (verb === 'PUT') { - return (request) => { - const resourceParams = request.params[resourceName]; - - return { [resourceName]: ResourceModel.serializer(ResourceModel.update(resourceParams)) }; - }; - } else if (verb === 'DELETE') { - return (request) => { ResourceModel.delete({ id: request.params.id }) }; - } -} - function colorStatusCode(statusCode) { if (statusCode === 200 || statusCode === 201) { return chalk.green(statusCode); diff --git a/rollup.config.js b/rollup.config.js index 36311f4..581e170 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -43,6 +43,8 @@ const modelFixtureTreeCode = '{' + modelFileNames.reduce((string, modelFileName) }` }, '') + `}`; +// TODO: INVESTIGATE ROLLUP: inject targetMemServer, modelFixtureTree from NODE -> BROWSER without dynamic import problem + export default { input: 'lib/mem-server.js', output: {