mobx-route 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,7 +14,7 @@ export const Link = observer(forwardRef(({ route, asChild, query, replace, child
14
14
  anchorProps.onClick?.(event);
15
15
  if (!event.defaultPrevented) {
16
16
  event.preventDefault();
17
- route.navigate(href, { replace, query });
17
+ route.open(href, { replace, query });
18
18
  }
19
19
  };
20
20
  return asChild && isValidElement(children) ? (
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mobx-route",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "keywords": [
5
5
  "mobx",
6
6
  "react",
@@ -65,6 +65,11 @@
65
65
  "default": "./route/index.js",
66
66
  "types": "./route/index.d.ts"
67
67
  },
68
+ "./route/route-group": {
69
+ "import": "./route/route-group.js",
70
+ "default": "./route/route-group.js",
71
+ "types": "./route/route-group.d.ts"
72
+ },
68
73
  "./route/route.test": {
69
74
  "import": "./route/route.test.js",
70
75
  "default": "./route/route.test.js",
package/route/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
1
  export * from './route.types.js';
2
2
  export * from './route.js';
3
+ export * from './route-group.js';
4
+ export * from './route-group.types.js';
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/route/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/route/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC"}
package/route/index.js CHANGED
@@ -1,2 +1,4 @@
1
1
  export * from './route.types.js';
2
2
  export * from './route.js';
3
+ export * from './route-group.js';
4
+ export * from './route-group.types.js';
@@ -0,0 +1,8 @@
1
+ import { AnyRouteGroup } from './route-group.types.js';
2
+ import { AnyRoute } from './route.types.js';
3
+ export declare class RouteGroup<TGrouppedRoutes extends Record<string, AnyRoute | AnyRouteGroup>> {
4
+ routes: TGrouppedRoutes;
5
+ constructor(routes: TGrouppedRoutes);
6
+ get isOpened(): boolean;
7
+ }
8
+ //# sourceMappingURL=route-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-group.d.ts","sourceRoot":"","sources":["../../src/route/route-group.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,qBAAa,UAAU,CACrB,eAAe,SAAS,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,aAAa,CAAC;IAE7C,MAAM,EAAE,eAAe;gBAAvB,MAAM,EAAE,eAAe;IAM1C,IAAI,QAAQ,IAAI,OAAO,CAGtB;CACF"}
@@ -0,0 +1,14 @@
1
+ import { computed, makeObservable, observable } from 'mobx';
2
+ export class RouteGroup {
3
+ routes;
4
+ constructor(routes) {
5
+ this.routes = routes;
6
+ computed.struct(this, 'isMatches');
7
+ observable.shallow(this, 'routes');
8
+ makeObservable(this);
9
+ }
10
+ get isOpened() {
11
+ const routes = Object.values(this.routes);
12
+ return routes.some((route) => route.isOpened);
13
+ }
14
+ }
@@ -0,0 +1,3 @@
1
+ import type { RouteGroup } from './route-group.js';
2
+ export type AnyRouteGroup = RouteGroup<any>;
3
+ //# sourceMappingURL=route-group.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-group.types.d.ts","sourceRoot":"","sources":["../../src/route/route-group.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
package/route/route.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { IMobxHistory, IMobxLocation, IQueryParams } from 'mobx-location-history';
2
2
  import { ParamData, TokenData } from 'path-to-regexp';
3
3
  import { AllPropertiesOptional } from 'yummies/utils/types';
4
- import { ExtractPathParams, RouteConfiguration, RouteGlobalConfiguration, RouteMatchesData, RouteNavigateParams } from './route.types.js';
4
+ import { AnyRoute, ExtractPathParams, RouteConfiguration, RouteGlobalConfiguration, RouteMatchesData, RouteNavigateParams } from './route.types.js';
5
5
  export declare class Route<TPath extends string, TParentRoute extends Route<any, any> | null = null> {
6
6
  path: TPath;
7
7
  protected config: RouteConfiguration<TParentRoute>;
@@ -9,21 +9,25 @@ export declare class Route<TPath extends string, TParentRoute extends Route<any,
9
9
  protected location: IMobxLocation;
10
10
  query: IQueryParams;
11
11
  private _tokenData;
12
+ children: AnyRoute[];
12
13
  constructor(path: TPath, config?: RouteConfiguration<TParentRoute>);
13
- get match(): RouteMatchesData<TPath> | null;
14
- get isMatches(): boolean;
15
- extend<TExtendedPath extends string>(path: TExtendedPath, config?: Omit<RouteConfiguration<any>, 'parent'>): Route<`${TPath}${TExtendedPath}`, this>;
14
+ get data(): RouteMatchesData<TPath> | null;
15
+ get isOpened(): boolean;
16
+ extend<TExtendPath extends string>(path: TExtendPath, config?: Omit<RouteConfiguration<any>, 'parent'>): Route<`${TPath}${TExtendPath}`, this>;
17
+ addChildren(...children: AnyRoute[]): void;
18
+ removeChildren(...childrenToRemove: AnyRoute[]): void;
19
+ get hasChildrenMatches(): boolean;
16
20
  protected processParams(params?: ExtractPathParams<TPath> | null | undefined): ParamData | undefined;
17
21
  protected get baseUrl(): string;
18
22
  createUrl(...args: AllPropertiesOptional<ExtractPathParams<TPath>> extends true ? [
19
23
  params?: ExtractPathParams<TPath> | null | undefined,
20
24
  query?: Record<string, any>
21
25
  ] : [params: ExtractPathParams<TPath>, query?: Record<string, any>]): string;
22
- navigate(...args: AllPropertiesOptional<ExtractPathParams<TPath>> extends true ? [
26
+ open(...args: AllPropertiesOptional<ExtractPathParams<TPath>> extends true ? [
23
27
  params?: ExtractPathParams<TPath> | null | undefined,
24
28
  navigateParams?: RouteNavigateParams
25
29
  ] : [params: ExtractPathParams<TPath>, navigateParams?: RouteNavigateParams]): void;
26
- navigate(url: string, navigateParams?: RouteNavigateParams): void;
30
+ open(url: string, navigateParams?: RouteNavigateParams): void;
27
31
  protected get tokenData(): TokenData;
28
32
  private static _globalConfiguration;
29
33
  static setGlobalConfiguration(globalConfiguration: Partial<RouteGlobalConfiguration>): void;
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/route/route.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,YAAY,EACZ,aAAa,EACb,YAAY,EAIb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAkB,SAAS,EAAS,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,KAAK,CAChB,KAAK,SAAS,MAAM,EACpB,YAAY,SAAS,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI;IAUzC,IAAI,EAAE,KAAK;IAClB,SAAS,CAAC,MAAM,EAAE,kBAAkB,CAAC,YAAY,CAAC;IATpD,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC;IAChC,SAAS,CAAC,QAAQ,EAAE,aAAa,CAAC;IAElC,KAAK,EAAE,YAAY,CAAC;IAEpB,OAAO,CAAC,UAAU,CAAwB;gBAGjC,IAAI,EAAE,KAAK,EACR,MAAM,GAAE,kBAAkB,CAAC,YAAY,CAAM;IAYzD,IAAI,KAAK,IAAI,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,CAkB1C;IAED,IAAI,SAAS,YAEZ;IAED,MAAM,CAAC,aAAa,SAAS,MAAM,EACjC,IAAI,EAAE,aAAa,EACnB,MAAM,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC;IAYlD,SAAS,CAAC,aAAa,CACrB,MAAM,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,SAAS,GACnD,SAAS,GAAG,SAAS;IAWxB,SAAS,KAAK,OAAO,WAIpB;IAED,SAAS,CACP,GAAG,IAAI,EAAE,qBAAqB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,SAAS,IAAI,GACjE;QACE,MAAM,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,SAAS;QACpD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;KAC5B,GACD,CAAC,MAAM,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAerE,QAAQ,CACN,GAAG,IAAI,EAAE,qBAAqB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,SAAS,IAAI,GACjE;QACE,MAAM,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,SAAS;QACpD,cAAc,CAAC,EAAE,mBAAmB;KACrC,GACD,CAAC,MAAM,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC,EAAE,mBAAmB,CAAC,GAC3E,IAAI;IAEP,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,mBAAmB,GAAG,IAAI;IAcjE,SAAS,KAAK,SAAS,cAKtB;IAED,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAuC;IAE1E,MAAM,CAAC,sBAAsB,CAC3B,mBAAmB,EAAE,OAAO,CAAC,wBAAwB,CAAC;IAgBxD,MAAM,KAAK,mBAAmB,6BAM7B;CACF"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/route/route.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,YAAY,EACZ,aAAa,EACb,YAAY,EAIb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAkB,SAAS,EAAS,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,KAAK,CAChB,KAAK,SAAS,MAAM,EACpB,YAAY,SAAS,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI;IAYzC,IAAI,EAAE,KAAK;IAClB,SAAS,CAAC,MAAM,EAAE,kBAAkB,CAAC,YAAY,CAAC;IAXpD,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC;IAChC,SAAS,CAAC,QAAQ,EAAE,aAAa,CAAC;IAElC,KAAK,EAAE,YAAY,CAAC;IAEpB,OAAO,CAAC,UAAU,CAAwB;IAE1C,QAAQ,EAAE,QAAQ,EAAE,CAAM;gBAGjB,IAAI,EAAE,KAAK,EACR,MAAM,GAAE,kBAAkB,CAAC,YAAY,CAAM;IAgBzD,IAAI,IAAI,IAAI,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,CAsBzC;IAED,IAAI,QAAQ,YAEX;IAED,MAAM,CAAC,WAAW,SAAS,MAAM,EAC/B,IAAI,EAAE,WAAW,EACjB,MAAM,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC;IAmBlD,WAAW,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE;IAInC,cAAc,CAAC,GAAG,gBAAgB,EAAE,QAAQ,EAAE;IAM9C,IAAI,kBAAkB,YAErB;IAED,SAAS,CAAC,aAAa,CACrB,MAAM,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,SAAS,GACnD,SAAS,GAAG,SAAS;IAWxB,SAAS,KAAK,OAAO,WAIpB;IAED,SAAS,CACP,GAAG,IAAI,EAAE,qBAAqB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,SAAS,IAAI,GACjE;QACE,MAAM,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,SAAS;QACpD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;KAC5B,GACD,CAAC,MAAM,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAerE,IAAI,CACF,GAAG,IAAI,EAAE,qBAAqB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,SAAS,IAAI,GACjE;QACE,MAAM,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,SAAS;QACpD,cAAc,CAAC,EAAE,mBAAmB;KACrC,GACD,CAAC,MAAM,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC,EAAE,mBAAmB,CAAC,GAC3E,IAAI;IAEP,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,mBAAmB,GAAG,IAAI;IAc7D,SAAS,KAAK,SAAS,cAKtB;IAED,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAuC;IAE1E,MAAM,CAAC,sBAAsB,CAC3B,mBAAmB,EAAE,OAAO,CAAC,wBAAwB,CAAC;IAgBxD,MAAM,KAAK,mBAAmB,6BAM7B;CACF"}
package/route/route.js CHANGED
@@ -1,4 +1,4 @@
1
- import { computed, makeObservable } from 'mobx';
1
+ import { action, computed, makeObservable, observable } from 'mobx';
2
2
  import { buildSearchString, MobxHistory, MobxLocation, QueryParams, } from 'mobx-location-history';
3
3
  import { compile, match, parse } from 'path-to-regexp';
4
4
  export class Route {
@@ -8,6 +8,7 @@ export class Route {
8
8
  location;
9
9
  query;
10
10
  _tokenData;
11
+ children = [];
11
12
  constructor(path, config = {}) {
12
13
  this.path = path;
13
14
  this.config = config;
@@ -16,9 +17,13 @@ export class Route {
16
17
  this.query = config.queryParams ?? Route.globalConfiguration.queryParams;
17
18
  computed.struct(this, 'isMatches');
18
19
  computed.struct(this, 'matchData');
20
+ computed.struct(this, 'hasChildrenMatches');
21
+ observable(this, 'children');
22
+ action(this, 'addChildren');
23
+ action(this, 'removeChildren');
19
24
  makeObservable(this);
20
25
  }
21
- get match() {
26
+ get data() {
22
27
  let pathname = this.location.pathname;
23
28
  if (this.baseUrl) {
24
29
  if (!pathname.startsWith(this.baseUrl)) {
@@ -26,21 +31,35 @@ export class Route {
26
31
  }
27
32
  pathname = pathname.replace(this.baseUrl, '');
28
33
  }
34
+ if (this.path === '' && pathname === '/') {
35
+ return { params: {}, path: pathname };
36
+ }
29
37
  const parsed = match(this.tokenData)(pathname);
30
38
  if (parsed === false) {
31
39
  return null;
32
40
  }
33
41
  return parsed;
34
42
  }
35
- get isMatches() {
36
- return this.match !== null;
43
+ get isOpened() {
44
+ return this.data !== null;
37
45
  }
38
46
  extend(path, config) {
39
- return new Route(`${this.path}${path}`, {
47
+ const extendedChild = new Route(`${this.path}${path}`, {
40
48
  ...this.config,
41
49
  ...config,
42
50
  parent: this,
43
51
  });
52
+ this.addChildren(extendedChild);
53
+ return extendedChild;
54
+ }
55
+ addChildren(...children) {
56
+ this.children.push(...children);
57
+ }
58
+ removeChildren(...childrenToRemove) {
59
+ this.children = this.children.filter((child) => !childrenToRemove.includes(child));
60
+ }
61
+ get hasChildrenMatches() {
62
+ return this.children.some((child) => child.isOpened);
44
63
  }
45
64
  processParams(params) {
46
65
  if (params == null)
@@ -68,7 +87,7 @@ export class Route {
68
87
  buildSearchString(queryParams || {}),
69
88
  ].join('');
70
89
  }
71
- navigate(...args) {
90
+ open(...args) {
72
91
  const url = typeof args[0] === 'string'
73
92
  ? args[0]
74
93
  : this.createUrl(args[0], args[1]?.query);
@@ -1,5 +1,9 @@
1
+ /* eslint-disable sonarjs/no-dead-store */
2
+ /* eslint-disable sonarjs/sonar-no-unused-vars */
3
+ /* eslint-disable @typescript-eslint/no-unused-vars */
1
4
  import { MobxHistory, MobxLocation } from 'mobx-location-history';
2
5
  import { beforeEach, describe, expect, expectTypeOf, it, vi } from 'vitest';
6
+ import { RouteGroup } from './route-group.js';
3
7
  import { Route } from './route.js';
4
8
  class MobxHistoryMock extends MobxHistory {
5
9
  pushStateSpy = vi.fn();
@@ -29,42 +33,42 @@ describe('route', () => {
29
33
  });
30
34
  it('empty string', () => {
31
35
  const route = new Route('');
32
- expect(route.isMatches).toBe(true);
36
+ expect(route.isOpened).toBe(true);
33
37
  });
34
38
  it('/test', () => {
35
39
  const route = new Route('/test');
36
- route.navigate();
40
+ route.open();
37
41
  expect(history.pushStateSpy).toBeCalledWith(null, '', '/test');
38
42
  });
39
43
  it('/test/:id/:bar{/:bar3}', () => {
40
44
  const route = new Route('/test/:id/:bar{/:bar3}');
41
- route.navigate({
45
+ route.open({
42
46
  id: 1,
43
47
  bar: 'barg',
44
48
  });
45
49
  expect(history.pushStateSpy).toBeCalledWith(null, '', '/test/1/barg');
46
- expectTypeOf(route.navigate).toBeFunction();
47
- expectTypeOf(route.navigate).parameter(0).toEqualTypeOf();
50
+ expectTypeOf(route.open).toBeFunction();
51
+ expectTypeOf(route.open).parameter(0).toEqualTypeOf();
48
52
  });
49
53
  it('/test/*splat', () => {
50
54
  const route = new Route('/test/*splat');
51
- route.navigate({
55
+ route.open({
52
56
  splat: [1, 2, 3],
53
57
  });
54
58
  expect(history.pushStateSpy).toBeCalledWith(null, '', '/test/1/2/3');
55
59
  });
56
60
  it('/users{/:id}/delete', () => {
57
61
  const route = new Route('/users{/:id}/delete');
58
- route.navigate({
62
+ route.open({
59
63
  id: 1,
60
64
  });
61
65
  expect(history.pushStateSpy).toBeCalledWith(null, '', '/users/1/delete');
62
66
  history.resetMocks();
63
- route.navigate();
67
+ route.open();
64
68
  expect(history.pushStateSpy).toBeCalledWith(null, '', '/users/delete');
65
69
  history.resetMocks();
66
70
  const childRoute = route.extend('/push/:id1{/:bar}');
67
- childRoute.navigate({
71
+ childRoute.open({
68
72
  id1: 1,
69
73
  bar: 2,
70
74
  id: 3,
@@ -73,15 +77,15 @@ describe('route', () => {
73
77
  });
74
78
  it('/posts{/:slug}/*rest', () => {
75
79
  const route = new Route('/posts{/:slug}/*rest');
76
- route.navigate({
80
+ route.open({
77
81
  slug: true,
78
82
  rest: [1, 2, 3, 'bar'],
79
83
  });
80
84
  expect(history.pushStateSpy).toBeCalledWith(null, '', '/posts/true/1/2/3/bar');
81
85
  const otherRoute = new Route('/kek/pek');
82
- expect(otherRoute.isMatches).toBe(false);
83
- expect(route.isMatches).toBe(true);
84
- expect(route.match).toEqual({
86
+ expect(otherRoute.isOpened).toBe(false);
87
+ expect(route.isOpened).toBe(true);
88
+ expect(route.data).toEqual({
85
89
  path: '/posts/true/1/2/3/bar',
86
90
  params: {
87
91
  rest: ['1', '2', '3', 'bar'],
@@ -91,18 +95,18 @@ describe('route', () => {
91
95
  });
92
96
  it('/test/:id/:bar + baseUrl + query params', () => {
93
97
  const route = new Route('/test/:id/:bar', { baseUrl: '/mobx-view-model' });
94
- route.navigate({
98
+ route.open({
95
99
  id: 1,
96
100
  bar: 'barg',
97
101
  }, {
98
102
  query: { a: 1 },
99
103
  });
100
104
  expect(history.pushStateSpy).toBeCalledWith(null, '', '/mobx-view-model/test/1/barg?a=1');
101
- expect(route.isMatches).toBe(true);
105
+ expect(route.isOpened).toBe(true);
102
106
  });
103
107
  it('/test/:id/:bar + baseUrl + query params + (query params tests)', () => {
104
108
  const route = new Route('/test/:id/:bar', { baseUrl: '/mobx-view-model' });
105
- route.navigate({
109
+ route.open({
106
110
  id: 1,
107
111
  bar: 'barg',
108
112
  }, {
@@ -112,4 +116,26 @@ describe('route', () => {
112
116
  expect(location.search).toBe('?a=3&b=1%2C2%2C3');
113
117
  expect(route.query.data).toEqual({ a: '3', b: '1,2,3' });
114
118
  });
119
+ it('hierarchy test', () => {
120
+ const routes = {
121
+ private: new RouteGroup({
122
+ techreview: new Route('/techreview'),
123
+ techreviewTemplates: new Route('/techreview-templates'),
124
+ employee: new Route('/employee'),
125
+ matrices: new Route('/matrices'),
126
+ orgstructure: new Route('/orgstructure'),
127
+ roles: new Route('/roles'),
128
+ account: new Route('/account'),
129
+ }),
130
+ notFound: new Route('/not-found'),
131
+ noAccess: new Route('/no-access'),
132
+ login: new Route('/login'),
133
+ };
134
+ expect(routes.private.isOpened).toBe(false);
135
+ expect(routes.private.routes.matrices.isOpened).toBe(false);
136
+ history.pushState(null, '', '/matrices');
137
+ expect(routes.private.isOpened).toBe(true);
138
+ expect(routes.private.routes.matrices.isOpened).toBe(true);
139
+ expect(routes.private.routes.techreview.isOpened).toBe(false);
140
+ });
115
141
  });
@@ -7,10 +7,12 @@ export interface RouteGlobalConfiguration {
7
7
  queryParams: IQueryParams;
8
8
  }
9
9
  export interface RouteConfiguration<TParentRoute extends AnyRoute | null = null> extends Partial<RouteGlobalConfiguration> {
10
+ index?: boolean;
10
11
  baseUrl?: string;
11
12
  meta?: Record<string, any>;
12
13
  parseOptions?: ParseOptions;
13
14
  parent?: TParentRoute;
15
+ children?: AnyRoute[];
14
16
  }
15
17
  export type AnyRoute = Route<any, any>;
16
18
  export type PathParam = string | number | boolean | null;
@@ -1 +1 @@
1
- {"version":3,"file":"route.types.d.ts","sourceRoot":"","sources":["../../src/route/route.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route.types.d.ts","sourceRoot":"","sources":["../../src/route/route.types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,YAAY,EACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,aAAa,CAAC;IACxB,WAAW,EAAE,YAAY,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB,CAAC,YAAY,SAAS,QAAQ,GAAG,IAAI,GAAG,IAAI,CAC7E,SAAQ,OAAO,CAAC,wBAAwB,CAAC;IACzC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAEvC,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAEzD,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC;AAErC,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,KAAK,CAAC;AAExE,MAAM,MAAM,gBAAgB,CAAC,IAAI,SAAS,MAAM,IAAI,QAAQ,CAC1D,IAAI,SAAS,GAAG,MAAM,MAAM,IAAI,MAAM,QAAQ,IAAI,MAAM,MAAM,EAAE,GAC5D,gBAAgB,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,GACpC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,GACrC,IAAI,SAAS,GAAG,MAAM,KAAK,IAAI,MAAM,KAAK,EAAE,GAC1C,gBAAgB,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,GACjD,IAAI,SAAS,IAAI,MAAM,KAAK,GAAG,GAC7B;KAAG,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,eAAe;CAAE,GAClC,IAAI,SAAS,IAAI,MAAM,KAAK,EAAE,GAC5B;KAAG,CAAC,IAAI,KAAK,GAAG,eAAe;CAAE,GACjC,IAAI,SAAS,IAAI,MAAM,QAAQ,EAAE,GAC/B;KAAG,CAAC,IAAI,QAAQ,GAAG,eAAe,EAAE;CAAE,GAEtC,EAAE,CACf,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,IAAI,SAAS,MAAM,IAAI,QAAQ,CAC3D,IAAI,SAAS,GAAG,MAAM,MAAM,IAAI,MAAM,QAAQ,IAAI,MAAM,MAAM,EAAE,GAC5D,iBAAiB,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,GACrC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,GACtC,IAAI,SAAS,GAAG,MAAM,KAAK,IAAI,MAAM,KAAK,EAAE,GAC1C,iBAAiB,CAAC,KAAK,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,GACnD,IAAI,SAAS,IAAI,MAAM,KAAK,GAAG,GAC7B;KAAG,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,SAAS;CAAE,GAC5B,IAAI,SAAS,IAAI,MAAM,KAAK,EAAE,GAC5B;KAAG,CAAC,IAAI,KAAK,GAAG,SAAS;CAAE,GAC3B,IAAI,SAAS,IAAI,MAAM,QAAQ,EAAE,GAC/B;KAAG,CAAC,IAAI,QAAQ,GAAG,SAAS,EAAE;CAAE,GAEhC,EAAE,CACf,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,MAAM;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC;CACjC"}