@uxf/router 1.7.1 → 2.1.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/README.md CHANGED
@@ -1,16 +1,20 @@
1
1
  # @uxf/router
2
2
 
3
- ## How to use
4
-
5
- Install:
3
+ ## Installation
6
4
 
7
5
  ```
8
6
  yarn add @uxf/router
9
7
  ```
8
+ or
9
+ ```
10
+ npm install @uxf/router --save
11
+ ```
10
12
 
11
- Create `routes.ts` inside your project:
13
+ - Create `routes` directory
14
+ - Create `routes.ts` and `index.ts` inside `routes` directory:
12
15
 
13
16
  ```ts
17
+ // routes/routes.ts
14
18
  import { Router as UxfRouter } from "@uxf/router";
15
19
 
16
20
  export interface RouteList {
@@ -19,77 +23,75 @@ export interface RouteList {
19
23
  "blog-article": { articleId: string };
20
24
  }
21
25
 
22
- const router = new UxfRouter<RouteList>({
26
+ export const router = new UxfRouter<RouteList>({
23
27
  index: "/",
24
28
  "blog": "/blog",
25
- "blog-article": "/blog/:articleId",
29
+ "blog-article": "/blog/[articleId]",
26
30
  });
31
+ ```
32
+
33
+ ```ts
34
+ // routes/index.ts
35
+ import { RouteList, router } from "./routes";
36
+ import { PropsGenerator, FunctionParametersGenerator, UxfNextPage } from "@uxf/router";
27
37
 
28
38
  export const Link = router.getLink();
29
39
  export const useRouter = router.getUseRouter();
30
40
  export const Router = router.getSingletonRouter();
31
- export const getRequestHandler = router.getRequestHandler;
32
- export type RouteName = keyof RouteList;
33
- ```
34
41
 
35
- ## On the server
42
+ export type RouteProps = PropsGenerator<RouteList>;
43
+ export type RouteParams = FunctionParametersGenerator<RouteList>;
44
+ export type NextPage<Route extends keyof RouteList, IP = Record<string, any>, P = IP> = UxfNextPage<RouteList, Route, IP, P>;
45
+ ```
36
46
 
37
- ```ts
38
- import next from "next";
39
- import { getRequestHandler } from "./routes";
40
- const app = next({ dev: process.env.NODE_ENV !== "production" });
41
- const handler = getRequestHandler(app);
42
-
43
- const { createServer } = require("http");
44
- app.prepare().then(() => {
45
- createServer(handler).listen(3000);
46
- });
47
+ Add configuration to `tsconfig.json`
48
+
49
+ ```json
50
+ {
51
+ "compilerOptions": {
52
+ "baseUrl": "./src",
53
+ "paths": {
54
+ "@app-routes": [
55
+ "routes"
56
+ ]
57
+ }
58
+ }
59
+ }
47
60
  ```
48
61
 
49
- ### Custom request handler
62
+ ## Typings
50
63
 
51
- ```ts
52
- import next from "next";
53
- import { RequestHandler } from "@uxf/router";
54
- import { getRequestHandler } from "./routes";
64
+ ### Function
55
65
 
56
- const app = next();
66
+ ```ts
67
+ import { RouteList } from "@app-routes";
68
+ import { FunctionParametersGenerator } from "@uxf/router";
57
69
 
58
- const customHandler: RequestHandler = async (req, res, pathname, queryParams) => {
59
- const html = await app.renderToHTML(req, res, pathname, queryParams);
60
-
61
- res.send(html);
70
+ const navigate: (...attrs: FunctionParametersGenerator<RouteList>) => void = (route, params = undefined) => {
71
+ // implement me
62
72
  }
63
-
64
- const handler = getRequestHandler(app, customHandler);
65
73
  ```
66
74
 
67
- ## On the client
75
+ ### Component
68
76
 
69
- ```tsx
70
- // pages/index.js
71
- import { Link } from '../routes'
77
+ ```ts
78
+ import { RouteList } from "@app-routes";
79
+ import { PropsGenerator } from "@uxf/router";
72
80
 
73
- export default () => (
74
- <Link route='blog-article' params={{ articleId: 12 }}>
75
- <a>Hello world</a>
76
- </Link>
77
- )
81
+ const SomeComponent: React.FC<PropsGenerator<RouteList>> = (props) => {
82
+ // implement me
83
+ }
78
84
  ```
79
85
 
80
- ## Anchor
86
+ ## How to use Link?
81
87
 
82
88
  ```tsx
83
89
  // pages/index.js
84
- import { Link, Router } from '../routes'
90
+ import { Link } from '@app-routes'
85
91
 
86
92
  export default () => (
87
- <Link route='blog-article' anchor="...">
93
+ <Link route='blog-article' params={{ articleId: 12 }}>
88
94
  <a>Hello world</a>
89
95
  </Link>
90
96
  )
91
-
92
- // or
93
-
94
- Router.push('blog-article', null, { anchor: "..." });
95
97
  ```
package/Router.d.ts CHANGED
@@ -1,21 +1,13 @@
1
1
  import React from "react";
2
- import { LinkProps, UxfRouter, UxfSingletonRouter, Config, RequestHandler } from "./types";
2
+ import { FunctionParametersGenerator, LinkProps, UxfRouter, UxfSingletonRouter } from "./types";
3
3
  export declare class Router<T> {
4
4
  private routes;
5
- private readonly config;
6
5
  constructor(routes: {
7
6
  [key in keyof T]: string;
8
- }, config?: Config<T>);
9
- private handleDefaultParams;
10
- private matchRoute;
11
- getRequestHandler: (app: any, customHandler?: RequestHandler | undefined) => (req: any, res: any) => any;
12
- getRouteByUrl: (url: string) => [keyof T, any];
13
- private getRoute;
14
- getUrls: (routeName: keyof T, params?: object | undefined, anchor?: string | undefined) => {
15
- as: string;
16
- href: string;
17
- };
7
+ });
8
+ private getRouteByPathname;
18
9
  getLink: () => React.FC<LinkProps<T>>;
19
10
  getUseRouter: () => () => UxfRouter<T>;
20
11
  getSingletonRouter: () => UxfSingletonRouter<T>;
12
+ getUrlByRoute: (...attrs: FunctionParametersGenerator<T>) => string;
21
13
  }
package/Router.js CHANGED
@@ -25,7 +25,7 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
25
25
  var __importStar = (this && this.__importStar) || function (mod) {
26
26
  if (mod && mod.__esModule) return mod;
27
27
  var result = {};
28
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
28
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
29
29
  __setModuleDefault(result, mod);
30
30
  return result;
31
31
  };
@@ -40,168 +40,70 @@ var __rest = (this && this.__rest) || function (s, e) {
40
40
  }
41
41
  return t;
42
42
  };
43
- var __values = (this && this.__values) || function(o) {
44
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
45
- if (m) return m.call(o);
46
- if (o && typeof o.length === "number") return {
47
- next: function () {
48
- if (o && i >= o.length) o = void 0;
49
- return { value: o && o[i++], done: !o };
50
- }
51
- };
52
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
53
- };
54
- var __read = (this && this.__read) || function (o, n) {
55
- var m = typeof Symbol === "function" && o[Symbol.iterator];
56
- if (!m) return o;
57
- var i = m.call(o), r, ar = [], e;
58
- try {
59
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
60
- }
61
- catch (error) { e = { error: error }; }
62
- finally {
63
- try {
64
- if (r && !r.done && (m = i["return"])) m.call(i);
65
- }
66
- finally { if (e) throw e.error; }
67
- }
68
- return ar;
69
- };
70
43
  var __importDefault = (this && this.__importDefault) || function (mod) {
71
44
  return (mod && mod.__esModule) ? mod : { "default": mod };
72
45
  };
73
46
  Object.defineProperty(exports, "__esModule", { value: true });
74
47
  exports.Router = void 0;
75
- var router_1 = __importStar(require("next/router"));
76
48
  var link_1 = __importDefault(require("next/link"));
49
+ var router_1 = __importStar(require("next/router"));
77
50
  var react_1 = __importDefault(require("react"));
78
- var url_1 = require("url");
79
- var MatchedRoute_1 = require("./MatchedRoute");
80
- var Route_1 = require("./Route");
51
+ var qs_1 = require("qs");
52
+ // TODO Vejvis: fix eslint ignores
81
53
  var Router = /** @class */ (function () {
82
- function Router(routes, config) {
83
- var e_1, _a;
54
+ function Router(routes) {
84
55
  var _this = this;
85
- if (config === void 0) { config = {}; }
86
- this.routes = [];
87
- this.getRequestHandler = function (app, customHandler) {
88
- var nextHandler = app.getRequestHandler();
89
- return function (req, res) {
90
- var _a;
91
- var url = req.url;
92
- var parsedUrl = url_1.parse(url, true);
93
- if (url.indexOf("/_next") === 0 || url.indexOf("/__nextjs") === 0) {
94
- return nextHandler(req, res, parsedUrl);
95
- }
96
- var matchedRoute = _this.matchRoute((_a = parsedUrl.pathname) !== null && _a !== void 0 ? _a : "");
97
- if (matchedRoute) {
98
- var matchResult = matchedRoute.matchResult, route = matchedRoute.route;
99
- if (customHandler) {
100
- return customHandler(req, res, route.page, __assign(__assign({}, parsedUrl.query), matchResult.params));
101
- }
102
- return app.render(req, res, route.page, __assign(__assign({}, parsedUrl.query), matchResult.params));
103
- }
104
- return nextHandler(req, res, parsedUrl);
105
- };
106
- };
107
- this.getRouteByUrl = function (url) {
108
- var _a;
109
- // TODO @vejvis - sjednotit s metodou getRequestHandler
110
- var parsedUrl = url_1.parse(url, true);
111
- var matchedRoute = _this.matchRoute((_a = parsedUrl.pathname) !== null && _a !== void 0 ? _a : "");
112
- if (matchedRoute) {
113
- return [matchedRoute.route.name, __assign(__assign({}, parsedUrl.query), matchedRoute.matchResult.params)];
114
- }
115
- throw new Error("Route for url '" + url + "' not found.");
116
- };
117
- this.getUrls = function (routeName, params, anchor) {
118
- var route = _this.getRoute(routeName);
119
- return {
120
- as: route.getAs(_this.handleDefaultParams(routeName, params)) + (anchor ? "#" + anchor : ""),
121
- href: route.getHref(_this.handleDefaultParams(routeName, params)),
122
- };
56
+ this.getRouteByPathname = function (pathname) {
57
+ return Object.keys(_this.routes).find(function (route) { return _this.routes[route] === pathname; });
123
58
  };
124
59
  this.getLink = function () { return function (props) {
125
- var route = props.route, params = props.params, anchor = props.anchor, linkProps = __rest(props, ["route", "params", "anchor"]);
126
- var _a = _this.getUrls(route, params || {}, anchor), as = _a.as, href = _a.href;
127
- return react_1.default.createElement(link_1.default, __assign({ as: as, href: href }, linkProps));
60
+ var route = props.route, params = props.params, linkProps = __rest(props, ["route", "params"]);
61
+ return react_1.default.createElement(link_1.default, __assign({ href: { pathname: _this.routes[route], query: params } }, linkProps));
128
62
  }; };
129
63
  this.getUseRouter = function () { return function () {
130
- var _a, _b, _c;
131
- var router = router_1.useRouter();
132
- var parsedUrl = url_1.parse(router.asPath, true);
133
- return __assign(__assign({}, router), { route: ((_c = (_b = _this.matchRoute((_a = parsedUrl.pathname) !== null && _a !== void 0 ? _a : "")) === null || _b === void 0 ? void 0 : _b.route.name) !== null && _c !== void 0 ? _c : null), push: function (route, params, options) {
134
- if (options === void 0) { options = {}; }
135
- var anchor = options.anchor, nextJsOptions = __rest(options, ["anchor"]);
136
- var _a = _this.getUrls(route, params || {}, anchor), as = _a.as, href = _a.href;
137
- return router.push(href, as, nextJsOptions);
64
+ var router = (0, router_1.useRouter)();
65
+ return __assign(__assign({}, router), { route: _this.getRouteByPathname(router.pathname), push: function (route, params, options) {
66
+ if (params === void 0) { params = undefined; }
67
+ if (options === void 0) { options = undefined; }
68
+ return router.push({ pathname: _this.routes[route], query: params }, undefined, options);
138
69
  }, replace: function (route, params, options) {
139
- if (options === void 0) { options = {}; }
140
- var anchor = options.anchor, nextJsOptions = __rest(options, ["anchor"]);
141
- var _a = _this.getUrls(route, params || {}), as = _a.as, href = _a.href;
142
- return router.replace(href, as, nextJsOptions);
70
+ if (params === void 0) { params = undefined; }
71
+ if (options === void 0) { options = undefined; }
72
+ return router.replace({ pathname: _this.routes[route], query: params }, undefined, options);
143
73
  } });
144
74
  }; };
145
75
  this.getSingletonRouter = function () {
146
76
  return __assign(__assign({}, router_1.default), { push: function (route, params, options) {
147
- if (options === void 0) { options = {}; }
148
- var anchor = options.anchor, nextJsOptions = __rest(options, ["anchor"]);
149
- var _a = _this.getUrls(route, params || {}, anchor), as = _a.as, href = _a.href;
150
- return router_1.default.push(href, as, nextJsOptions);
77
+ if (params === void 0) { params = undefined; }
78
+ if (options === void 0) { options = undefined; }
79
+ return router_1.default.push({ pathname: _this.routes[route], query: params }, undefined, options);
151
80
  }, replace: function (route, params, options) {
152
- if (options === void 0) { options = {}; }
153
- var anchor = options.anchor, nextJsOptions = __rest(options, ["anchor"]);
154
- var _a = _this.getUrls(route, params || {}, anchor), as = _a.as, href = _a.href;
155
- return router_1.default.replace(href, as, nextJsOptions);
81
+ if (params === void 0) { params = undefined; }
82
+ if (options === void 0) { options = undefined; }
83
+ return router_1.default.replace({ pathname: _this.routes[route], query: params }, undefined, options);
156
84
  } });
157
85
  };
158
- try {
159
- for (var _b = __values(Object.entries(routes)), _c = _b.next(); !_c.done; _c = _b.next()) {
160
- var _d = __read(_c.value, 2), routeName = _d[0], pattern = _d[1];
161
- this.routes.push(new Route_1.Route(routeName, pattern)); // TODO
162
- }
163
- }
164
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
165
- finally {
166
- try {
167
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
168
- }
169
- finally { if (e_1) throw e_1.error; }
170
- }
171
- this.config = config;
172
- }
173
- Router.prototype.handleDefaultParams = function (route, params) {
174
- var _a = this.config.defaultParams, defaultParams = _a === void 0 ? function (_, params) { return params; } : _a;
175
- return defaultParams(route, params);
176
- };
177
- Router.prototype.matchRoute = function (url) {
178
- var e_2, _a;
179
- try {
180
- for (var _b = __values(this.routes), _c = _b.next(); !_c.done; _c = _b.next()) {
181
- var route = _c.value;
182
- var matchResult = route.match(url);
183
- if (matchResult) {
184
- return new MatchedRoute_1.MatchedRoute(route, matchResult);
86
+ this.getUrlByRoute = function (route, params) {
87
+ if (params === void 0) { params = undefined; }
88
+ var pathname = _this.routes[route];
89
+ var restParams = {};
90
+ Object.keys(params !== null && params !== void 0 ? params : {}).forEach(function (key) {
91
+ var value = params[key];
92
+ if (pathname.includes("[".concat(key, "]"))) {
93
+ pathname = pathname.replace("[".concat(key, "]"), value);
185
94
  }
95
+ else {
96
+ restParams[key] = value;
97
+ }
98
+ });
99
+ if (Object.keys(restParams).length > 0) {
100
+ pathname = "".concat(pathname, "?").concat((0, qs_1.stringify)(restParams));
186
101
  }
187
- }
188
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
189
- finally {
190
- try {
191
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
192
- }
193
- finally { if (e_2) throw e_2.error; }
194
- }
195
- return null;
196
- };
197
- Router.prototype.getRoute = function (routeName) {
198
- var route = this.routes.find(function (r) { return r.name === routeName; });
199
- if (!route) {
200
- throw new Error("Route '" + routeName + "' not found.");
201
- }
202
- return route;
203
- };
102
+ return pathname;
103
+ };
104
+ this.routes = routes;
105
+ }
204
106
  return Router;
205
107
  }());
206
108
  exports.Router = Router;
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1JvdXRlci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBOEU7QUFDOUUsbURBQWlDO0FBQ2pDLGdEQUEwQjtBQUMxQiwyQkFBNEI7QUFDNUIsK0NBQThDO0FBQzlDLGlDQUFnQztBQUdoQztJQUlJLGdCQUFZLE1BQW9DLEVBQUUsTUFBc0I7O1FBQXhFLGlCQUtDO1FBTGlELHVCQUFBLEVBQUEsV0FBc0I7UUFIaEUsV0FBTSxHQUFZLEVBQUUsQ0FBQztRQTJCdEIsc0JBQWlCLEdBQUcsVUFBQyxHQUFRLEVBQUUsYUFBOEI7WUFDaEUsSUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFFNUMsT0FBTyxVQUFDLEdBQVEsRUFBRSxHQUFROztnQkFDdEIsSUFBTSxHQUFHLEdBQVcsR0FBRyxDQUFDLEdBQUcsQ0FBQztnQkFFNUIsSUFBTSxTQUFTLEdBQUcsV0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFFbkMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDL0QsT0FBTyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztpQkFDM0M7Z0JBRUQsSUFBTSxZQUFZLEdBQUcsS0FBSSxDQUFDLFVBQVUsT0FBQyxTQUFTLENBQUMsUUFBUSxtQ0FBSSxFQUFFLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxZQUFZLEVBQUU7b0JBQ04sSUFBQSxXQUFXLEdBQVksWUFBWSxZQUF4QixFQUFFLEtBQUssR0FBSyxZQUFZLE1BQWpCLENBQWtCO29C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
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1JvdXRlci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtREFBaUM7QUFDakMsb0RBQThFO0FBQzlFLGdEQUEwQjtBQUUxQix5QkFBK0I7QUFFL0Isa0NBQWtDO0FBQ2xDO0lBR0ksZ0JBQVksTUFBb0M7UUFBaEQsaUJBRUM7UUFFTyx1QkFBa0IsR0FBRyxVQUFDLFFBQWdCO1lBQzFDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUMsS0FBSyxJQUFLLE9BQUMsS0FBSSxDQUFDLE1BQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxRQUFRLEVBQXhDLENBQXdDLENBQVEsQ0FBQztRQUNyRyxDQUFDLENBQUM7UUFFSyxZQUFPLEdBQUcsY0FBOEIsT0FBQSxVQUFDLEtBQUs7WUFDekMsSUFBQSxLQUFLLEdBQTJCLEtBQUssTUFBaEMsRUFBRSxNQUFNLEdBQW1CLEtBQUssT0FBeEIsRUFBSyxTQUFTLFVBQUssS0FBSyxFQUF2QyxtQkFBK0IsQ0FBRixDQUFXO1lBQzlDLE9BQU8sOEJBQUMsY0FBUSxhQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFhLEVBQUUsSUFBTSxTQUFTLEVBQUksQ0FBQztRQUNyRyxDQUFDLEVBSDhDLENBRzlDLENBQUM7UUFFSyxpQkFBWSxHQUFHLGNBQU0sT0FBQTtZQUN4QixJQUFNLE1BQU0sR0FBRyxJQUFBLGtCQUFhLEdBQUUsQ0FBQztZQUUvQiw2QkFDTyxNQUFNLEtBQ1QsS0FBSyxFQUFFLEtBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQy9DLElBQUksRUFBRSxVQUFDLEtB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
package/Router.test.js CHANGED
@@ -1,34 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- var Route_1 = require("./Route");
4
3
  var Router_1 = require("./Router");
5
- var route = function (pattern) { return new Route_1.Route("", pattern); };
6
4
  var router = new Router_1.Router({
7
5
  index: "/",
8
- form: "/form/:id",
9
- "form-field": "/form/:formId/field/:fieldId",
6
+ form: "/form/[id]",
7
+ "form-field": "/form/[formId]/field/[fieldId]",
10
8
  });
11
- test("Route::match", function () {
12
- expect(route("/test/:param").match("/test/nejaky-parametr")).toEqual({
13
- path: "/test/nejaky-parametr",
14
- index: 0,
15
- params: { param: "nejaky-parametr" },
16
- });
17
- expect(route("/test").match("/test")).toEqual({ path: "/test", index: 0, params: {} });
18
- expect(route("/").match("/")).toEqual({ path: "/", index: 0, params: {} });
9
+ test("getUrlByRoute", function () {
10
+ expect(router.getUrlByRoute("form", { id: 12, attr: "abc" })).toBe("/form/12?attr=abc");
11
+ expect(router.getUrlByRoute("form-field", { formId: 33, fieldId: "aaa", param1: "ano" })).toBe("/form/33/field/aaa?param1=ano");
19
12
  });
20
- test("Route::urls", function () {
21
- expect(router.getUrls("index", { param1: "test-param" })).toEqual({
22
- as: "/?param1=test-param",
23
- href: "/?param1=test-param",
24
- });
25
- expect(router.getUrls("form", { id: 1, param1: "test-param" })).toEqual({
26
- as: "/form/1?param1=test-param",
27
- href: "/form?id=1&param1=test-param",
28
- });
29
- expect(router.getUrls("form-field", { formId: 1, fieldId: 2, param1: "test-param" })).toEqual({
30
- as: "/form/1/field/2?param1=test-param",
31
- href: "/form-field?formId=1&fieldId=2&param1=test-param",
32
- });
33
- });
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm91dGVyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUm91dGVyLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxpQ0FBZ0M7QUFDaEMsbUNBQWtDO0FBRWxDLElBQU0sS0FBSyxHQUFHLFVBQUMsT0FBZSxJQUFLLE9BQUEsSUFBSSxhQUFLLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUF0QixDQUFzQixDQUFDO0FBRTFELElBQU0sTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDO0lBQ3RCLEtBQUssRUFBRSxHQUFHO0lBQ1YsSUFBSSxFQUFFLFdBQVc7SUFDakIsWUFBWSxFQUFFLDhCQUE4QjtDQUMvQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsY0FBYyxFQUFFO0lBQ2pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDakUsSUFBSSxFQUFFLHVCQUF1QjtRQUM3QixLQUFLLEVBQUUsQ0FBQztRQUNSLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRTtLQUN2QyxDQUFDLENBQUM7SUFFSCxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUV2RixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMvRSxDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQyxhQUFhLEVBQUU7SUFDaEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDOUQsRUFBRSxFQUFFLHFCQUFxQjtRQUN6QixJQUFJLEVBQUUscUJBQXFCO0tBQzlCLENBQUMsQ0FBQztJQUVILE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDcEUsRUFBRSxFQUFFLDJCQUEyQjtRQUMvQixJQUFJLEVBQUUsOEJBQThCO0tBQ3ZDLENBQUMsQ0FBQztJQUVILE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUMxRixFQUFFLEVBQUUsbUNBQW1DO1FBQ3ZDLElBQUksRUFBRSxrREFBa0Q7S0FDM0QsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDLENBQUMifQ==
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm91dGVyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUm91dGVyLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtQ0FBa0M7QUFFbEMsSUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUM7SUFDdEIsS0FBSyxFQUFFLEdBQUc7SUFDVixJQUFJLEVBQUUsWUFBWTtJQUNsQixZQUFZLEVBQUUsZ0NBQWdDO0NBQ2pELENBQUMsQ0FBQztBQUVILElBQUksQ0FBQyxlQUFlLEVBQUU7SUFDbEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3hGLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDMUYsK0JBQStCLENBQ2xDLENBQUM7QUFDTixDQUFDLENBQUMsQ0FBQyJ9
package/helper.js CHANGED
@@ -1,8 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.queryParamToNumber = exports.queryParamToString = void 0;
4
- exports.queryParamToString = function (param) { return (typeof param === "string" ? param : ""); };
5
- exports.queryParamToNumber = function (param) {
4
+ var queryParamToString = function (param) { return (typeof param === "string" ? param : ""); };
5
+ exports.queryParamToString = queryParamToString;
6
+ var queryParamToNumber = function (param) {
6
7
  return typeof param === "string" ? parseInt(param, 10) : 0;
7
8
  };
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2hlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBYSxRQUFBLGtCQUFrQixHQUFHLFVBQUMsS0FBeUIsSUFBYSxPQUFBLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUF4QyxDQUF3QyxDQUFDO0FBRXJHLFFBQUEsa0JBQWtCLEdBQUcsVUFBQyxLQUF5QjtJQUN4RCxPQUFBLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUFuRCxDQUFtRCxDQUFDIn0=
9
+ exports.queryParamToNumber = queryParamToNumber;
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2hlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBTyxJQUFNLGtCQUFrQixHQUFHLFVBQUMsS0FBeUIsSUFBYSxPQUFBLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUF4QyxDQUF3QyxDQUFDO0FBQXJHLFFBQUEsa0JBQWtCLHNCQUFtRjtBQUUzRyxJQUFNLGtCQUFrQixHQUFHLFVBQUMsS0FBeUI7SUFDeEQsT0FBQSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFBbkQsQ0FBbUQsQ0FBQztBQUQzQyxRQUFBLGtCQUFrQixzQkFDeUIifQ==
package/index.js CHANGED
@@ -7,7 +7,7 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
7
7
  o[k2] = m[k];
8
8
  }));
9
9
  var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
- for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
11
  };
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
13
  __exportStar(require("./Router"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uxf/router",
3
- "version": "1.7.1",
3
+ "version": "2.1.1",
4
4
  "description": "UXF Router",
5
5
  "author": "UXFans <dev@uxf.cz>",
6
6
  "homepage": "https://gitlab.com/uxf-npm/router#readme",
@@ -19,31 +19,36 @@
19
19
  "build": "tsc -P tsconfig.build.json",
20
20
  "build:next": "next build",
21
21
  "clean": "rm -rf ./dist",
22
- "dev": "ts-node -P tsconfig.server.json server.ts",
22
+ "dev": "next dev",
23
23
  "prepublish": "npm run-script build",
24
24
  "test": "npm run-script typecheck",
25
- "typecheck": "tsc --noEmit --skipLibCheck"
25
+ "typecheck": "tsc --noEmit --skipLibCheck",
26
+ "lint": "./node_modules/.bin/eslint -c .eslintrc.js \"./**/*.ts*\""
26
27
  },
27
28
  "bugs": {
28
- "url": "https://gitlab.com/uxf-npm/cms/issues"
29
+ "url": "https://gitlab.com/uxf-npm/router/issues"
29
30
  },
30
31
  "dependencies": {
31
- "path-to-regexp": "^6.1.0"
32
+ "qs": "^6.10.1"
32
33
  },
33
34
  "devDependencies": {
34
- "@types/jest": "^25.2.1",
35
- "@types/node": "^13.13.4",
36
- "@types/react": "^16.9.0",
37
- "@types/react-dom": "^16.9.0",
38
- "jest": "^25.5.4",
39
- "next": "^9.5.1",
40
- "path": "^0.12.7",
41
- "prettier": "^2.1.2",
42
- "react": "^16.9.0",
43
- "react-dom": "^16.9.0",
44
- "ts-jest": "^25.5.1",
45
- "ts-node": "^9.0.0",
46
- "typescript": "^3.8.3"
35
+ "@types/jest": "^27.4.0",
36
+ "@types/node": "^17.0.10",
37
+ "@types/qs": "^6.9.7",
38
+ "@types/react": "^17.0.38",
39
+ "@types/react-dom": "^17.0.11",
40
+ "jest": "^27.4.7",
41
+ "next": "^12.0.8",
42
+ "prettier": "^2.5.1",
43
+ "react": "^17.0.2",
44
+ "react-dom": "^17.0.2",
45
+ "ts-jest": "^27.1.3",
46
+ "typescript": "^4.5.4",
47
+ "@typescript-eslint/eslint-plugin": "^5.11.0",
48
+ "@uxf/eslint-config": "^1.2.3",
49
+ "eslint": "^8.8.0",
50
+ "eslint-config-prettier": "^8.3.0",
51
+ "eslint-plugin-prettier": "^4.0.0"
47
52
  },
48
53
  "peerDependencies": {
49
54
  "react": "^16 || ^17",
package/types.d.ts CHANGED
@@ -1,27 +1,39 @@
1
- /// <reference types="node" />
2
1
  import { LinkProps as NextLinkProps } from "next/link";
3
2
  import { NextRouter, SingletonRouter } from "next/router";
4
- import { ParsedUrlQuery } from "querystring";
3
+ import { NextComponentType, NextPageContext } from "next";
5
4
  export interface Options {
6
5
  anchor?: string;
7
6
  shallow?: boolean;
8
7
  [key: string]: any;
9
8
  }
10
- export declare type LinkProps<T, R extends keyof T = keyof T> = Omit<NextLinkProps, "as" | "href"> & {
11
- route: R;
12
- params?: T[R];
13
- anchor?: string;
14
- };
9
+ export declare type LinkProps<RouteList> = Omit<NextLinkProps, "as" | "href"> & PropsGenerator<RouteList>;
15
10
  export interface UxfRouter<T> extends Omit<NextRouter, "push" | "replace" | "route"> {
16
11
  route: keyof T | null;
17
- push: (route: keyof T, params?: T[typeof route], options?: Options) => Promise<boolean>;
18
- replace: (route: keyof T, params?: T[typeof route], options?: Options) => Promise<boolean>;
12
+ push: (...attr: FunctionParametersWithOptionsGenerator<T>) => Promise<boolean>;
13
+ replace: (...attr: FunctionParametersWithOptionsGenerator<T>) => Promise<boolean>;
19
14
  }
20
15
  export interface UxfSingletonRouter<T> extends Omit<SingletonRouter, "push" | "replace"> {
21
- push: (route: keyof T, params?: T[typeof route], options?: Options) => Promise<boolean>;
22
- replace: (route: keyof T, params?: T[typeof route], options?: Options) => Promise<boolean>;
16
+ push: (...attr: FunctionParametersWithOptionsGenerator<T>) => Promise<boolean>;
17
+ replace: (...attr: FunctionParametersWithOptionsGenerator<T>) => Promise<boolean>;
23
18
  }
24
- export interface Config<T> {
25
- defaultParams?: (route: keyof T, params: any) => any;
19
+ export declare type PropsGenerator<Routes> = {
20
+ [K in keyof Routes]: Routes[K] extends null ? {
21
+ route: K;
22
+ params?: never;
23
+ } : {
24
+ route: K;
25
+ params: Routes[K];
26
+ };
27
+ }[keyof Routes];
28
+ export declare type FunctionParametersGenerator<Routes> = {
29
+ [K in keyof Routes]: Routes[K] extends null ? [K] : [K, Routes[K]];
30
+ }[keyof Routes];
31
+ export declare type FunctionParametersWithOptionsGenerator<Routes> = {
32
+ [K in keyof Routes]: Routes[K] extends null ? [K] | [K, Options] : [K, Routes[K]] | [K, Routes[K], Options];
33
+ }[keyof Routes];
34
+ export interface UxfPageContext<Routes, T extends keyof Routes> extends Omit<NextPageContext, "query"> {
35
+ query: Routes[T] extends null ? Record<string, any> : {
36
+ [key in keyof Routes[T]]: string | string[] | undefined;
37
+ };
26
38
  }
27
- export declare type RequestHandler = (req: any, res: any, pathname: string, query: ParsedUrlQuery) => Promise<void>;
39
+ export declare type UxfNextPage<Routes, Route extends keyof Routes, IP = Record<string, any>, P = IP> = NextComponentType<UxfPageContext<Routes, Route>, IP, P>;
package/MatchedRoute.d.ts DELETED
@@ -1,9 +0,0 @@
1
- import { MatchResult } from "path-to-regexp";
2
- import { Route } from "./Route";
3
- export declare class MatchedRoute {
4
- private _route;
5
- private _matchResult;
6
- constructor(route: Route, match: MatchResult);
7
- get route(): Route;
8
- get matchResult(): MatchResult;
9
- }
package/MatchedRoute.js DELETED
@@ -1,26 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MatchedRoute = void 0;
4
- var MatchedRoute = /** @class */ (function () {
5
- function MatchedRoute(route, match) {
6
- this._route = route;
7
- this._matchResult = match;
8
- }
9
- Object.defineProperty(MatchedRoute.prototype, "route", {
10
- get: function () {
11
- return this._route;
12
- },
13
- enumerable: false,
14
- configurable: true
15
- });
16
- Object.defineProperty(MatchedRoute.prototype, "matchResult", {
17
- get: function () {
18
- return this._matchResult;
19
- },
20
- enumerable: false,
21
- configurable: true
22
- });
23
- return MatchedRoute;
24
- }());
25
- exports.MatchedRoute = MatchedRoute;
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF0Y2hlZFJvdXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL01hdGNoZWRSb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQTtJQUlJLHNCQUFZLEtBQVksRUFBRSxLQUFrQjtRQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBRUQsc0JBQUksK0JBQUs7YUFBVDtZQUNJLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN2QixDQUFDOzs7T0FBQTtJQUVELHNCQUFJLHFDQUFXO2FBQWY7WUFDSSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDN0IsQ0FBQzs7O09BQUE7SUFDTCxtQkFBQztBQUFELENBQUMsQUFoQkQsSUFnQkM7QUFoQlksb0NBQVkifQ==
package/Route.d.ts DELETED
@@ -1,17 +0,0 @@
1
- import { Match } from "path-to-regexp";
2
- export declare class Route {
3
- private readonly _name;
4
- private readonly _pattern;
5
- private readonly _page;
6
- private _keys;
7
- private _keyNames;
8
- private matchFunction;
9
- private compileFunction;
10
- constructor(name: string, pattern: string);
11
- match(url: string): Match;
12
- getHref(params?: {}): string;
13
- getAs(params?: {}): string;
14
- get name(): string;
15
- get pattern(): string;
16
- get page(): string;
17
- }
package/Route.js DELETED
@@ -1,86 +0,0 @@
1
- "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.Route = void 0;
15
- var path_to_regexp_1 = require("path-to-regexp");
16
- function toQuerystring(obj) {
17
- return Object.keys(obj)
18
- .filter(function (key) { return obj[key] !== null && obj[key] !== undefined; })
19
- .map(function (key) {
20
- var value = obj[key];
21
- if (Array.isArray(value)) {
22
- value = value.join("/");
23
- }
24
- return [encodeURIComponent(key), encodeURIComponent(value)].join("=");
25
- })
26
- .join("&");
27
- }
28
- var Route = /** @class */ (function () {
29
- function Route(name, pattern) {
30
- this._keys = [];
31
- this._name = name;
32
- this._page = name.replace(/(^|\/)index$/, "").replace(/^\/?/, "/");
33
- this._pattern = pattern;
34
- path_to_regexp_1.pathToRegexp(pattern, this._keys);
35
- this._keyNames = this._keys.map(function (k) { return k.name.toString(); });
36
- this.matchFunction = path_to_regexp_1.match(pattern, { encode: encodeURI, decode: decodeURIComponent });
37
- this.compileFunction = path_to_regexp_1.compile(pattern, { encode: encodeURI });
38
- }
39
- Route.prototype.match = function (url) {
40
- var _a;
41
- return (_a = this.matchFunction(url)) !== null && _a !== void 0 ? _a : null;
42
- };
43
- Route.prototype.getHref = function (params) {
44
- if (params === void 0) { params = {}; }
45
- return this.page + "?" + toQuerystring(params);
46
- };
47
- Route.prototype.getAs = function (params) {
48
- var _this = this;
49
- if (params === void 0) { params = {}; }
50
- var as = this.compileFunction(params) || "/";
51
- var keys = Object.keys(params);
52
- var qsKeys = keys.filter(function (key) { return _this._keyNames.indexOf(key) === -1; });
53
- if (qsKeys.length === 0) {
54
- return as;
55
- }
56
- var qsParams = qsKeys.reduce(function (qs, key) {
57
- var _a;
58
- return (__assign(__assign({}, qs), (_a = {}, _a[key] = params[key], _a)));
59
- }, {});
60
- return as + "?" + toQuerystring(qsParams);
61
- };
62
- Object.defineProperty(Route.prototype, "name", {
63
- get: function () {
64
- return this._name;
65
- },
66
- enumerable: false,
67
- configurable: true
68
- });
69
- Object.defineProperty(Route.prototype, "pattern", {
70
- get: function () {
71
- return this._pattern;
72
- },
73
- enumerable: false,
74
- configurable: true
75
- });
76
- Object.defineProperty(Route.prototype, "page", {
77
- get: function () {
78
- return this._page;
79
- },
80
- enumerable: false,
81
- configurable: true
82
- });
83
- return Route;
84
- }());
85
- exports.Route = Route;
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvUm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBMEU7QUFFMUUsU0FBUyxhQUFhLENBQUMsR0FBUTtJQUMzQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1NBQ2xCLE1BQU0sQ0FBQyxVQUFDLEdBQUcsSUFBSyxPQUFBLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsRUFBM0MsQ0FBMkMsQ0FBQztTQUM1RCxHQUFHLENBQUMsVUFBQyxHQUFHO1FBQ0wsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXJCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN0QixLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUMzQjtRQUNELE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxRSxDQUFDLENBQUM7U0FDRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkIsQ0FBQztBQUVEO0lBVUksZUFBWSxJQUFZLEVBQUUsT0FBZTtRQU5qQyxVQUFLLEdBQVUsRUFBRSxDQUFDO1FBT3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4Qiw2QkFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQWpCLENBQWlCLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUMsYUFBYSxHQUFHLHNCQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxlQUFlLEdBQUcsd0JBQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU0scUJBQUssR0FBWixVQUFhLEdBQVc7O1FBQ3BCLGFBQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsbUNBQUksSUFBSSxDQUFDO0lBQzNDLENBQUM7SUFFTSx1QkFBTyxHQUFkLFVBQWUsTUFBVztRQUFYLHVCQUFBLEVBQUEsV0FBVztRQUN0QixPQUFVLElBQUksQ0FBQyxJQUFJLFNBQUksYUFBYSxDQUFDLE1BQU0sQ0FBRyxDQUFDO0lBQ25ELENBQUM7SUFFTSxxQkFBSyxHQUFaLFVBQWEsTUFBVztRQUF4QixpQkFrQkM7UUFsQlksdUJBQUEsRUFBQSxXQUFXO1FBQ3BCLElBQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDO1FBQy9DLElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakMsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFDLEdBQUcsSUFBSyxPQUFBLEtBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFsQyxDQUFrQyxDQUFDLENBQUM7UUFFeEUsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNyQixPQUFPLEVBQUUsQ0FBQztTQUNiO1FBRUQsSUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDMUIsVUFBQyxFQUFFLEVBQUUsR0FBRzs7WUFBSyxPQUFBLHVCQUNOLEVBQUUsZ0JBQ0osR0FBRyxJQUFJLE1BQWMsQ0FBQyxHQUFHLENBQUMsT0FDN0I7UUFIVyxDQUdYLEVBQ0YsRUFBRSxDQUNMLENBQUM7UUFFRixPQUFVLEVBQUUsU0FBSSxhQUFhLENBQUMsUUFBUSxDQUFHLENBQUM7SUFDOUMsQ0FBQztJQUVELHNCQUFJLHVCQUFJO2FBQVI7WUFDSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdEIsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSwwQkFBTzthQUFYO1lBQ0ksT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3pCLENBQUM7OztPQUFBO0lBRUQsc0JBQUksdUJBQUk7YUFBUjtZQUNJLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN0QixDQUFDOzs7T0FBQTtJQUNMLFlBQUM7QUFBRCxDQUFDLEFBNURELElBNERDO0FBNURZLHNCQUFLIn0=