]> git.ipfire.org Git - thirdparty/vuejs/router.git/commitdiff
refactor(types): stricter RouteRecordNormalized types
authorEduardo San Martin Morote <posva13@gmail.com>
Sun, 27 Oct 2019 17:56:56 +0000 (18:56 +0100)
committerEduardo San Martin Morote <posva13@gmail.com>
Sun, 27 Oct 2019 17:56:56 +0000 (18:56 +0100)
src/matcher/path-matcher.ts
src/matcher/types.ts

index 8e2c1d249f4bbe6d1aa8789940f3c93aca467f8e..86898c67ff3abdaf9d3829320e4dfa51e157e05f 100644 (file)
@@ -1,64 +1,40 @@
 import pathToRegexp from 'path-to-regexp'
 import {
   RouteRecord,
-  RouteRecordRedirect,
-  RouteRecordMultipleViews,
-  RouteRecordSingleView,
-  Mutable,
   // TODO: add it to matched
   // MatchedRouteRecord,
 } from '../types'
-import { NormalizedRouteRecord, RouteRecordMatcher } from './types'
+import { RouteRecordNormalized, RouteRecordMatcher } from './types'
 
-function copyObject<T extends Object, K extends keyof T>(
-  a: T,
-  keys: K[]
-): Mutable<Pick<T, K>> {
-  const copy: Pick<T, K> = {} as Pick<T, K>
-
-  for (const key of keys) {
-    if (!a.hasOwnProperty(key)) continue
-    if (key in a) copy[key] = a[key]
-  }
-
-  return copy
-}
-
-const ROUTE_RECORD_REDIRECT_KEYS: (keyof RouteRecordRedirect)[] = [
-  'path',
-  'name',
-  'beforeEnter',
-  'redirect',
-  'meta',
-]
-const ROUTE_RECORD_MULTIPLE_VIEWS_KEYS: (keyof (
-  | RouteRecordMultipleViews
-  | RouteRecordSingleView))[] = [
-  'path',
-  'name',
-  'beforeEnter',
-  'children',
-  'meta',
-]
 /**
- * Normalizes a RouteRecord into a MatchedRouteRecord. Creates a copy
+ * Normalizes a RouteRecord into a MatchedRouteRecord. It also ensures removes
+ * traling slashes Returns a copy
  * @param record
  * @returns the normalized version
  */
 export function normalizeRouteRecord(
   record: Readonly<RouteRecord>
-): NormalizedRouteRecord {
-  // TODO: could be refactored to improve typings
+): RouteRecordNormalized {
   if ('redirect' in record) {
-    return copyObject(record, ROUTE_RECORD_REDIRECT_KEYS)
+    return {
+      path: record.path,
+      redirect: record.redirect,
+      name: record.name,
+      beforeEnter: record.beforeEnter,
+      meta: record.meta,
+    }
   } else {
-    const copy: RouteRecordMultipleViews = copyObject(
-      record,
-      ROUTE_RECORD_MULTIPLE_VIEWS_KEYS
-    ) as RouteRecordMultipleViews
-    copy.components =
-      'components' in record ? record.components : { default: record.component }
-    return copy
+    return {
+      path: record.path,
+      components:
+        'components' in record
+          ? record.components
+          : { default: record.component },
+      children: record.children,
+      name: record.name,
+      beforeEnter: record.beforeEnter,
+      meta: record.meta,
+    }
   }
 }
 
@@ -90,8 +66,8 @@ const enum PathScore {
 const isDefaultPathRegExpRE = /^\[\^[^\]]+\]\+\?$/
 
 export function createRouteRecordMatcher(
-  record: Readonly<NormalizedRouteRecord>,
-  parent: RouteRecordMatcher | void,
+  record: Readonly<RouteRecordNormalized>,
+  parent: RouteRecordMatcher | undefined,
   options: pathToRegexp.RegExpOptions
 ): RouteRecordMatcher {
   const keys: pathToRegexp.Key[] = []
index 851d3773145d25634259aeb8c3c9713536277b5c..27aa2a2816df64c75444939a0e2517ec1d30546f 100644 (file)
@@ -4,16 +4,31 @@ import {
   RouteRecordRedirect,
 } from '../types'
 
+interface RouteRecordRedirectNormalized {
+  path: RouteRecordRedirect['path']
+  name: RouteRecordRedirect['name']
+  redirect: RouteRecordRedirect['redirect']
+  meta: RouteRecordRedirect['meta']
+  beforeEnter: RouteRecordRedirect['beforeEnter']
+}
+interface RouteRecordViewNormalized {
+  path: RouteRecordMultipleViews['path']
+  name: RouteRecordMultipleViews['name']
+  components: RouteRecordMultipleViews['components']
+  children: RouteRecordMultipleViews['children']
+  meta: RouteRecordMultipleViews['meta']
+  beforeEnter: RouteRecordMultipleViews['beforeEnter']
+}
 // normalize component/components into components
-export type NormalizedRouteRecord =
-  | Omit<RouteRecordRedirect, 'alias'>
-  | Omit<RouteRecordMultipleViews, 'alias'>
+export type RouteRecordNormalized =
+  | RouteRecordRedirectNormalized
+  | RouteRecordViewNormalized
 
 export interface RouteRecordMatcher {
   re: RegExp
   resolve: (params?: RouteParams) => string
-  record: NormalizedRouteRecord
-  parent: RouteRecordMatcher | void
+  record: RouteRecordNormalized
+  parent: RouteRecordMatcher | undefined
   // TODO: children so they can be removed
   // children: RouteMatcher[]
   // TODO: needs information like optional, repeatable