frontexpress/frontexpress.min.js.map
2017-05-26 14:25:37 +02:00

1 line
31 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"file":null,"sources":["lib/application.js","lib/methods.js","lib/requester.js","lib/settings.js","lib/middleware.js","lib/router.js","lib/frontexpress.js"],"sourcesContent":["/**\n * Module dependencies.\n * @private\n */\n\nimport HTTP_METHODS from './methods';\nimport Settings from './settings';\nimport Router, {Route} from './router';\nimport Middleware from './middleware';\n\n\n/**\n * Application class.\n */\n\nexport default class Application {\n\n\n /**\n * Initialize the application.\n *\n * - setup default configuration\n *\n * @private\n */\n\n constructor() {\n this.routers = [];\n // this.isDOMLoaded = false;\n // this.isDOMReady = false;\n this.settings = new Settings();\n }\n\n\n /**\n * Assign `setting` to `val`, or return `setting`'s value.\n *\n * app.set('foo', 'bar');\n * app.set('foo');\n * // => \"bar\"\n *\n * @param {String} setting\n * @param {*} [val]\n * @return {app} for chaining\n * @public\n */\n\n set(...args) {\n // get behaviour\n if (args.length === 1) {\n return this.settings.get([args]);\n }\n\n // set behaviour\n const [name, value] = args;\n this.settings.set(name, value);\n\n return this;\n }\n\n\n /**\n * Listen for DOM initialization and history state changes.\n *\n * The callback function is called once the DOM has\n * the `document.readyState` equals to 'interactive'.\n *\n * app.listen(()=> {\n * console.log('App is listening requests');\n * console.log('DOM is ready!');\n * });\n *\n *\n * @param {Function} callback\n * @public\n */\n\n listen(callback) {\n\n // manage history\n window.onpopstate = (event) => {\n if (event.state) {\n const {request, response} = event.state;\n const currentRoutes = this._routes(request.uri, request.method);\n\n this._callMiddlewareMethod('entered', currentRoutes, request);\n this._callMiddlewareMethod('updated', currentRoutes, request, response);\n }\n };\n\n // manage page loading/refreshing\n const request = {method: 'GET', uri: window.location.pathname + window.location.search};\n const response = {status: 200, statusText: 'OK'};\n const currentRoutes = this._routes();\n\n const whenPageIsInteractiveFn = () => {\n this._callMiddlewareMethod('updated', currentRoutes, request, response);\n if (callback) {\n callback(request, response);\n }\n };\n\n window.onbeforeunload = () => {\n this._callMiddlewareMethod('exited');\n };\n\n document.onreadystatechange = () => {\n // DOM ready state\n switch (document.readyState) {\n case 'loading':\n this._callMiddlewareMethod('entered', currentRoutes, request);\n break;\n case 'interactive':\n whenPageIsInteractiveFn();\n break;\n }\n };\n\n if (['interactive', 'complete'].indexOf(document.readyState) !== -1) {\n whenPageIsInteractiveFn();\n }\n }\n\n\n /**\n * Returns a new `Router` instance for the _uri_.\n * See the Router api docs for details.\n *\n * app.route('/');\n * // => new Router instance\n *\n * @param {String} uri\n * @return {Router} for chaining\n *\n * @public\n */\n\n route(uri) {\n const router = new Router(uri);\n this.routers.push(router);\n return router;\n }\n\n\n /**\n * Use the given middleware function or object, with optional _uri_.\n * Default _uri_ is \"/\".\n *\n * // middleware function will be applied on path \"/\"\n * app.use((req, res, next) => {console.log('Hello')});\n *\n * // middleware object will be applied on path \"/\"\n * app.use(new Middleware());\n *\n * @param {String} uri\n * @param {Middleware|Function} middleware object or function\n * @return {app} for chaining\n *\n * @public\n */\n\n use(...args) {\n let {baseUri, router, middleware} = toParameters(args);\n if (router) {\n router.baseUri = baseUri;\n } else if (middleware) {\n router = new Router(baseUri);\n HTTP_METHODS.forEach((method) => {\n router[method.toLowerCase()](middleware);\n });\n } else {\n throw new TypeError('method takes at least a middleware or a router');\n }\n this.routers.push(router);\n\n return this;\n }\n\n\n /**\n * Gather routes from all routers filtered by _uri_ and HTTP _method_.\n * See Router#routes() documentation for details.\n *\n * @private\n */\n\n _routes(uri=window.location.pathname + window.location.search, method='GET') {\n const currentRoutes = [];\n this.routers.forEach((router) => {\n currentRoutes.push(...router.routes(uri, method));\n });\n\n return currentRoutes;\n }\n\n\n /**\n * Call `Middleware` method or middleware function on _currentRoutes_.\n *\n * @private\n */\n\n _callMiddlewareMethod(meth, currentRoutes, request, response) {\n if (meth === 'exited') {\n // currentRoutes, request, response params not needed\n this.routers.forEach((router) => {\n router.visited().forEach((route) => {\n if (route.middleware.exited) {\n route.middleware.exited(route.visited);\n route.visited = null;\n }\n });\n });\n return;\n }\n\n currentRoutes.some((route) => {\n if (meth === 'updated') {\n route.visited = request;\n }\n\n if (route.middleware[meth]) {\n route.middleware[meth](request, response);\n if (route.middleware.next && !route.middleware.next()) {\n return true;\n }\n } else if (meth !== 'entered') {\n // calls middleware method\n let breakMiddlewareLoop = true;\n const next = () => {\n breakMiddlewareLoop = false;\n };\n route.middleware(request, response, next);\n if (breakMiddlewareLoop) {\n return true;\n }\n }\n\n return false;\n });\n }\n\n\n /**\n * Make an ajax request. Manage History#pushState if history object set.\n *\n * @private\n */\n\n _fetch(req, resolve, reject) {\n let {method, uri, headers, data, history} = req;\n\n const httpMethodTransformer = this.get(`http ${method} transformer`);\n if (httpMethodTransformer) {\n const {uri: _uriFn, headers: _headersFn, data: _dataFn } = httpMethodTransformer;\n uri = _uriFn ? _uriFn({uri, headers, data}) : uri;\n headers = _headersFn ? _headersFn({uri, headers, data}) : headers;\n data = _dataFn ? _dataFn({uri, headers, data}) : data;\n }\n\n // calls middleware exited method\n this._callMiddlewareMethod('exited');\n\n // gathers all routes impacted by the uri\n const currentRoutes = this._routes(uri, method);\n\n // calls middleware entered method\n this._callMiddlewareMethod('entered', currentRoutes, req);\n\n // invokes http request\n this.settings.get('http requester').fetch(req,\n (request, response) => {\n if (history) {\n window.history.pushState({request, response}, history.title, history.uri);\n }\n this._callMiddlewareMethod('updated', currentRoutes, request, response);\n if (resolve) {\n resolve(request, response);\n }\n },\n (request, response) => {\n this._callMiddlewareMethod('failed', currentRoutes, request, response);\n if (reject) {\n reject(request, response);\n }\n });\n }\n}\n\nHTTP_METHODS.reduce((reqProto, method) => {\n\n\n /**\n * Use the given middleware function or object, with optional _uri_ on\n * HTTP methods: get, post, put, delete...\n * Default _uri_ is \"/\".\n *\n * // middleware function will be applied on path \"/\"\n * app.get((req, res, next) => {console.log('Hello')});\n *\n * // middleware object will be applied on path \"/\" and\n * app.get(new Middleware());\n *\n * // get a setting value\n * app.set('foo', 'bar');\n * app.get('foo');\n * // => \"bar\"\n *\n * @param {String} uri or setting\n * @param {Middleware|Function} middleware object or function\n * @return {app} for chaining\n * @public\n */\n\n const middlewareMethodName = method.toLowerCase();\n reqProto[middlewareMethodName] = function(...args) {\n let {baseUri, middleware, which} = toParameters(args);\n if (middlewareMethodName === 'get' && typeof which === 'string') {\n return this.settings.get(which);\n }\n if (!middleware) {\n throw new TypeError(`method takes a middleware ${middlewareMethodName === 'get' ? 'or a string' : ''}`);\n }\n const router = new Router();\n router[middlewareMethodName](baseUri, middleware);\n\n this.routers.push(router);\n\n return this;\n };\n\n /**\n * Ajax request (get, post, put, delete...).\n *\n * // HTTP GET method\n * httpGet('/route1');\n *\n * // HTTP GET method\n * httpGet({uri: '/route1', data: {'p1': 'val1'});\n * // uri invoked => /route1?p1=val1\n *\n * // HTTP GET method with browser history management\n * httpGet({uri: '/api/users', history: {state: {foo: \"bar\"}, title: 'users page', uri: '/view/users'});\n *\n * Samples above can be applied on other HTTP methods.\n *\n * @param {String|Object} uri or object containing uri, http headers, data, history\n * @param {Function} success callback\n * @param {Function} failure callback\n * @public\n */\n const httpMethodName = 'http'+method.charAt(0).toUpperCase() + method.slice(1).toLowerCase();\n reqProto[httpMethodName] = function(request, resolve, reject) {\n let {uri, headers, data, history} = request;\n if (!uri) {\n uri = request;\n }\n return this._fetch({\n uri,\n method,\n headers,\n data,\n history\n }, resolve, reject);\n };\n\n return reqProto;\n}, Application.prototype);\n\n\nexport function toParameters(args) {\n let baseUri, middleware, router, which;\n if (args && args.length > 0) {\n if (args.length === 1) {\n [which,] = args;\n } else {\n [baseUri, which,] = args;\n }\n\n if (which instanceof Router) {\n router = which;\n } else if ((which instanceof Middleware) || (typeof which === 'function')) {\n middleware = which;\n }\n }\n return {baseUri, middleware, router, which};\n}\n","/**\n * HTTP method list\n * @private\n */\n\n export default ['GET', 'POST', 'PUT', 'DELETE'];\n // not supported yet\n // HEAD', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH';\n","/**\n * Module dependencies.\n * @private\n */\n\nexport default class Requester {\n\n /**\n * Make an ajax request.\n *\n * @param {Object} request\n * @param {Function} success callback\n * @param {Function} failure callback\n * @private\n */\n\n fetch(request, resolve, reject) {\n const {method, uri, headers, data} = request;\n\n const success = (responseText) => {\n resolve(\n request,\n {\n status: 200,\n statusText: 'OK',\n responseText\n }\n );\n };\n\n const fail = ({status, statusText, errorThrown}) => {\n reject(\n request,\n {\n status,\n statusText,\n errorThrown,\n errors: `HTTP ${status} ${statusText?statusText:''}`\n }\n );\n };\n\n const xmlhttp = new XMLHttpRequest();\n xmlhttp.onreadystatechange = () => {\n if (xmlhttp.readyState === 4) { //XMLHttpRequest.DONE\n if (xmlhttp.status === 200) {\n success(xmlhttp.responseText);\n } else {\n fail({status: xmlhttp.status, statusText: xmlhttp.statusText});\n }\n }\n };\n try {\n xmlhttp.open(method, uri, true);\n if (headers) {\n Object.keys(headers).forEach((header) => {\n xmlhttp.setRequestHeader(header, headers[header]);\n });\n }\n if (data) {\n xmlhttp.send(data);\n } else {\n xmlhttp.send();\n }\n } catch (errorThrown) {\n fail({errorThrown});\n }\n }\n}\n","/**\n * Module dependencies.\n * @private\n */\n\nimport Requester from './requester';\n\n\n/**\n * Settings object.\n * @private\n */\n\nexport default class Settings {\n\n\n /**\n * Initialize the settings.\n *\n * - setup default configuration\n *\n * @private\n */\n\n constructor() {\n // default settings\n this.settings = {\n 'http requester': new Requester(),\n\n 'http GET transformer': {\n uri({uri, headers, data}) {\n if (!data) {\n return uri;\n }\n let [uriWithoutAnchor, anchor] = [uri, ''];\n const match = /^(.*)(#.*)$/.exec(uri);\n if (match) {\n [,uriWithoutAnchor, anchor] = /^(.*)(#.*)$/.exec(uri);\n }\n uriWithoutAnchor = Object.keys(data).reduce((gUri, d, index) => {\n gUri += `${(index === 0 && gUri.indexOf('?') === -1)?'?':'&'}${d}=${data[d]}`;\n return gUri;\n }, uriWithoutAnchor);\n return uriWithoutAnchor + anchor;\n }\n }\n // 'http POST transformer': {\n // headers({uri, headers, data}) {\n // if (!data) {\n // return headers;\n // }\n // const updatedHeaders = headers || {};\n // if (!updatedHeaders['Content-Type']) {\n // updatedHeaders['Content-Type'] = 'application/x-www-form-urlencoded';\n // }\n // return updatedHeaders;\n // }\n // }\n };\n\n this.rules = {\n 'http requester': (requester) => {\n if(typeof requester.fetch !== 'function') {\n throw new TypeError('setting http requester has no fetch method');\n }\n }\n };\n }\n\n\n /**\n * Assign `setting` to `val`\n *\n * @param {String} setting\n * @param {*} [val]\n * @private\n */\n\n set(name, value) {\n const checkRules = this.rules[name];\n if (checkRules) {\n checkRules(value);\n }\n this.settings[name] = value;\n }\n\n\n /**\n * Return `setting`'s value.\n *\n * @param {String} setting\n * @private\n */\n\n get(name) {\n return this.settings[name];\n }\n};\n","/**\n * Middleware object.\n * @public\n */\n\nexport default class Middleware {\n\n\n /**\n * Middleware initialization\n *\n * @param {String} middleware name\n */\n\n constructor(name='') {\n this.name = name;\n }\n\n /**\n * Invoked by the app before an ajax request is sent or\n * during the DOM loading (document.readyState === 'loading').\n * See Application#_callMiddlewareEntered documentation for details.\n *\n * Override this method to add your custom behaviour\n *\n * @param {Object} request\n * @public\n */\n\n // entered(request) { }\n\n\n /**\n * Invoked by the app before a new ajax request is sent or before the DOM is unloaded.\n * See Application#_callMiddlewareExited documentation for details.\n *\n * Override this method to add your custom behaviour\n *\n * @param {Object} request\n * @public\n */\n\n // exited(request) { }\n\n\n /**\n * Invoked by the app after an ajax request has responded or on DOM ready\n * (document.readyState === 'interactive').\n * See Application#_callMiddlewareUpdated documentation for details.\n *\n * Override this method to add your custom behaviour\n *\n * @param {Object} request\n * @param {Object} response\n * @public\n */\n\n // updated(request, response) { }\n\n\n /**\n * Invoked by the app when an ajax request has failed.\n *\n * Override this method to add your custom behaviour\n *\n * @param {Object} request\n * @param {Object} response\n * @public\n */\n // failed(request, response) { }\n\n\n /**\n * Allow the hand over to the next middleware object or function.\n *\n * Override this method and return `false` to break execution of\n * middleware chain.\n *\n * @return {Boolean} `true` by default\n *\n * @public\n */\n\n next() {\n return true;\n }\n}\n","/**\n * Module dependencies.\n * @private\n */\n\nimport HTTP_METHODS from './methods';\nimport {toParameters} from './application';\nimport Middleware from './middleware';\n\n\n/**\n * Route object.\n * @private\n */\n\nexport class Route {\n\n\n /**\n * Initialize the route.\n *\n * @private\n */\n\n constructor(router, uriPart, method, middleware) {\n this.router = router;\n this.uriPart = uriPart;\n this.method = method;\n this.middleware = middleware;\n this.visited = false;\n }\n\n\n /**\n * Return route's uri.\n *\n * @private\n */\n\n get uri() {\n if (!this.uriPart && !this.method) {\n return undefined;\n }\n\n if (this.uriPart instanceof RegExp) {\n return this.uriPart;\n }\n\n if (this.router.baseUri instanceof RegExp) {\n return this.router.baseUri;\n }\n\n if (this.router.baseUri) {\n const baseUri = this.router.baseUri.trim();\n if (this.uriPart) {\n return ( baseUri + this.uriPart.trim()).replace(/\\/{2,}/, '/');\n }\n return baseUri;\n }\n\n return this.uriPart;\n }\n}\n\n\n/**\n * Router object.\n * @public\n */\n\nconst error_middleware_message = 'method takes at least a middleware';\nexport default class Router {\n\n\n /**\n * Initialize the router.\n *\n * @private\n */\n\n constructor(uri) {\n this._baseUri = uri;\n this._routes = [];\n }\n\n\n /**\n * Do some checks and set _baseUri.\n *\n * @private\n */\n\n set baseUri(uri) {\n if (!uri) {\n return;\n }\n\n if (!this._baseUri) {\n this._baseUri = uri;\n return;\n }\n\n if (typeof this._baseUri !== typeof uri) {\n throw new TypeError('router cannot mix regexp and uri');\n }\n }\n\n\n /**\n * Return router's _baseUri.\n *\n * @private\n */\n\n get baseUri() {\n return this._baseUri;\n }\n\n\n /**\n * Add a route to the router.\n *\n * @private\n */\n\n _add(route) {\n this._routes.push(route);\n return this;\n }\n\n\n /**\n * Gather routes from routers filtered by _uri_ and HTTP _method_.\n *\n * @private\n */\n\n routes(uri, method) {\n return this._routes.filter((route) => {\n if (route.method && route.method !== method) {\n return false;\n }\n\n if (!route.uri || !uri) {\n return true;\n }\n\n //remove query string from uri to test\n //remove anchor from uri to test\n const match = /^(.*)\\?.*#.*|(.*)(?=\\?|#)|(.*[^\\?#])$/.exec(uri);\n const baseUriToCheck = match[1] || match[2] || match[3];\n\n if (route.uri instanceof RegExp) {\n return baseUriToCheck.match(route.uri);\n }\n\n return route.uri === baseUriToCheck;\n });\n }\n\n\n /**\n * Gather visited routes from routers.\n *\n * @private\n */\n\n visited() {\n return this._routes.filter(route => route.visited);\n }\n\n\n /**\n * Use the given middleware function or object on this router.\n *\n * // middleware function\n * router.use((req, res, next) => {console.log('Hello')});\n *\n * // middleware object\n * router.use(new Middleware());\n *\n * @param {Middleware|Function} middleware object or function\n * @return {Router} for chaining\n *\n * @public\n */\n\n use(middleware) {\n if (!(middleware instanceof Middleware) && (typeof middleware !== 'function') ) {\n throw new TypeError(error_middleware_message);\n }\n\n this._add(new Route(this, undefined, undefined, middleware));\n\n return this;\n }\n\n\n /**\n * Use the given middleware function or object on this router for\n * all HTTP methods.\n *\n * // middleware function\n * router.all((req, res, next) => {console.log('Hello')});\n *\n * // middleware object\n * router.all(new Middleware());\n *\n * @param {Middleware|Function} middleware object or function\n * @return {Router} for chaining\n *\n * @public\n */\n\n all(...args) {\n const {middleware} = toParameters(args);\n if (!middleware) {\n throw new TypeError(error_middleware_message);\n }\n\n HTTP_METHODS.forEach((method) => {\n this[method.toLowerCase()](...args);\n });\n return this;\n }\n}\n\nHTTP_METHODS.forEach((method) => {\n\n\n /**\n * Use the given middleware function or object, with optional _uri_ on\n * HTTP methods: get, post, put, delete...\n * Default _uri_ is \"/\".\n *\n * // middleware function will be applied on path \"/\"\n * router.get((req, res, next) => {console.log('Hello')});\n *\n * // middleware object will be applied on path \"/\" and\n * router.get(new Middleware());\n *\n * // middleware function will be applied on path \"/user\"\n * router.post('/user', (req, res, next) => {console.log('Hello')});\n *\n * // middleware object will be applied on path \"/user\" and\n * router.post('/user', new Middleware());\n *\n * @param {String} uri\n * @param {Middleware|Function} middleware object or function\n * @return {Router} for chaining\n * @public\n */\n\n const methodName = method.toLowerCase();\n Router.prototype[methodName] = function(...args) {\n const {baseUri, middleware} = toParameters(args);\n if (!middleware) {\n throw new TypeError(error_middleware_message);\n }\n\n if (baseUri && this._baseUri && this._baseUri instanceof RegExp) {\n throw new TypeError('router cannot mix uri/regexp');\n }\n\n this._add(new Route(this, baseUri, method, middleware));\n\n return this;\n };\n});\n","/**\n * Module dependencies.\n */\n\nimport Application from './application';\nimport Router from './router';\nimport Middleware from './middleware';\n\n\n/**\n * Create a frontexpress application.\n *\n * @return {Function}\n * @api public\n */\n\nconst frontexpress = () => new Application();\n\n/**\n * Expose Router, Middleware constructors.\n */\nfrontexpress.Router = (baseUri) => new Router(baseUri);\nfrontexpress.Middleware = Middleware;\n\nexport default frontexpress;\n"],"names":["toParameters","args","baseUri","middleware","router","which","length","Router","Middleware","Requester","request","resolve","reject","method","uri","headers","data","success","responseText","fail","status","statusText","errorThrown","xmlhttp","XMLHttpRequest","onreadystatechange","readyState","open","keys","forEach","header","setRequestHeader","send","Settings","settings","uriWithoutAnchor","anchor","exec","Object","reduce","gUri","d","index","indexOf","rules","requester","fetch","TypeError","name","value","checkRules","this","Route","uriPart","visited","RegExp","trim","replace","_baseUri","_routes","route","push","filter","match","baseUriToCheck","_add","undefined","toLowerCase","babelHelpers.typeof","methodName","prototype","Application","routers","get","set","callback","onpopstate","event","state","response","currentRoutes","_this","_callMiddlewareMethod","window","location","pathname","search","whenPageIsInteractiveFn","onbeforeunload","document","routes","meth","exited","some","next","breakMiddlewareLoop","req","history","httpMethodTransformer","_uriFn","_headersFn","_dataFn","pushState","title","reqProto","middlewareMethodName","charAt","toUpperCase","slice","_fetch","frontexpress"],"mappings":"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"}