mirror of
https://github.com/kevin-DL/sapper.git
synced 2026-01-16 04:44:35 +00:00
@@ -1,7 +1,7 @@
|
|||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
|
||||||
module.exports = function create_matchers(files) {
|
module.exports = function create_matchers(files) {
|
||||||
return files
|
const routes = files
|
||||||
.map(file => {
|
.map(file => {
|
||||||
if (/(^|\/|\\)_/.test(file)) return;
|
if (/(^|\/|\\)_/.test(file)) return;
|
||||||
|
|
||||||
@@ -47,9 +47,31 @@ module.exports = function create_matchers(files) {
|
|||||||
})
|
})
|
||||||
.filter(Boolean)
|
.filter(Boolean)
|
||||||
.sort((a, b) => {
|
.sort((a, b) => {
|
||||||
return (
|
let same = true;
|
||||||
(a.dynamic.length - b.dynamic.length) || // match static paths first
|
|
||||||
(b.parts.length - a.parts.length) // match longer paths first
|
for (let i = 0; true; i += 1) {
|
||||||
);
|
const a_part = a.parts[i];
|
||||||
|
const b_part = b.parts[i];
|
||||||
|
|
||||||
|
if (!a_part && !b_part) {
|
||||||
|
if (same) throw new Error(`The ${a.file} and ${b.file} routes clash`);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!a_part) return 1;
|
||||||
|
if (!b_part) return -1;
|
||||||
|
|
||||||
|
const a_is_dynamic = a_part[0] === '[';
|
||||||
|
const b_is_dynamic = b_part[0] === '[';
|
||||||
|
|
||||||
|
if (a_is_dynamic === b_is_dynamic) {
|
||||||
|
if (!a_is_dynamic) same = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return a_is_dynamic ? 1 : -1;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return routes;
|
||||||
}
|
}
|
||||||
@@ -5,15 +5,17 @@ const create_routes = require('../../lib/utils/create_routes.js');
|
|||||||
|
|
||||||
describe('create_routes', () => {
|
describe('create_routes', () => {
|
||||||
it('sorts routes correctly', () => {
|
it('sorts routes correctly', () => {
|
||||||
const routes = create_routes(['index.html', 'about.html', '[wildcard].html', 'post/[id].html']);
|
const routes = create_routes(['index.html', 'about.html', '[wildcard].html', 'post/foo.html', 'post/[id].html', 'post/bar.html']);
|
||||||
|
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
routes.map(r => r.file),
|
routes.map(r => r.file),
|
||||||
[
|
[
|
||||||
'about.html',
|
'post/foo.html',
|
||||||
'index.html',
|
'post/bar.html',
|
||||||
'post/[id].html',
|
'post/[id].html',
|
||||||
'[wildcard].html'
|
'about.html',
|
||||||
|
'[wildcard].html',
|
||||||
|
'index.html'
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@@ -48,4 +50,25 @@ describe('create_routes', () => {
|
|||||||
]
|
]
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('matches /foo/:bar before /:baz/qux', () => {
|
||||||
|
const a = create_routes(['foo/[bar].html', '[baz]/qux.html']);
|
||||||
|
const b = create_routes(['[baz]/qux.html', 'foo/[bar].html']);
|
||||||
|
|
||||||
|
assert.deepEqual(
|
||||||
|
a.map(r => r.file),
|
||||||
|
['foo/[bar].html', '[baz]/qux.html']
|
||||||
|
);
|
||||||
|
|
||||||
|
assert.deepEqual(
|
||||||
|
b.map(r => r.file),
|
||||||
|
['foo/[bar].html', '[baz]/qux.html']
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('fails if routes are indistinguishable', () => {
|
||||||
|
assert.throws(() => {
|
||||||
|
create_routes(['[foo].html', '[bar]/index.html']);
|
||||||
|
}, /The \[foo\].html and \[bar\]\/index.html routes clash/);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
Reference in New Issue
Block a user