mobx-route 0.0.2 → 0.0.3

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mobx-route",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "keywords": [
5
5
  "mobx",
6
6
  "react",
package/route/route.d.ts CHANGED
@@ -1,18 +1,23 @@
1
1
  import { IMobxHistory, IMobxLocation } from 'mobx-location-history';
2
2
  import { ParamData, TokenData } from 'path-to-regexp';
3
3
  import { AllPropertiesOptional } from 'yummies/utils/types';
4
- import { AnyRoute, ExtractPathParams, RouteConfiguration, RouteGlobalConfiguration, RouteMatchesData, RouteNavigateParams } from './route.types.js';
5
- export declare class Route<TPath extends string, TParentRoute extends AnyRoute | null = null> {
4
+ import { ExtractPathParams, RouteConfiguration, RouteGlobalConfiguration, RouteMatchesData, RouteNavigateParams } from './route.types.js';
5
+ export declare class Route<TPath extends string, TParentRoute extends Route<any, any> | null = null> {
6
6
  path: TPath;
7
- protected configuration: RouteConfiguration<TParentRoute>;
7
+ protected config: RouteConfiguration<TParentRoute>;
8
8
  history: IMobxHistory;
9
9
  location: IMobxLocation;
10
10
  private _tokenData;
11
- constructor(path: TPath, configuration?: RouteConfiguration<TParentRoute>);
11
+ constructor(path: TPath, config?: RouteConfiguration<TParentRoute>);
12
12
  get matchData(): RouteMatchesData<TPath> | null;
13
13
  get isMatches(): boolean;
14
- extend<TExtendedPath extends string>(path: TExtendedPath): Route<`${TPath}${TExtendedPath}`, this>;
14
+ extend<TExtendedPath extends string>(path: TExtendedPath, config?: Omit<RouteConfiguration<any>, 'parent'>): Route<`${TPath}${TExtendedPath}`, this>;
15
15
  protected processParams(params?: ExtractPathParams<TPath> | null | undefined): ParamData | undefined;
16
+ protected get baseUrl(): string;
17
+ createUrl(...args: AllPropertiesOptional<ExtractPathParams<TPath>> extends true ? [
18
+ params?: ExtractPathParams<TPath> | null | undefined,
19
+ query?: Record<string, any>
20
+ ] : [params: ExtractPathParams<TPath>, query?: Record<string, any>]): string;
16
21
  navigate(...args: AllPropertiesOptional<ExtractPathParams<TPath>> extends true ? [
17
22
  params?: ExtractPathParams<TPath> | null | undefined,
18
23
  navigateParams?: RouteNavigateParams
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/route/route.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,aAAa,EAGd,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,QAAQ,GAAG,IAAI,GAAG,IAAI;IAQlC,IAAI,EAAE,KAAK;IAClB,SAAS,CAAC,aAAa,EAAE,kBAAkB,CAAC,YAAY,CAAC;IAP3D,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,aAAa,CAAC;IAExB,OAAO,CAAC,UAAU,CAAwB;gBAGjC,IAAI,EAAE,KAAK,EACR,aAAa,GAAE,kBAAkB,CAAC,YAAY,CAAM;IAYhE,IAAI,SAAS,IAAI,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,CAQ9C;IAED,IAAI,SAAS,YAEZ;IAED,MAAM,CAAC,aAAa,SAAS,MAAM,EAAE,IAAI,EAAE,aAAa;IAOxD,SAAS,CAAC,aAAa,CACrB,MAAM,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,SAAS,GACnD,SAAS,GAAG,SAAS;IAWxB,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;IAU9E,SAAS,KAAK,SAAS,cAKtB;IAED,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAuC;IAE1E,MAAM,CAAC,sBAAsB,CAAC,mBAAmB,EAAE,wBAAwB;IAI3E,MAAM,KAAK,mBAAmB,6BAY7B;CACF"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/route/route.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,YAAY,EACZ,aAAa,EAGd,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;IAQzC,IAAI,EAAE,KAAK;IAClB,SAAS,CAAC,MAAM,EAAE,kBAAkB,CAAC,YAAY,CAAC;IAPpD,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,aAAa,CAAC;IAExB,OAAO,CAAC,UAAU,CAAwB;gBAGjC,IAAI,EAAE,KAAK,EACR,MAAM,GAAE,kBAAkB,CAAC,YAAY,CAAM;IAWzD,IAAI,SAAS,IAAI,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,CAkB9C;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;IAW9E,SAAS,KAAK,SAAS,cAKtB;IAED,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAuC;IAE1E,MAAM,CAAC,sBAAsB,CAAC,mBAAmB,EAAE,wBAAwB;IAI3E,MAAM,KAAK,mBAAmB,6BAY7B;CACF"}
package/route/route.js CHANGED
@@ -1,24 +1,30 @@
1
1
  import { computed, makeObservable } from 'mobx';
2
- import { MobxHistory, MobxLocation, } from 'mobx-location-history';
2
+ import { buildSearchString, MobxHistory, MobxLocation, } from 'mobx-location-history';
3
3
  import { compile, match, parse } from 'path-to-regexp';
4
4
  export class Route {
5
5
  path;
6
- configuration;
6
+ config;
7
7
  history;
8
8
  location;
9
9
  _tokenData;
10
- constructor(path, configuration = {}) {
10
+ constructor(path, config = {}) {
11
11
  this.path = path;
12
- this.configuration = configuration;
13
- this.history = configuration.history ?? Route.globalConfiguration.history;
14
- this.location =
15
- configuration.location ?? Route.globalConfiguration.location;
12
+ this.config = config;
13
+ this.history = config.history ?? Route.globalConfiguration.history;
14
+ this.location = config.location ?? Route.globalConfiguration.location;
16
15
  computed.struct(this, 'isMatches');
17
16
  computed.struct(this, 'matchData');
18
17
  makeObservable(this);
19
18
  }
20
19
  get matchData() {
21
- const parsed = match(this.tokenData)(this.location.pathname);
20
+ let pathname = this.location.pathname;
21
+ if (this.baseUrl) {
22
+ if (!pathname.startsWith(this.baseUrl)) {
23
+ return null;
24
+ }
25
+ pathname = pathname.replace(this.baseUrl, '');
26
+ }
27
+ const parsed = match(this.tokenData)(pathname);
22
28
  if (parsed === false) {
23
29
  return null;
24
30
  }
@@ -27,8 +33,12 @@ export class Route {
27
33
  get isMatches() {
28
34
  return this.matchData !== null;
29
35
  }
30
- extend(path) {
31
- return new Route(`${this.path}${path}`, this.configuration);
36
+ extend(path, config) {
37
+ return new Route(`${this.path}${path}`, {
38
+ ...this.config,
39
+ ...config,
40
+ parent: this,
41
+ });
32
42
  }
33
43
  processParams(params) {
34
44
  if (params == null)
@@ -40,18 +50,35 @@ export class Route {
40
50
  return acc;
41
51
  }, {});
42
52
  }
53
+ get baseUrl() {
54
+ return !this.config.baseUrl || this.config.baseUrl === '/'
55
+ ? ''
56
+ : this.config.baseUrl;
57
+ }
58
+ createUrl(...args) {
59
+ const pathParams = args[0];
60
+ const queryParams = args[1];
61
+ const path = compile(this.tokenData)(this.processParams(pathParams));
62
+ return [
63
+ this.baseUrl,
64
+ // type === 'hash' ? '#' : '',
65
+ path,
66
+ buildSearchString(queryParams || {}),
67
+ ].join('');
68
+ }
43
69
  navigate(...args) {
44
- const path = compile(this.tokenData)(this.processParams(args[0]));
70
+ // @ts-expect-error no way to handle typigns here
71
+ const url = this.createUrl(args[0], args[1]?.query);
45
72
  if (args[1]?.replace) {
46
- this.history.replaceState(null, '', path);
73
+ this.history.replaceState(null, '', url);
47
74
  }
48
75
  else {
49
- this.history.pushState(null, '', path);
76
+ this.history.pushState(null, '', url);
50
77
  }
51
78
  }
52
79
  get tokenData() {
53
80
  if (!this._tokenData) {
54
- this._tokenData = parse(this.path, this.configuration.parseOptions);
81
+ this._tokenData = parse(this.path, this.config.parseOptions);
55
82
  }
56
83
  return this._tokenData;
57
84
  }
@@ -83,4 +83,15 @@ describe('route', () => {
83
83
  },
84
84
  });
85
85
  });
86
+ it('/test/:id/:bar + baseUrl + query params', () => {
87
+ const route = new Route('/test/:id/:bar', { baseUrl: '/mobx-view-model' });
88
+ route.navigate({
89
+ id: 1,
90
+ bar: 'barg',
91
+ }, {
92
+ query: { a: 1 },
93
+ });
94
+ expect(history.pushStateSpy).toBeCalledWith(null, '', '/mobx-view-model/test/1/barg?a=1');
95
+ expect(route.isMatches).toBe(true);
96
+ });
86
97
  });
@@ -6,6 +6,7 @@ export interface RouteGlobalConfiguration {
6
6
  location: IMobxLocation;
7
7
  }
8
8
  export interface RouteConfiguration<TParentRoute extends AnyRoute | null = null> extends Partial<RouteGlobalConfiguration> {
9
+ baseUrl?: string;
9
10
  meta?: Record<string, any>;
10
11
  parseOptions?: ParseOptions;
11
12
  parent?: TParentRoute;
@@ -32,6 +33,7 @@ export type ExtractPathParams<Path extends string> = Simplify<Path extends `${in
32
33
  } : {}>;
33
34
  export interface RouteNavigateParams {
34
35
  replace?: boolean;
36
+ query?: Record<string, any>;
35
37
  }
36
38
  export interface RouteMatchesData<TPath extends string> {
37
39
  path: string;
@@ -1 +1 @@
1
- {"version":3,"file":"route.types.d.ts","sourceRoot":"","sources":["../../src/route/route.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACpE,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;CACzB;AAED,MAAM,WAAW,kBAAkB,CAAC,YAAY,SAAS,QAAQ,GAAG,IAAI,GAAG,IAAI,CAC7E,SAAQ,OAAO,CAAC,wBAAwB,CAAC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAEvC,KAAK,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAEpE,KAAK,gBAAgB,GAAG,MAAM,CAAC;AAE/B,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,gBAAgB;CAAE,GACnC,IAAI,SAAS,IAAI,MAAM,KAAK,EAAE,GAC5B;KAAG,CAAC,IAAI,KAAK,GAAG,gBAAgB;CAAE,GAClC,IAAI,SAAS,IAAI,MAAM,QAAQ,EAAE,GAC/B;KAAG,CAAC,IAAI,QAAQ,GAAG,gBAAgB,EAAE;CAAE,GAEvC,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,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,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,MAAM;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC;CACjC"}
1
+ {"version":3,"file":"route.types.d.ts","sourceRoot":"","sources":["../../src/route/route.types.ts"],"names":[],"mappings":"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"}