mobx-route 0.0.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Sergey
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,14 @@
1
+ # mobx-route
2
+
3
+ [![NPM version][npm-image]][npm-url] [![test status][github-test-actions-image]][github-actions-url] [![build status][github-build-actions-image]][github-actions-url] [![npm download][download-image]][download-url] [![bundle size][bundlephobia-image]][bundlephobia-url]
4
+
5
+
6
+ [npm-image]: http://img.shields.io/npm/v/mobx-nuclear-route.svg
7
+ [npm-url]: http://npmjs.org/package/mobx-nuclear-route
8
+ [github-build-actions-image]: https://github.com/js2me/mobx-nuclear-route/workflows/Build/badge.svg
9
+ [github-test-actions-image]: https://github.com/js2me/mobx-nuclear-route/workflows/Test/badge.svg
10
+ [github-actions-url]: https://github.com/js2me/mobx-nuclear-route/actions
11
+ [download-image]: https://img.shields.io/npm/dm/mobx-nuclear-route.svg
12
+ [download-url]: https://npmjs.org/package/mobx-nuclear-route
13
+ [bundlephobia-url]: https://bundlephobia.com/result?p=mobx-nuclear-route
14
+ [bundlephobia-image]: https://badgen.net/bundlephobia/minzip/mobx-nuclear-route
package/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './route/index.js';
2
+ //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
package/index.js ADDED
@@ -0,0 +1 @@
1
+ export * from './route/index.js';
package/package.json ADDED
@@ -0,0 +1,92 @@
1
+ {
2
+ "name": "mobx-route",
3
+ "version": "0.0.1",
4
+ "keywords": [
5
+ "mobx",
6
+ "react",
7
+ "router",
8
+ "react-router-dom"
9
+ ],
10
+ "author": "js2me",
11
+ "license": "MIT",
12
+ "description": "",
13
+ "type": "module",
14
+ "bugs": {
15
+ "url": "https://github.com/js2me/mobx-nuclear-route/issues"
16
+ },
17
+ "homepage": "https://github.com/js2me/mobx-nuclear-route",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git://github.com/js2me/mobx-nuclear-route"
21
+ },
22
+ "dependencies": {
23
+ "mobx-location-history": "^2.0.11",
24
+ "path-to-regexp": "^8.2.0",
25
+ "yummies": "^3.1.3"
26
+ },
27
+ "peerDependencies": {
28
+ "mobx": "^6.12.4",
29
+ "mobx-react-lite": "^4.0.7",
30
+ "react": "^18.3.1",
31
+ "wouter": "^3.3.5"
32
+ },
33
+ "devDependencies": {
34
+ "@testing-library/react": "^16.3.0",
35
+ "@types/lodash-es": "^4.17.12",
36
+ "@types/node": "^20.17.30",
37
+ "@types/react": "^18.3.20",
38
+ "@vitejs/plugin-react-swc": "^3.9.0",
39
+ "@vitest/coverage-istanbul": "^2.1.9",
40
+ "eslint": "^8.57.1",
41
+ "js2me-eslint-config": "^1.0.7",
42
+ "js2me-exports-post-build-script": "^2.0.18",
43
+ "jsdom": "^25.0.1",
44
+ "rimraf": "^6.0.1",
45
+ "typescript": "^5.8.3",
46
+ "vitest": "^2.1.9"
47
+ },
48
+ "exports": {
49
+ ".": {
50
+ "import": "./index.js",
51
+ "default": "./index.js",
52
+ "types": "./index.d.ts"
53
+ },
54
+ "./route": {
55
+ "import": "./route/index.js",
56
+ "default": "./route/index.js",
57
+ "types": "./route/index.d.ts"
58
+ },
59
+ "./route/route.test": {
60
+ "import": "./route/route.test.js",
61
+ "default": "./route/route.test.js",
62
+ "types": "./route/route.test.d.ts"
63
+ },
64
+ "./route/route": {
65
+ "import": "./route/route.js",
66
+ "default": "./route/route.js",
67
+ "types": "./route/route.d.ts"
68
+ },
69
+ "./package.json": "./package.json"
70
+ },
71
+ "files": [
72
+ "*"
73
+ ],
74
+ "main": "./index.js",
75
+ "typings": "./index.d.ts",
76
+ "scripts": {
77
+ "clean": "rimraf dist",
78
+ "lint:check": "eslint . --fix",
79
+ "ts:check": "tsc --noEmit",
80
+ "check": "npm run lint:check && npm run ts:check",
81
+ "prebuild": "npm run clean && npm run check",
82
+ "build": "tsc && node ./post-build.mjs",
83
+ "pub": "PUBLISH=true pnpm run build",
84
+ "pub:patch": "PUBLISH=true PUBLISH_VERSION=patch pnpm run build",
85
+ "pub:minor": "PUBLISH=true PUBLISH_VERSION=minor pnpm run build",
86
+ "pub:major": "PUBLISH=true PUBLISH_VERSION=major pnpm run build",
87
+ "test": "vitest run",
88
+ "test:watch": "vitest watch",
89
+ "test:coverage": "vitest run --coverage",
90
+ "dev": "pnpm test:watch"
91
+ }
92
+ }
@@ -0,0 +1,3 @@
1
+ export * from './route.types.js';
2
+ export * from './route.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/route/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
package/route/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from './route.types.js';
2
+ export * from './route.js';
@@ -0,0 +1,25 @@
1
+ import { IMobxHistory, IMobxLocation } from 'mobx-location-history';
2
+ import { ParamData, TokenData } from 'path-to-regexp';
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> {
6
+ path: TPath;
7
+ protected configuration: RouteConfiguration<TParentRoute>;
8
+ history: IMobxHistory;
9
+ location: IMobxLocation;
10
+ private _tokenData;
11
+ constructor(path: TPath, configuration?: RouteConfiguration<TParentRoute>);
12
+ get matchData(): RouteMatchesData<TPath> | null;
13
+ get isMatches(): boolean;
14
+ extend<TExtendedPath extends string>(path: TExtendedPath): Route<`${TPath}${TExtendedPath}`, this>;
15
+ protected processParams(params?: ExtractPathParams<TPath> | null | undefined): ParamData | undefined;
16
+ navigate(...args: AllPropertiesOptional<ExtractPathParams<TPath>> extends true ? [
17
+ params?: ExtractPathParams<TPath> | null | undefined,
18
+ navigateParams?: RouteNavigateParams
19
+ ] : [params: ExtractPathParams<TPath>, navigateParams?: RouteNavigateParams]): void;
20
+ protected get tokenData(): TokenData;
21
+ private static _globalConfiguration;
22
+ static setGlobalConfiguration(globalConfiguration: RouteGlobalConfiguration): void;
23
+ static get globalConfiguration(): RouteGlobalConfiguration;
24
+ }
25
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +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"}
package/route/route.js ADDED
@@ -0,0 +1,73 @@
1
+ import { computed, makeObservable } from 'mobx';
2
+ import { MobxHistory, MobxLocation, } from 'mobx-location-history';
3
+ import { compile, match, parse } from 'path-to-regexp';
4
+ export class Route {
5
+ path;
6
+ configuration;
7
+ history;
8
+ location;
9
+ _tokenData;
10
+ constructor(path, configuration = {}) {
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;
16
+ computed.struct(this, 'isMatches');
17
+ computed.struct(this, 'matchData');
18
+ makeObservable(this);
19
+ }
20
+ get matchData() {
21
+ const parsed = match(this.tokenData)(this.location.pathname);
22
+ if (parsed === false) {
23
+ return null;
24
+ }
25
+ return parsed;
26
+ }
27
+ get isMatches() {
28
+ return this.matchData !== null;
29
+ }
30
+ extend(path) {
31
+ return new Route(`${this.path}${path}`, this.configuration);
32
+ }
33
+ processParams(params) {
34
+ if (params == null)
35
+ return undefined;
36
+ return Object.entries(params).reduce((acc, [key, value]) => {
37
+ if (value != null) {
38
+ acc[key] = Array.isArray(value) ? value.map(String) : String(value);
39
+ }
40
+ return acc;
41
+ }, {});
42
+ }
43
+ navigate(...args) {
44
+ const path = compile(this.tokenData)(this.processParams(args[0]));
45
+ if (args[1]?.replace) {
46
+ this.history.replaceState(null, '', path);
47
+ }
48
+ else {
49
+ this.history.pushState(null, '', path);
50
+ }
51
+ }
52
+ get tokenData() {
53
+ if (!this._tokenData) {
54
+ this._tokenData = parse(this.path, this.configuration.parseOptions);
55
+ }
56
+ return this._tokenData;
57
+ }
58
+ static _globalConfiguration;
59
+ static setGlobalConfiguration(globalConfiguration) {
60
+ this._globalConfiguration = globalConfiguration;
61
+ }
62
+ static get globalConfiguration() {
63
+ if (!this._globalConfiguration) {
64
+ const history = new MobxHistory();
65
+ const location = new MobxLocation(history);
66
+ this.setGlobalConfiguration({
67
+ location,
68
+ history,
69
+ });
70
+ }
71
+ return this._globalConfiguration;
72
+ }
73
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=route.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.test.d.ts","sourceRoot":"","sources":["../../src/route/route.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ import { MobxHistory, MobxLocation } from 'mobx-location-history';
2
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
3
+ import { Route } from './route.js';
4
+ class MobxHistoryMock extends MobxHistory {
5
+ pushStateSpy = vi.fn();
6
+ replaceStateSpy = vi.fn();
7
+ pushState(data, unused, url) {
8
+ this.pushStateSpy(data, unused, url);
9
+ super.pushState(data, unused, url);
10
+ }
11
+ replaceState(data, unused, url) {
12
+ this.replaceStateSpy(data, unused, url);
13
+ super.replaceState(data, unused, url);
14
+ }
15
+ resetMocks() {
16
+ this.pushStateSpy.mockReset();
17
+ this.replaceStateSpy.mockReset();
18
+ }
19
+ }
20
+ describe('route', () => {
21
+ const history = new MobxHistoryMock();
22
+ const location = new MobxLocation(history);
23
+ Route.setGlobalConfiguration({
24
+ history,
25
+ location,
26
+ });
27
+ beforeEach(() => {
28
+ history.resetMocks();
29
+ });
30
+ it('/test', () => {
31
+ const route = new Route('/test');
32
+ route.navigate();
33
+ expect(history.pushStateSpy).toBeCalledWith(null, '', '/test');
34
+ });
35
+ it('/test/:id/:bar', () => {
36
+ const route = new Route('/test/:id/:bar');
37
+ route.navigate({
38
+ id: 1,
39
+ bar: 'barg',
40
+ });
41
+ expect(history.pushStateSpy).toBeCalledWith(null, '', '/test/1/barg');
42
+ });
43
+ it('/test/*splat', () => {
44
+ const route = new Route('/test/*splat');
45
+ route.navigate({
46
+ splat: [1, 2, 3],
47
+ });
48
+ expect(history.pushStateSpy).toBeCalledWith(null, '', '/test/1/2/3');
49
+ });
50
+ it('/users{/:id}/delete', () => {
51
+ const route = new Route('/users{/:id}/delete');
52
+ route.navigate({
53
+ id: 1,
54
+ });
55
+ expect(history.pushStateSpy).toBeCalledWith(null, '', '/users/1/delete');
56
+ history.resetMocks();
57
+ route.navigate();
58
+ expect(history.pushStateSpy).toBeCalledWith(null, '', '/users/delete');
59
+ history.resetMocks();
60
+ const childRoute = route.extend('/push/:id1{/:bar}');
61
+ childRoute.navigate({
62
+ id1: 1,
63
+ bar: 2,
64
+ id: 3,
65
+ });
66
+ expect(history.pushStateSpy).toBeCalledWith(null, '', '/users/3/delete/push/1/2');
67
+ });
68
+ it('/posts{/:slug}/*rest', () => {
69
+ const route = new Route('/posts{/:slug}/*rest');
70
+ route.navigate({
71
+ slug: true,
72
+ rest: [1, 2, 3, 'bar'],
73
+ });
74
+ expect(history.pushStateSpy).toBeCalledWith(null, '', '/posts/true/1/2/3/bar');
75
+ const otherRoute = new Route('/kek/pek');
76
+ expect(otherRoute.isMatches).toBe(false);
77
+ expect(route.isMatches).toBe(true);
78
+ expect(route.matchData).toEqual({
79
+ path: '/posts/true/1/2/3/bar',
80
+ params: {
81
+ rest: ['1', '2', '3', 'bar'],
82
+ slug: 'true',
83
+ },
84
+ });
85
+ });
86
+ });
@@ -0,0 +1,41 @@
1
+ import { IMobxHistory, IMobxLocation } from 'mobx-location-history';
2
+ import { ParseOptions } from 'path-to-regexp';
3
+ import type { Route } from './route.js';
4
+ export interface RouteGlobalConfiguration {
5
+ history: IMobxHistory;
6
+ location: IMobxLocation;
7
+ }
8
+ export interface RouteConfiguration<TParentRoute extends AnyRoute | null = null> extends Partial<RouteGlobalConfiguration> {
9
+ meta?: Record<string, any>;
10
+ parseOptions?: ParseOptions;
11
+ parent?: TParentRoute;
12
+ }
13
+ export type AnyRoute = Route<any, any>;
14
+ type ParamInputValue = string | number | boolean | null | undefined;
15
+ type ParamParsedValue = string;
16
+ type Simplify<T> = T extends infer U ? {
17
+ [K in keyof U]: U[K];
18
+ } : never;
19
+ export type ParsedPathParams<Path extends string> = Simplify<Path extends `${infer Prefix}{${infer Optional}}${infer Suffix}` ? ParsedPathParams<`${Prefix}${Suffix}`> & Partial<ParsedPathParams<Optional>> : Path extends `${infer PartA}/${infer PartB}` ? ParsedPathParams<PartA> & ParsedPathParams<PartB> : Path extends `:${infer Param}?` ? {
20
+ [K in Param]?: ParamParsedValue;
21
+ } : Path extends `:${infer Param}` ? {
22
+ [K in Param]: ParamParsedValue;
23
+ } : Path extends `*${infer Wildcard}` ? {
24
+ [K in Wildcard]: ParamParsedValue[];
25
+ } : {}>;
26
+ export type ExtractPathParams<Path extends string> = Simplify<Path extends `${infer Prefix}{${infer Optional}}${infer Suffix}` ? ExtractPathParams<`${Prefix}${Suffix}`> & Partial<ExtractPathParams<Optional>> : Path extends `${infer PartA}/${infer PartB}` ? ExtractPathParams<PartA> & ExtractPathParams<PartB> : Path extends `:${infer Param}?` ? {
27
+ [K in Param]?: ParamInputValue;
28
+ } : Path extends `:${infer Param}` ? {
29
+ [K in Param]: ParamInputValue;
30
+ } : Path extends `*${infer Wildcard}` ? {
31
+ [K in Wildcard]: ParamInputValue[];
32
+ } : {}>;
33
+ export interface RouteNavigateParams {
34
+ replace?: boolean;
35
+ }
36
+ export interface RouteMatchesData<TPath extends string> {
37
+ path: string;
38
+ params: ParsedPathParams<TPath>;
39
+ }
40
+ export {};
41
+ //# sourceMappingURL=route.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.types.d.ts","sourceRoot":"","sources":["../../src/route/route.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};