diff --git a/Resources/.gitignore b/Resources/.gitignore new file mode 100644 index 00000000..ea0b6b75 --- /dev/null +++ b/Resources/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +yarn.lock +package-lock.json diff --git a/Resources/js/router.js b/Resources/js/router.js index 1119c557..d32801dd 100644 --- a/Resources/js/router.js +++ b/Resources/js/router.js @@ -295,13 +295,13 @@ class Router { // Foo-bar! url = this.context_.base_url + url; if (route.requirements && ("_scheme" in route.requirements) && this.getScheme() != route.requirements["_scheme"]) { - url = route.requirements["_scheme"] + "://" + (host || this.getHost()) + url; + url = route.requirements["_scheme"] + "://" + (host || this.getHost()) + ('' === port ? '' : ':' + port) + url; } else if ("undefined" !== typeof route.schemes && "undefined" !== typeof route.schemes[0] && this.getScheme() !== route.schemes[0]) { - url = route.schemes[0] + "://" + (host || this.getHost()) + url; + url = route.schemes[0] + "://" + (host || this.getHost()) + ('' === port ? '' : ':' + port) + url; } else if (host && this.getHost() !== host + ('' === port ? '' : ':' + port)) { url = this.getScheme() + "://" + host + ('' === port ? '' : ':' + port) + url; } else if (absolute === true) { - url = this.getScheme() + "://" + this.getHost() + url; + url = this.getScheme() + "://" + this.getHost() + ('' === port ? '' : ':' + port) + url; } if (Object.keys(unusedParams).length > 0) { diff --git a/Resources/js/router.test.js b/Resources/js/router.test.js index c16a4532..8f03909e 100644 --- a/Resources/js/router.test.js +++ b/Resources/js/router.test.js @@ -183,6 +183,19 @@ function testGenerateUsesAbsoluteUrl() { assertEquals('http://localhost/foo/bar', router.generate('homepage', [], true)); } +function testGenerateUsesAbsoluteUrlWithGivenPort() { + var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http", port: "8000"}, { + homepage: { + tokens: [['text', '/bar']], + defaults: {}, + requirements: {}, + hosttokens: [] + } + }); + + assertEquals('http://localhost:8000/foo/bar', router.generate('homepage', [], true)); +} + function testGenerateUsesAbsoluteUrlWhenSchemeRequirementGiven() { var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, { homepage: { @@ -196,6 +209,19 @@ function testGenerateUsesAbsoluteUrlWhenSchemeRequirementGiven() { assertEquals('http://localhost/foo/bar', router.generate('homepage', [], true)); } +function testGenerateUsesAbsoluteUrlWithGivenPortWhenSchemeRequirementGiven() { + var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http", port: "8080"}, { + homepage: { + tokens: [['text', '/bar']], + defaults: {}, + requirements: {"_scheme": "http"}, + hosttokens: [] + } + }); + + assertEquals('http://localhost:8080/foo/bar', router.generate('homepage', [], true)); +} + function testGenerateUsesAbsoluteUrlWhenSchemeGiven() { var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, { homepage: { @@ -211,6 +237,21 @@ function testGenerateUsesAbsoluteUrlWhenSchemeGiven() { assertEquals('http://localhost/foo/bar', router.generate('homepage', [], true)); } +function testGenerateUsesAbsoluteUrlWithGivenPortWhenSchemeGiven() { + var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http", port:"1234"}, { + homepage: { + tokens: [['text', '/bar']], + defaults: {}, + requirements: {}, + hosttokens: [], + schemes: ['http'], + methods: [] + } + }); + + assertEquals('http://localhost:1234/foo/bar', router.generate('homepage', [], true)); +} + function testGenerateWithOptionalTrailingParam() { var router = new fos.Router({base_url: ''}, { posts: { diff --git a/Resources/public/js/router.js b/Resources/public/js/router.js index fd3f95e5..4fc427f3 100644 --- a/Resources/public/js/router.js +++ b/Resources/public/js/router.js @@ -368,13 +368,13 @@ var Router = function () { // Foo-bar! url = this.context_.base_url + url; if (route.requirements && "_scheme" in route.requirements && this.getScheme() != route.requirements["_scheme"]) { - url = route.requirements["_scheme"] + "://" + (host || this.getHost()) + url; + url = route.requirements["_scheme"] + "://" + (host || this.getHost()) + ('' === port ? '' : ':' + port) + url; } else if ("undefined" !== typeof route.schemes && "undefined" !== typeof route.schemes[0] && this.getScheme() !== route.schemes[0]) { - url = route.schemes[0] + "://" + (host || this.getHost()) + url; + url = route.schemes[0] + "://" + (host || this.getHost()) + ('' === port ? '' : ':' + port) + url; } else if (host && this.getHost() !== host + ('' === port ? '' : ':' + port)) { url = this.getScheme() + "://" + host + ('' === port ? '' : ':' + port) + url; } else if (absolute === true) { - url = this.getScheme() + "://" + this.getHost() + url; + url = this.getScheme() + "://" + this.getHost() + ('' === port ? '' : ':' + port) + url; } if (Object.keys(unusedParams).length > 0) { diff --git a/Resources/public/js/router.min.js b/Resources/public/js/router.min.js index 84b8d420..a6a303a9 100644 --- a/Resources/public/js/router.min.js +++ b/Resources/public/js/router.min.js @@ -1 +1 @@ -!function(e,t){var n=t();"function"==typeof define&&define.amd?define([],n.Routing):"object"==typeof module&&module.exports?module.exports=n.Routing:(e.Routing=n.Routing,e.fos={Router:n.Router})}(this,function(){"use strict";function e(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var t=Object.assign||function(e){for(var t=1;t2&&void 0!==arguments[2]&&arguments[2],i=this.getRoute(e),r=n||{},s=t({},r),u="",c=!0,a="",f="undefined"==typeof this.getPort()||null===this.getPort()?"":this.getPort();if(i.tokens.forEach(function(t){if("text"===t[0])return u=t[1]+u,void(c=!1);{if("variable"!==t[0])throw new Error('The token type "'+t[0]+'" is not supported.');var n=i.defaults&&t[3]in i.defaults;if(!1===c||!n||t[3]in r&&r[t[3]]!=i.defaults[t[3]]){var o=void 0;if(t[3]in r)o=r[t[3]],delete s[t[3]];else{if(!n){if(c)return;throw new Error('The route "'+e+'" requires the parameter "'+t[3]+'".')}o=i.defaults[t[3]]}var a=!0===o||!1===o||""===o;if(!a||!c){var f=encodeURIComponent(o).replace(/%2F/g,"/");"null"===f&&null===o&&(f=""),u=t[1]+f+u}c=!1}else n&&t[3]in s&&delete s[t[3]]}}),""===u&&(u="/"),i.hosttokens.forEach(function(e){var t=void 0;return"text"===e[0]?void(a=e[1]+a):void("variable"===e[0]&&(e[3]in r?(t=r[e[3]],delete s[e[3]]):i.defaults&&e[3]in i.defaults&&(t=i.defaults[e[3]]),a=e[1]+t+a))}),u=this.context_.base_url+u,i.requirements&&"_scheme"in i.requirements&&this.getScheme()!=i.requirements._scheme?u=i.requirements._scheme+"://"+(a||this.getHost())+u:"undefined"!=typeof i.schemes&&"undefined"!=typeof i.schemes[0]&&this.getScheme()!==i.schemes[0]?u=i.schemes[0]+"://"+(a||this.getHost())+u:a&&this.getHost()!==a+(""===f?"":":"+f)?u=this.getScheme()+"://"+a+(""===f?"":":"+f)+u:o===!0&&(u=this.getScheme()+"://"+this.getHost()+u),Object.keys(s).length>0){var l=void 0,h=[],y=function(e,t){t="function"==typeof t?t():t,t=null===t?"":t,h.push(encodeURIComponent(e)+"="+encodeURIComponent(t))};for(l in s)this.buildQueryParams(l,s[l],y);u=u+"?"+h.join("&").replace(/%20/g,"+")}return u}}],[{key:"getInstance",value:function(){return r}},{key:"setData",value:function(e){var t=i.getInstance();t.setRoutingData(e)}}]),i}();i.Route,i.Context;var r=new i;return{Router:i,Routing:r}}); \ No newline at end of file +!function(e,t){var n=t();"function"==typeof define&&define.amd?define([],n.Routing):"object"==typeof module&&module.exports?module.exports=n.Routing:(e.Routing=n.Routing,e.fos={Router:n.Router})}(this,function(){"use strict";function e(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var t=Object.assign||function(e){for(var t=1;t2&&void 0!==arguments[2]&&arguments[2],i=this.getRoute(e),r=n||{},s=t({},r),u="",c=!0,a="",f="undefined"==typeof this.getPort()||null===this.getPort()?"":this.getPort();if(i.tokens.forEach(function(t){if("text"===t[0])return u=t[1]+u,void(c=!1);{if("variable"!==t[0])throw new Error('The token type "'+t[0]+'" is not supported.');var n=i.defaults&&t[3]in i.defaults;if(!1===c||!n||t[3]in r&&r[t[3]]!=i.defaults[t[3]]){var o=void 0;if(t[3]in r)o=r[t[3]],delete s[t[3]];else{if(!n){if(c)return;throw new Error('The route "'+e+'" requires the parameter "'+t[3]+'".')}o=i.defaults[t[3]]}var a=!0===o||!1===o||""===o;if(!a||!c){var f=encodeURIComponent(o).replace(/%2F/g,"/");"null"===f&&null===o&&(f=""),u=t[1]+f+u}c=!1}else n&&t[3]in s&&delete s[t[3]]}}),""===u&&(u="/"),i.hosttokens.forEach(function(e){var t=void 0;return"text"===e[0]?void(a=e[1]+a):void("variable"===e[0]&&(e[3]in r?(t=r[e[3]],delete s[e[3]]):i.defaults&&e[3]in i.defaults&&(t=i.defaults[e[3]]),a=e[1]+t+a))}),u=this.context_.base_url+u,i.requirements&&"_scheme"in i.requirements&&this.getScheme()!=i.requirements._scheme?u=i.requirements._scheme+"://"+(a||this.getHost())+(""===f?"":":"+f)+u:"undefined"!=typeof i.schemes&&"undefined"!=typeof i.schemes[0]&&this.getScheme()!==i.schemes[0]?u=i.schemes[0]+"://"+(a||this.getHost())+(""===f?"":":"+f)+u:a&&this.getHost()!==a+(""===f?"":":"+f)?u=this.getScheme()+"://"+a+(""===f?"":":"+f)+u:o===!0&&(u=this.getScheme()+"://"+this.getHost()+(""===f?"":":"+f)+u),Object.keys(s).length>0){var l=void 0,h=[],y=function(e,t){t="function"==typeof t?t():t,t=null===t?"":t,h.push(encodeURIComponent(e)+"="+encodeURIComponent(t))};for(l in s)this.buildQueryParams(l,s[l],y);u=u+"?"+h.join("&").replace(/%20/g,"+")}return u}}],[{key:"getInstance",value:function(){return r}},{key:"setData",value:function(e){var t=i.getInstance();t.setRoutingData(e)}}]),i}();i.Route,i.Context;var r=new i;return{Router:i,Routing:r}}); \ No newline at end of file