Skip to content

Commit 1774562

Browse files
author
Tobias Feijten
committed
Add tests for defaults and add support for explicit inclusion of default values in url generation
1 parent 14f5c5e commit 1774562

File tree

4 files changed

+60
-3
lines changed

4 files changed

+60
-3
lines changed

Resources/js/router.test.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,53 @@ function testGenerateSupportsHostPlaceholdersDefaults() {
154154
assertEquals('http://api.localhost/foo/bar', router.generate('homepage'));
155155
}
156156

157+
function testGenerateSupportsNonOptionalPlaceholderDefaults() {
158+
var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, {
159+
homepage: {
160+
tokens: [['text', '/bar'],['variable', '/','', 'page']],
161+
defaults: {page: 'api'},
162+
requirements: {},
163+
hosttokens: [
164+
['text', 'localhost']
165+
]
166+
}
167+
});
168+
169+
assertEquals('/foo/api/bar', router.generate('homepage'));
170+
}
171+
172+
function testGenerateSupportsOptionalPlaceholderDefaults() {
173+
var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, {
174+
homepage: {
175+
tokens: [['variable', '/','', 'page'],['text', '/bar']],
176+
defaults: {page: 'api'},
177+
requirements: {},
178+
hosttokens: [
179+
['text', 'localhost']
180+
]
181+
}
182+
});
183+
184+
assertEquals('/foo/bar', router.generate('homepage'));
185+
}
186+
187+
function testGenerateSupportsExplicitNonOptionalPlaceholderDefaults() {
188+
var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, {
189+
homepage: {
190+
tokens: [['variable', '/','', '!page'],['text', '/bar']],
191+
defaults: {page: 'api'},
192+
requirements: {},
193+
hosttokens: [
194+
['text', 'localhost']
195+
]
196+
}
197+
});
198+
199+
assertEquals('/foo/bar/api', router.generate('homepage'));
200+
}
201+
202+
203+
157204
function testGenerateGeneratesRelativePathWhenTheSameHostGiven() {
158205
var router = new fos.Router({base_url: '/foo', host: "api.localhost", scheme: "http"}, {
159206
homepage: {

Resources/js/router.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,10 @@ export class Router {
202202
}
203203

204204
if ('variable' === token[0]) {
205+
if (typeof token[3] === 'string' && token[3][0] === '!') { // If parameter starts with exclamation mark, always include in path
206+
token[3] = token[3].substring(1); // Remove the exclamation mark
207+
optional = false;
208+
}
205209
let hasDefault = route.defaults && !Array.isArray(route.defaults) && typeof token[3] === 'string' && (token[3] in route.defaults);
206210
if (false === optional || !hasDefault || ((typeof token[3] === 'string' && token[3] in params) && !Array.isArray(route.defaults) && params[token[3]] != route.defaults[token[3]])) {
207211
let value;

Resources/public/js/router.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ exports["default"] = exports.Routing = exports.Router = void 0;
2626

2727
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2828

29-
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
29+
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
3030

3131
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3232

3333
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
3434

35-
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
35+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
3636

3737
var Router = /*#__PURE__*/function () {
3838
function Router(context, routes) {
@@ -211,6 +211,12 @@ var Router = /*#__PURE__*/function () {
211211
}
212212

213213
if ('variable' === token[0]) {
214+
if (typeof token[3] === 'string' && token[3][0] === '!') {
215+
token[3] = token[3].substring(1); // Remove the exclamation mark
216+
217+
optional = false;
218+
}
219+
214220
var hasDefault = route.defaults && !Array.isArray(route.defaults) && typeof token[3] === 'string' && token[3] in route.defaults;
215221

216222
if (false === optional || !hasDefault || typeof token[3] === 'string' && token[3] in params && !Array.isArray(route.defaults) && params[token[3]] != route.defaults[token[3]]) {

Resources/public/js/router.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)