import { describe, expect, it } from 'vitest'
-import { createStaticResolver } from './resolver-static'
+import { createFixedResolver } from './resolver-fixed'
import { NO_MATCH_LOCATION } from './resolver-abstract'
import { MatcherQueryParams } from './matchers/matcher-pattern'
import {
PAGE_QUERY_PATTERN_MATCHER,
} from './matchers/test-utils'
-describe('StaticResolver', () => {
+describe('fixed resolver', () => {
describe('new matchers', () => {
it('static path', () => {
- const resolver = createStaticResolver([
+ const resolver = createFixedResolver([
{ name: 'root', path: new MatcherPatternPathStatic('/') },
{ name: 'users', path: new MatcherPatternPathStatic('/users') },
])
})
it('dynamic path', () => {
- const resolver = createStaticResolver([
+ const resolver = createFixedResolver([
{
name: 'user-detail',
path: USER_ID_PATH_PATTERN_MATCHER,
describe('resolve()', () => {
describe('absolute locations as strings', () => {
it('resolves string locations with no params', () => {
- const resolver = createStaticResolver([
+ const resolver = createFixedResolver([
{ name: 'root', path: EMPTY_PATH_PATTERN_MATCHER },
])
})
it('resolves a not found string', () => {
- const resolver = createStaticResolver([])
+ const resolver = createFixedResolver([])
expect(resolver.resolve('/bar?q=1#hash')).toEqual({
...NO_MATCH_LOCATION,
fullPath: '/bar?q=1#hash',
})
it('resolves string locations with params', () => {
- const resolver = createStaticResolver([
+ const resolver = createFixedResolver([
{ name: 'user-detail', path: USER_ID_PATH_PATTERN_MATCHER },
])
})
it('resolve string locations with query', () => {
- const resolver = createStaticResolver([
+ const resolver = createFixedResolver([
{
name: 'any-path',
path: ANY_PATH_PATTERN_MATCHER,
})
it('resolves string locations with hash', () => {
- const resolver = createStaticResolver([
+ const resolver = createFixedResolver([
{
name: 'any-path',
path: ANY_PATH_PATTERN_MATCHER,
})
it('combines path, query and hash params', () => {
- const resolver = createStaticResolver([
+ const resolver = createFixedResolver([
{
name: 'user-detail',
path: USER_ID_PATH_PATTERN_MATCHER,
describe('relative locations as strings', () => {
it('resolves a simple object relative location', () => {
- const resolver = createStaticResolver([
+ const resolver = createFixedResolver([
{ name: 'any-path', path: ANY_PATH_PATTERN_MATCHER },
])
})
it('resolves a simple string relative location', () => {
- const resolver = createStaticResolver([
+ const resolver = createFixedResolver([
{ name: 'any-path', path: ANY_PATH_PATTERN_MATCHER },
])
describe('absolute locations', () => {
it('resolves an object location', () => {
- const resolver = createStaticResolver([
+ const resolver = createFixedResolver([
{ name: 'root', path: EMPTY_PATH_PATTERN_MATCHER },
])
expect(resolver.resolve({ path: '/' })).toMatchObject({
})
it('resolves an absolute string location', () => {
- const resolver = createStaticResolver([
+ const resolver = createFixedResolver([
{ name: 'root', path: EMPTY_PATH_PATTERN_MATCHER },
])
expect(resolver.resolve('/')).toMatchObject({
})
it('treats object path as pathname only (no query/hash parsing)', () => {
- const resolver = createStaticResolver([
+ const resolver = createFixedResolver([
{ name: 'any-path', path: ANY_PATH_PATTERN_MATCHER },
])
// Object with path containing query/hash should treat entire string as pathname
describe('named locations', () => {
it('resolves named locations with no params', () => {
- const resolver = createStaticResolver([
+ const resolver = createFixedResolver([
{
name: 'home',
path: EMPTY_PATH_PATTERN_MATCHER,
})
describe('encoding', () => {
- const resolver = createStaticResolver([
+ const resolver = createFixedResolver([
{ name: 'any-path', path: ANY_PATH_PATTERN_MATCHER },
])
describe('decodes', () => {
})
it('passes a decoded query to the matcher', () => {
- const resolver = createStaticResolver([
+ const resolver = createFixedResolver([
{
name: 'query',
path: EMPTY_PATH_PATTERN_MATCHER,
} from './matchers/matcher-pattern'
import { warn } from '../../warning'
-// TODO: find a better name than static that doesn't conflict with static params
-// maybe fixed or simple
-
export interface EXPERIMENTAL_ResolverRecord_Base {
/**
* Name of the matcher. Unique across all matchers. If missing, this record
*/
hash?: MatcherPatternHash
- // TODO: here or in router
- // redirect?: RouteRecordRedirectOption
+ parent?: EXPERIMENTAL_ResolverRecord | null // the parent can be matchable or not
- parent?: EXPERIMENTAL_ResolverRecord | null // the parend can be matchable or not
// TODO: implement aliases
// aliasOf?: this
}
hash?: undefined
}
+/**
+ * A matchable record is a record that can be matched by a path, query or hash and will resolve to a location.
+ */
export interface EXPERIMENTAL_ResolverRecord_Matchable
extends EXPERIMENTAL_ResolverRecord_Base {
name: RecordName
path: MatcherPatternPath
}
-export type EXPERIMENTAL_ResolverRecord<T = {}> =
- | (EXPERIMENTAL_ResolverRecord_Matchable & T)
- | (EXPERIMENTAL_ResolverRecord_Group & T)
+export type EXPERIMENTAL_ResolverRecord<ExtensionT = {}> =
+ | (EXPERIMENTAL_ResolverRecord_Matchable & ExtensionT)
+ | (EXPERIMENTAL_ResolverRecord_Group & ExtensionT)
-export type EXPERIMENTAL_ResolverStaticRecord<T = {}> =
- EXPERIMENTAL_ResolverRecord<T>
+export type EXPERIMENTAL_ResolverFixedRecord<ExtensionT = {}> =
+ EXPERIMENTAL_ResolverRecord<ExtensionT>
-export interface EXPERIMENTAL_ResolverStatic<TRecord>
+export interface EXPERIMENTAL_ResolverFixed<TRecord>
extends EXPERIMENTAL_Resolver_Base<TRecord> {}
/**
}
/**
- * Creates a simple resolver that must have all records defined at creation
+ * Creates a fixed resolver that must have all records defined at creation
* time.
*
* @template TRecord - extended type of the records
* @param {TRecord[]} records - Ordered array of records that will be used to resolve routes
* @returns a resolver that can be passed to the router
*/
-export function createStaticResolver<
+export function createFixedResolver<
TRecord extends EXPERIMENTAL_ResolverRecord_Matchable,
->(records: TRecord[]): EXPERIMENTAL_ResolverStatic<TRecord> {
+>(records: TRecord[]): EXPERIMENTAL_ResolverFixed<TRecord> {
// allows fast access to a matcher by name
const recordMap = new Map<RecordName, TRecord>()
for (const record of records) {
throw new Error(`Record "${String(name)}" not found`)
}
- if (typeof to === 'object' && to.hash?.startsWith('#')) {
+ if (typeof to === 'object' && to.hash && to.hash.startsWith('#')) {
warn(
`A \`hash\` should always start with the character "#". Replace "${to.hash}" with "#${to.hash}".`
)