mirror of
https://github.com/kevin-DL/sapper.git
synced 2026-01-11 19:04:30 +00:00
174 lines
4.7 KiB
TypeScript
174 lines
4.7 KiB
TypeScript
import * as path from 'path';
|
|
import * as assert from 'assert';
|
|
import create_manifest_data from '../../../src/core/create_manifest_data';
|
|
|
|
describe('manifest_data', () => {
|
|
it('creates routes', () => {
|
|
const { components, pages, server_routes } = create_manifest_data(path.join(__dirname, 'samples/basic'));
|
|
|
|
const index = { name: 'index', file: 'index.html', has_preload: false };
|
|
const about = { name: 'about', file: 'about.html', has_preload: false };
|
|
const blog = { name: 'blog', file: 'blog/index.html', has_preload: false };
|
|
const blog_$slug = { name: 'blog_$slug', file: 'blog/[slug].html', has_preload: false };
|
|
|
|
assert.deepEqual(components, [
|
|
index,
|
|
about,
|
|
blog,
|
|
blog_$slug
|
|
]);
|
|
|
|
assert.deepEqual(pages, [
|
|
{
|
|
pattern: /^\/?$/,
|
|
parts: [
|
|
{ component: index, params: [] }
|
|
]
|
|
},
|
|
|
|
{
|
|
pattern: /^\/about\/?$/,
|
|
parts: [
|
|
{ component: about, params: [] }
|
|
]
|
|
},
|
|
|
|
{
|
|
pattern: /^\/blog\/?$/,
|
|
parts: [
|
|
{ component: blog, params: [] }
|
|
]
|
|
},
|
|
|
|
{
|
|
pattern: /^\/blog\/([^\/]+?)\/?$/,
|
|
parts: [
|
|
null,
|
|
{ component: blog_$slug, params: ['slug'] }
|
|
]
|
|
}
|
|
]);
|
|
|
|
assert.deepEqual(server_routes, [
|
|
{
|
|
name: 'route_blog_json',
|
|
pattern: /^\/blog.json$/,
|
|
file: 'blog/index.json.js',
|
|
params: []
|
|
},
|
|
|
|
{
|
|
name: 'route_blog_$slug_json',
|
|
pattern: /^\/blog\/([^\/]+?).json$/,
|
|
file: 'blog/[slug].json.js',
|
|
params: ['slug']
|
|
}
|
|
]);
|
|
});
|
|
|
|
it('encodes invalid characters', () => {
|
|
const { components, pages } = create_manifest_data(path.join(__dirname, 'samples/encoding'));
|
|
|
|
// had to remove ? and " because windows
|
|
|
|
// const quote = { name: '$34', file: '".html' };
|
|
const hash = { name: '$35', has_preload: false, file: '#.html' };
|
|
// const question_mark = { name: '$63', file: '?.html' };
|
|
|
|
assert.deepEqual(components, [
|
|
// quote,
|
|
hash,
|
|
// question_mark
|
|
]);
|
|
|
|
assert.deepEqual(pages.map(p => p.pattern), [
|
|
// /^\/%22\/?$/,
|
|
/^\/%23\/?$/,
|
|
// /^\/%3F\/?$/
|
|
]);
|
|
});
|
|
|
|
// this test broken
|
|
// it('allows regex qualifiers', () => {
|
|
// const { pages } = create_manifest_data(path.join(__dirname, 'samples/qualifiers'));
|
|
//
|
|
// assert.deepEqual(pages.map(p => p.pattern), [
|
|
// /^\/([0-9-a-z]{3,})\/?$/,
|
|
// /^\/([a-z]{2})\/?$/,
|
|
// /^\/([^\/]+?)\/?$/
|
|
// ]);
|
|
// });
|
|
|
|
it('sorts routes correctly', () => {
|
|
const { pages } = create_manifest_data(path.join(__dirname, 'samples/sorting'));
|
|
|
|
assert.deepEqual(pages.map(p => p.parts.map(part => part && part.component.file)), [
|
|
['index.html'],
|
|
['about.html'],
|
|
['post/index.html'],
|
|
[null, 'post/bar.html'],
|
|
[null, 'post/foo.html'],
|
|
[null, 'post/f[xx].html'],
|
|
[null, 'post/[id([0-9-a-z]{3,})].html'],
|
|
[null, 'post/[id].html'],
|
|
['[wildcard].html'],
|
|
[null, null, null, '[...spread]/deep/[...deep_spread]/xyz.html'],
|
|
[null, null, '[...spread]/deep/[...deep_spread]/index.html'],
|
|
[null, '[...spread]/deep/index.html'],
|
|
[null, '[...spread]/abc.html'],
|
|
['[...spread]/index.html']
|
|
]);
|
|
});
|
|
|
|
it('ignores files and directories with leading underscores', () => {
|
|
const { server_routes } = create_manifest_data(path.join(__dirname, 'samples/hidden-underscore'));
|
|
|
|
assert.deepEqual(server_routes.map(r => r.file), [
|
|
'index.js',
|
|
'e/f/g/h.js'
|
|
]);
|
|
});
|
|
|
|
it('ignores files and directories with leading dots except .well-known', () => {
|
|
const { server_routes } = create_manifest_data(path.join(__dirname, 'samples/hidden-dot'));
|
|
|
|
assert.deepEqual(server_routes.map(r => r.file), [
|
|
'.well-known/dnt-policy.txt.js'
|
|
]);
|
|
});
|
|
|
|
it('fails on clashes', () => {
|
|
assert.throws(() => {
|
|
const { pages } = create_manifest_data(path.join(__dirname, 'samples/clash-pages'));
|
|
}, /The \[bar\]\/index\.html and \[foo\]\.html pages clash/);
|
|
|
|
assert.throws(() => {
|
|
const { server_routes } = create_manifest_data(path.join(__dirname, 'samples/clash-routes'));
|
|
console.log(server_routes);
|
|
}, /The \[bar\]\/index\.js and \[foo\]\.js routes clash/);
|
|
});
|
|
|
|
it('fails if dynamic params are not separated', () => {
|
|
assert.throws(() => {
|
|
create_manifest_data(path.join(__dirname, 'samples/invalid-params'));
|
|
}, /Invalid route \[foo\]\[bar\]\.js — parameters must be separated/);
|
|
});
|
|
|
|
it('errors when trying to use reserved characters in route regexp', () => {
|
|
assert.throws(() => {
|
|
create_manifest_data(path.join(__dirname, 'samples/invalid-qualifier'));
|
|
}, /Invalid route \[foo\(\[a-z\]\(\[0-9\]\)\)\].js — cannot use \(, \), \? or \: in route qualifiers/);
|
|
});
|
|
|
|
it('ignores things that look like lockfiles' , () => {
|
|
const { server_routes } = create_manifest_data(path.join(__dirname, 'samples/lockfiles'));
|
|
|
|
assert.deepEqual(server_routes, [{
|
|
file: 'foo.js',
|
|
name: 'route_foo',
|
|
params: [],
|
|
pattern: /^\/foo$/
|
|
}]);
|
|
});
|
|
});
|