jordy 0.13.0 → 0.14.2
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/esm5/adaptive-render/DeviceDetectContext.js +3 -2
- package/esm5/hooks/index.js +1 -0
- package/esm5/hooks/useNavigate.js +49 -0
- package/esm5/http-api/BasicHttpApi.js +72 -36
- package/esm5/http-api/BasicHttpUploadApi.js +24 -12
- package/esm5/http-api/ErrorParser.decorator.js +7 -7
- package/esm5/http-api/network.util.js +2 -1
- package/esm5/index.js +2 -2
- package/esm5/proxies/cache.proxy.js +2 -2
- package/esm5/queries/buildMutationCreator.js +4 -4
- package/esm5/queries/buildQueryCreator.js +5 -5
- package/esm5/route-system/index.js +2 -3
- package/esm5/route-system/useRouteSystem.fixture.js +73 -0
- package/esm5/route-system/useRouteSystem.js +51 -0
- package/esm5/route-system/{moduleRoute.model.js → useRouteSystem.model.js} +0 -0
- package/esm5/util/collection.js +5 -5
- package/esm5/util/queryString.js +3 -2
- package/libs/adaptive-render/AdaptiveRender.d.ts +4 -3
- package/libs/adaptive-render/DeviceDetectContext.d.ts +6 -2
- package/libs/hooks/index.d.ts +1 -0
- package/libs/hooks/useNavigate.d.ts +46 -0
- package/libs/index.d.ts +2 -2
- package/libs/queries/buildMutationCreator.d.ts +2 -2
- package/libs/queries/buildQueryCreator.d.ts +2 -2
- package/libs/route-system/index.d.ts +2 -3
- package/libs/route-system/useRouteSystem.d.ts +35 -0
- package/libs/route-system/useRouteSystem.fixture.d.ts +4 -0
- package/libs/route-system/useRouteSystem.model.d.ts +41 -0
- package/package.json +11 -8
- package/esm5/route-system/AsyncGuard.js +0 -37
- package/esm5/route-system/renderRouteSystem.js +0 -64
- package/esm5/route-system/routeSystem.util.js +0 -23
- package/libs/route-system/AsyncGuard.d.ts +0 -8
- package/libs/route-system/moduleRoute.model.d.ts +0 -49
- package/libs/route-system/renderRouteSystem.d.ts +0 -5
- package/libs/route-system/routeSystem.util.d.ts +0 -4
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { __read } from "tslib";
|
|
1
2
|
import React, { createContext, useContext, useEffect, useMemo, useState, } from 'react';
|
|
2
3
|
import { isMobile as isMobileCheck, isNativeApp as isNativeAppCheck, isServer, isTablet as isTabletCheck, } from '../util/envCheck';
|
|
3
4
|
import { DeviceSizeEnum } from './device.type';
|
|
@@ -33,8 +34,8 @@ export var DeviceDetectContext = createContext([
|
|
|
33
34
|
var DeviceDetectContextProvider = DeviceDetectContext.Provider;
|
|
34
35
|
export var DeviceDetectProvider = function (_a) {
|
|
35
36
|
var children = _a.children;
|
|
36
|
-
var _b = useState(getIsMobile()), isMobile = _b[0], setIsMobile = _b[1];
|
|
37
|
-
var _c = useState(getIsTablet()), isTablet = _c[0], setIsTablet = _c[1];
|
|
37
|
+
var _b = __read(useState(getIsMobile()), 2), isMobile = _b[0], setIsMobile = _b[1];
|
|
38
|
+
var _c = __read(useState(getIsTablet()), 2), isTablet = _c[0], setIsTablet = _c[1];
|
|
38
39
|
var isNative = useMemo(isNativeAppCheck, []);
|
|
39
40
|
useEffect(function () {
|
|
40
41
|
if (isServer() || !window || typeof window.matchMedia !== 'function') {
|
package/esm5/hooks/index.js
CHANGED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { __assign, __read, __spreadArray } from "tslib";
|
|
2
|
+
import { useCallback } from 'react';
|
|
3
|
+
import { useNavigate as useRcNavigate, useSearchParams, } from 'react-router-dom';
|
|
4
|
+
import { isNullable, isObject, isUndefined } from '../util';
|
|
5
|
+
function instanceOfTo(to) {
|
|
6
|
+
return isObject(to) && ('pathname' in to || 'search' in to || 'hash' in to);
|
|
7
|
+
}
|
|
8
|
+
function instanceOfSearchParams(to) {
|
|
9
|
+
return !instanceOfTo(to) && isObject(to);
|
|
10
|
+
}
|
|
11
|
+
function isMergeQueries(option) {
|
|
12
|
+
return isUndefined(option) || (option && option['merge'] === true);
|
|
13
|
+
}
|
|
14
|
+
export function useNavigate() {
|
|
15
|
+
var _a = __read(useSearchParams(), 2), currentSearchParams = _a[0], setSearchParams = _a[1];
|
|
16
|
+
var navigate = useRcNavigate();
|
|
17
|
+
var navigation = useCallback(function (to, option) {
|
|
18
|
+
var _a;
|
|
19
|
+
if (typeof to === 'number') {
|
|
20
|
+
return navigate(to);
|
|
21
|
+
}
|
|
22
|
+
if (typeof to === 'string') {
|
|
23
|
+
return navigate(to, option);
|
|
24
|
+
}
|
|
25
|
+
if (instanceOfTo(to)) {
|
|
26
|
+
return navigate(to, option);
|
|
27
|
+
}
|
|
28
|
+
if (instanceOfSearchParams(to)) {
|
|
29
|
+
var newQueries = {};
|
|
30
|
+
for (var key in to) {
|
|
31
|
+
if (isNullable(to[key]) || to[key] === '') {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
newQueries = __assign(__assign({}, newQueries), (_a = {}, _a[key] = to[key], _a));
|
|
35
|
+
}
|
|
36
|
+
if (isMergeQueries(option)) {
|
|
37
|
+
var currentQueries = __spreadArray([], __read(currentSearchParams), false).reduce(function (acc, _a) {
|
|
38
|
+
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
39
|
+
acc[key] = value;
|
|
40
|
+
return acc;
|
|
41
|
+
}, {});
|
|
42
|
+
return setSearchParams(__assign(__assign({}, currentQueries), newQueries), option);
|
|
43
|
+
}
|
|
44
|
+
return setSearchParams(newQueries, option);
|
|
45
|
+
}
|
|
46
|
+
return navigate(to, option);
|
|
47
|
+
}, [currentSearchParams, navigate, setSearchParams]);
|
|
48
|
+
return navigation;
|
|
49
|
+
}
|
|
@@ -14,110 +14,140 @@ var BasicHttpApi = (function (_super) {
|
|
|
14
14
|
}
|
|
15
15
|
BasicHttpApi.prototype.get = function (url, params, timeout) {
|
|
16
16
|
return __awaiter(this, void 0, void 0, function () {
|
|
17
|
-
var headers;
|
|
17
|
+
var headers, error_1;
|
|
18
18
|
return __generator(this, function (_a) {
|
|
19
19
|
switch (_a.label) {
|
|
20
|
-
case 0:
|
|
20
|
+
case 0:
|
|
21
|
+
_a.trys.push([0, 3, , 4]);
|
|
22
|
+
return [4, this.headersCreator()];
|
|
21
23
|
case 1:
|
|
22
24
|
headers = _a.sent();
|
|
23
|
-
return [
|
|
24
|
-
.get({
|
|
25
|
+
return [4, this.provider.get({
|
|
25
26
|
url: "".concat(this.baseUrl).concat(url),
|
|
26
27
|
headers: headers,
|
|
27
28
|
withCredentials: this.withCredentials,
|
|
28
29
|
paramsSerializer: this.paramsSerializer,
|
|
29
30
|
params: this.mergeParams('get', url, params),
|
|
30
31
|
timeout: timeout,
|
|
31
|
-
})
|
|
32
|
-
|
|
32
|
+
})];
|
|
33
|
+
case 2: return [2, _a.sent()];
|
|
34
|
+
case 3:
|
|
35
|
+
error_1 = _a.sent();
|
|
36
|
+
this.throwWithInterceptor(error_1);
|
|
37
|
+
return [3, 4];
|
|
38
|
+
case 4: return [2];
|
|
33
39
|
}
|
|
34
40
|
});
|
|
35
41
|
});
|
|
36
42
|
};
|
|
37
43
|
BasicHttpApi.prototype.post = function (url, body, timeout) {
|
|
38
44
|
return __awaiter(this, void 0, void 0, function () {
|
|
39
|
-
var headers;
|
|
45
|
+
var headers, error_2;
|
|
40
46
|
return __generator(this, function (_a) {
|
|
41
47
|
switch (_a.label) {
|
|
42
|
-
case 0:
|
|
48
|
+
case 0:
|
|
49
|
+
_a.trys.push([0, 3, , 4]);
|
|
50
|
+
return [4, this.headersCreator()];
|
|
43
51
|
case 1:
|
|
44
52
|
headers = _a.sent();
|
|
45
|
-
return [
|
|
46
|
-
.post({
|
|
53
|
+
return [4, this.provider.post({
|
|
47
54
|
url: "".concat(this.baseUrl).concat(this.mergeQueries('post', url, body)),
|
|
48
55
|
headers: headers,
|
|
49
56
|
withCredentials: this.withCredentials,
|
|
50
57
|
paramsSerializer: this.paramsSerializer,
|
|
51
58
|
params: body,
|
|
52
59
|
timeout: timeout,
|
|
53
|
-
})
|
|
54
|
-
|
|
60
|
+
})];
|
|
61
|
+
case 2: return [2, _a.sent()];
|
|
62
|
+
case 3:
|
|
63
|
+
error_2 = _a.sent();
|
|
64
|
+
this.throwWithInterceptor(error_2);
|
|
65
|
+
return [3, 4];
|
|
66
|
+
case 4: return [2];
|
|
55
67
|
}
|
|
56
68
|
});
|
|
57
69
|
});
|
|
58
70
|
};
|
|
59
71
|
BasicHttpApi.prototype.put = function (url, body, timeout) {
|
|
60
72
|
return __awaiter(this, void 0, void 0, function () {
|
|
61
|
-
var headers;
|
|
73
|
+
var headers, error_3;
|
|
62
74
|
return __generator(this, function (_a) {
|
|
63
75
|
switch (_a.label) {
|
|
64
|
-
case 0:
|
|
76
|
+
case 0:
|
|
77
|
+
_a.trys.push([0, 3, , 4]);
|
|
78
|
+
return [4, this.headersCreator()];
|
|
65
79
|
case 1:
|
|
66
80
|
headers = _a.sent();
|
|
67
|
-
return [
|
|
68
|
-
.put({
|
|
81
|
+
return [4, this.provider.put({
|
|
69
82
|
url: "".concat(this.baseUrl).concat(this.mergeQueries('put', url, body)),
|
|
70
83
|
headers: headers,
|
|
71
84
|
withCredentials: this.withCredentials,
|
|
72
85
|
paramsSerializer: this.paramsSerializer,
|
|
73
86
|
params: body,
|
|
74
87
|
timeout: timeout,
|
|
75
|
-
})
|
|
76
|
-
|
|
88
|
+
})];
|
|
89
|
+
case 2: return [2, _a.sent()];
|
|
90
|
+
case 3:
|
|
91
|
+
error_3 = _a.sent();
|
|
92
|
+
this.throwWithInterceptor(error_3);
|
|
93
|
+
return [3, 4];
|
|
94
|
+
case 4: return [2];
|
|
77
95
|
}
|
|
78
96
|
});
|
|
79
97
|
});
|
|
80
98
|
};
|
|
81
99
|
BasicHttpApi.prototype.patch = function (url, body, timeout) {
|
|
82
100
|
return __awaiter(this, void 0, void 0, function () {
|
|
83
|
-
var headers;
|
|
101
|
+
var headers, error_4;
|
|
84
102
|
return __generator(this, function (_a) {
|
|
85
103
|
switch (_a.label) {
|
|
86
|
-
case 0:
|
|
104
|
+
case 0:
|
|
105
|
+
_a.trys.push([0, 3, , 4]);
|
|
106
|
+
return [4, this.headersCreator()];
|
|
87
107
|
case 1:
|
|
88
108
|
headers = _a.sent();
|
|
89
|
-
return [
|
|
90
|
-
.patch({
|
|
109
|
+
return [4, this.provider.patch({
|
|
91
110
|
url: "".concat(this.baseUrl).concat(this.mergeQueries('patch', url, body)),
|
|
92
111
|
headers: headers,
|
|
93
112
|
withCredentials: this.withCredentials,
|
|
94
113
|
paramsSerializer: this.paramsSerializer,
|
|
95
114
|
params: body,
|
|
96
115
|
timeout: timeout,
|
|
97
|
-
})
|
|
98
|
-
|
|
116
|
+
})];
|
|
117
|
+
case 2: return [2, _a.sent()];
|
|
118
|
+
case 3:
|
|
119
|
+
error_4 = _a.sent();
|
|
120
|
+
this.throwWithInterceptor(error_4);
|
|
121
|
+
return [3, 4];
|
|
122
|
+
case 4: return [2];
|
|
99
123
|
}
|
|
100
124
|
});
|
|
101
125
|
});
|
|
102
126
|
};
|
|
103
127
|
BasicHttpApi.prototype.delete = function (url, body, timeout) {
|
|
104
128
|
return __awaiter(this, void 0, void 0, function () {
|
|
105
|
-
var headers;
|
|
129
|
+
var headers, error_5;
|
|
106
130
|
return __generator(this, function (_a) {
|
|
107
131
|
switch (_a.label) {
|
|
108
|
-
case 0:
|
|
132
|
+
case 0:
|
|
133
|
+
_a.trys.push([0, 3, , 4]);
|
|
134
|
+
return [4, this.headersCreator()];
|
|
109
135
|
case 1:
|
|
110
136
|
headers = _a.sent();
|
|
111
|
-
return [
|
|
112
|
-
.delete({
|
|
137
|
+
return [4, this.provider.delete({
|
|
113
138
|
url: "".concat(this.baseUrl).concat(this.mergeQueries('delete', url, body)),
|
|
114
139
|
headers: headers,
|
|
115
140
|
withCredentials: this.withCredentials,
|
|
116
141
|
paramsSerializer: this.paramsSerializer,
|
|
117
142
|
params: body,
|
|
118
143
|
timeout: timeout,
|
|
119
|
-
})
|
|
120
|
-
|
|
144
|
+
})];
|
|
145
|
+
case 2: return [2, _a.sent()];
|
|
146
|
+
case 3:
|
|
147
|
+
error_5 = _a.sent();
|
|
148
|
+
this.throwWithInterceptor(error_5);
|
|
149
|
+
return [3, 4];
|
|
150
|
+
case 4: return [2];
|
|
121
151
|
}
|
|
122
152
|
});
|
|
123
153
|
});
|
|
@@ -131,21 +161,27 @@ var BasicHttpApi = (function (_super) {
|
|
|
131
161
|
};
|
|
132
162
|
BasicHttpApi.prototype.getBlob = function (url, params) {
|
|
133
163
|
return __awaiter(this, void 0, void 0, function () {
|
|
134
|
-
var headers;
|
|
164
|
+
var headers, error_6;
|
|
135
165
|
return __generator(this, function (_a) {
|
|
136
166
|
switch (_a.label) {
|
|
137
|
-
case 0:
|
|
167
|
+
case 0:
|
|
168
|
+
_a.trys.push([0, 3, , 4]);
|
|
169
|
+
return [4, this.headersCreator()];
|
|
138
170
|
case 1:
|
|
139
171
|
headers = _a.sent();
|
|
140
|
-
return [
|
|
141
|
-
.getBlob({
|
|
172
|
+
return [4, this.provider.getBlob({
|
|
142
173
|
url: "".concat(this.baseUrl).concat(url),
|
|
143
174
|
headers: headers,
|
|
144
175
|
withCredentials: this.withCredentials,
|
|
145
176
|
paramsSerializer: this.paramsSerializer,
|
|
146
177
|
params: this.mergeParams('get', url, params),
|
|
147
|
-
})
|
|
148
|
-
|
|
178
|
+
})];
|
|
179
|
+
case 2: return [2, _a.sent()];
|
|
180
|
+
case 3:
|
|
181
|
+
error_6 = _a.sent();
|
|
182
|
+
this.throwWithInterceptor(error_6);
|
|
183
|
+
return [3, 4];
|
|
184
|
+
case 4: return [2];
|
|
149
185
|
}
|
|
150
186
|
});
|
|
151
187
|
});
|
|
@@ -13,44 +13,56 @@ var BasicHttpUploadApi = (function (_super) {
|
|
|
13
13
|
}
|
|
14
14
|
BasicHttpUploadApi.prototype.postUpload = function (url, data, progressCallback, timeout) {
|
|
15
15
|
return __awaiter(this, void 0, void 0, function () {
|
|
16
|
-
var headers;
|
|
16
|
+
var headers, error_1;
|
|
17
17
|
return __generator(this, function (_a) {
|
|
18
18
|
switch (_a.label) {
|
|
19
|
-
case 0:
|
|
19
|
+
case 0:
|
|
20
|
+
_a.trys.push([0, 3, , 4]);
|
|
21
|
+
return [4, this.headersCreator()];
|
|
20
22
|
case 1:
|
|
21
23
|
headers = _a.sent();
|
|
22
|
-
return [
|
|
23
|
-
.post({
|
|
24
|
+
return [4, this.provider.post({
|
|
24
25
|
url: "".concat(this.baseUrl).concat(this.mergeQueries('post', url, data)),
|
|
25
26
|
headers: headers,
|
|
26
27
|
withCredentials: this.withCredentials,
|
|
27
28
|
data: data,
|
|
28
29
|
timeout: timeout,
|
|
29
30
|
onProgress: progressCallback,
|
|
30
|
-
})
|
|
31
|
-
|
|
31
|
+
})];
|
|
32
|
+
case 2: return [2, _a.sent()];
|
|
33
|
+
case 3:
|
|
34
|
+
error_1 = _a.sent();
|
|
35
|
+
this.throwWithInterceptor(error_1);
|
|
36
|
+
return [3, 4];
|
|
37
|
+
case 4: return [2];
|
|
32
38
|
}
|
|
33
39
|
});
|
|
34
40
|
});
|
|
35
41
|
};
|
|
36
42
|
BasicHttpUploadApi.prototype.putUpload = function (url, data, progressCallback, timeout) {
|
|
37
43
|
return __awaiter(this, void 0, void 0, function () {
|
|
38
|
-
var headers;
|
|
44
|
+
var headers, error_2;
|
|
39
45
|
return __generator(this, function (_a) {
|
|
40
46
|
switch (_a.label) {
|
|
41
|
-
case 0:
|
|
47
|
+
case 0:
|
|
48
|
+
_a.trys.push([0, 3, , 4]);
|
|
49
|
+
return [4, this.headersCreator()];
|
|
42
50
|
case 1:
|
|
43
51
|
headers = _a.sent();
|
|
44
|
-
return [
|
|
45
|
-
.put({
|
|
52
|
+
return [4, this.provider.put({
|
|
46
53
|
url: "".concat(this.baseUrl).concat(this.mergeQueries('put', url, data)),
|
|
47
54
|
headers: headers,
|
|
48
55
|
withCredentials: this.withCredentials,
|
|
49
56
|
data: data,
|
|
50
57
|
timeout: timeout,
|
|
51
58
|
onProgress: progressCallback,
|
|
52
|
-
})
|
|
53
|
-
|
|
59
|
+
})];
|
|
60
|
+
case 2: return [2, _a.sent()];
|
|
61
|
+
case 3:
|
|
62
|
+
error_2 = _a.sent();
|
|
63
|
+
this.throwWithInterceptor(error_2);
|
|
64
|
+
return [3, 4];
|
|
65
|
+
case 4: return [2];
|
|
54
66
|
}
|
|
55
67
|
});
|
|
56
68
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __spreadArray } from "tslib";
|
|
1
|
+
import { __read, __spreadArray } from "tslib";
|
|
2
2
|
import { throwHttpRestError } from './network.util';
|
|
3
3
|
function isConstructor(val) {
|
|
4
4
|
return typeof val === 'function';
|
|
@@ -29,7 +29,7 @@ export function ErrorParser(throwableParser) {
|
|
|
29
29
|
args[_i] = arguments[_i];
|
|
30
30
|
}
|
|
31
31
|
return this.network.get
|
|
32
|
-
.apply(this.network, __spreadArray([], args,
|
|
32
|
+
.apply(this.network, __spreadArray([], __read(args), false))
|
|
33
33
|
.catch(this.parse);
|
|
34
34
|
};
|
|
35
35
|
ErrorParserDecoratedUnionHttpNetworkProvider.prototype.post = function () {
|
|
@@ -38,7 +38,7 @@ export function ErrorParser(throwableParser) {
|
|
|
38
38
|
args[_i] = arguments[_i];
|
|
39
39
|
}
|
|
40
40
|
return this.network.post
|
|
41
|
-
.apply(this.network, __spreadArray([], args,
|
|
41
|
+
.apply(this.network, __spreadArray([], __read(args), false))
|
|
42
42
|
.catch(this.parse);
|
|
43
43
|
};
|
|
44
44
|
ErrorParserDecoratedUnionHttpNetworkProvider.prototype.put = function () {
|
|
@@ -47,7 +47,7 @@ export function ErrorParser(throwableParser) {
|
|
|
47
47
|
args[_i] = arguments[_i];
|
|
48
48
|
}
|
|
49
49
|
return this.network.put
|
|
50
|
-
.apply(this.network, __spreadArray([], args,
|
|
50
|
+
.apply(this.network, __spreadArray([], __read(args), false))
|
|
51
51
|
.catch(this.parse);
|
|
52
52
|
};
|
|
53
53
|
ErrorParserDecoratedUnionHttpNetworkProvider.prototype.patch = function () {
|
|
@@ -56,7 +56,7 @@ export function ErrorParser(throwableParser) {
|
|
|
56
56
|
args[_i] = arguments[_i];
|
|
57
57
|
}
|
|
58
58
|
return this.network.patch
|
|
59
|
-
.apply(this.network, __spreadArray([], args,
|
|
59
|
+
.apply(this.network, __spreadArray([], __read(args), false))
|
|
60
60
|
.catch(this.parse);
|
|
61
61
|
};
|
|
62
62
|
ErrorParserDecoratedUnionHttpNetworkProvider.prototype.delete = function () {
|
|
@@ -65,7 +65,7 @@ export function ErrorParser(throwableParser) {
|
|
|
65
65
|
args[_i] = arguments[_i];
|
|
66
66
|
}
|
|
67
67
|
return this.network.delete
|
|
68
|
-
.apply(this.network, __spreadArray([], args,
|
|
68
|
+
.apply(this.network, __spreadArray([], __read(args), false))
|
|
69
69
|
.catch(this.parse);
|
|
70
70
|
};
|
|
71
71
|
ErrorParserDecoratedUnionHttpNetworkProvider.prototype.getBlob = function () {
|
|
@@ -74,7 +74,7 @@ export function ErrorParser(throwableParser) {
|
|
|
74
74
|
args[_i] = arguments[_i];
|
|
75
75
|
}
|
|
76
76
|
return this.network.getBlob
|
|
77
|
-
.apply(this.network, __spreadArray([], args,
|
|
77
|
+
.apply(this.network, __spreadArray([], __read(args), false))
|
|
78
78
|
.catch(this.parse);
|
|
79
79
|
};
|
|
80
80
|
return ErrorParserDecoratedUnionHttpNetworkProvider;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { __read } from "tslib";
|
|
1
2
|
import { HttpRestError } from '../types';
|
|
2
3
|
import { isNumber, isObject, isString, isUndefined } from '../util/typeCheck';
|
|
3
4
|
function isOptionalBoolean(value) {
|
|
@@ -52,7 +53,7 @@ export function throwHttpRestError(error) {
|
|
|
52
53
|
}
|
|
53
54
|
export function convertToFormData(data) {
|
|
54
55
|
return Object.entries(data).reduce(function (formData, _a) {
|
|
55
|
-
var key =
|
|
56
|
+
var _b = __read(_a, 2), key = _b[0], value = _b[1];
|
|
56
57
|
if (Array.isArray(value)) {
|
|
57
58
|
return value.reduce(function (innerFormData, file) {
|
|
58
59
|
innerFormData.append(key, file, file.name);
|
package/esm5/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { DeviceDetectProvider, withAdaptiveRender } from './adaptive-render';
|
|
2
2
|
import { createHttpApi, createHttpUploadApi, createHttpHeaderPipe, httpHeaderOperator, } from './http-api';
|
|
3
3
|
import { cache } from './proxies';
|
|
4
|
-
import {
|
|
4
|
+
import { useRouteSystem } from './route-system';
|
|
5
5
|
import validate, { mergeValidates, } from './validate';
|
|
6
6
|
export * from './hooks';
|
|
7
7
|
export * from './queries';
|
|
8
8
|
export * from './storage';
|
|
9
9
|
export * from './types';
|
|
10
10
|
export * from './util';
|
|
11
|
-
export { DeviceDetectProvider, withAdaptiveRender, createHttpApi, createHttpUploadApi, createHttpHeaderPipe, httpHeaderOperator, cache,
|
|
11
|
+
export { DeviceDetectProvider, withAdaptiveRender, createHttpApi, createHttpUploadApi, createHttpHeaderPipe, httpHeaderOperator, cache, useRouteSystem, validate, mergeValidates, };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __spreadArray } from "tslib";
|
|
1
|
+
import { __read, __spreadArray } from "tslib";
|
|
2
2
|
import { createStorage } from '../storage';
|
|
3
3
|
import { isServer } from '../util/envCheck';
|
|
4
4
|
var FORCE_NOT_CACHE = false;
|
|
@@ -34,7 +34,7 @@ export function cache(type, expiredTime) {
|
|
|
34
34
|
for (var _i = 0; _i < arguments.length; _i++) {
|
|
35
35
|
args[_i] = arguments[_i];
|
|
36
36
|
}
|
|
37
|
-
return baseApi.get.apply(baseApi, __spreadArray([], args,
|
|
37
|
+
return baseApi.get.apply(baseApi, __spreadArray([], __read(args), false));
|
|
38
38
|
});
|
|
39
39
|
};
|
|
40
40
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __awaiter, __generator } from "tslib";
|
|
1
|
+
import { __awaiter, __generator, __read } from "tslib";
|
|
2
2
|
import { useCallback, useRef, useState } from 'react';
|
|
3
3
|
function defineConverter(args) {
|
|
4
4
|
return args;
|
|
@@ -16,9 +16,9 @@ export function buildMutationCreator(store) {
|
|
|
16
16
|
}
|
|
17
17
|
var resultHooks = function () {
|
|
18
18
|
var refFetching = useRef(false);
|
|
19
|
-
var _a = useState(null), data = _a[0], setData = _a[1];
|
|
20
|
-
var _b = useState(undefined), error = _b[0], setError = _b[1];
|
|
21
|
-
var _c = useState(false), loading = _c[0], setLoading = _c[1];
|
|
19
|
+
var _a = __read(useState(null), 2), data = _a[0], setData = _a[1];
|
|
20
|
+
var _b = __read(useState(undefined), 2), error = _b[0], setError = _b[1];
|
|
21
|
+
var _c = __read(useState(false), 2), loading = _c[0], setLoading = _c[1];
|
|
22
22
|
var mutate = useCallback(function (params, throwable) {
|
|
23
23
|
if (throwable === void 0) { throwable = false; }
|
|
24
24
|
return __awaiter(_this, void 0, void 0, function () {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __awaiter, __generator, __spreadArray } from "tslib";
|
|
1
|
+
import { __awaiter, __generator, __read, __spreadArray } from "tslib";
|
|
2
2
|
import { useCallback, useLayoutEffect, useRef, useState } from 'react';
|
|
3
3
|
import { createStorage } from '../storage';
|
|
4
4
|
import { useMakeDeps } from './useMakeDeps';
|
|
@@ -19,9 +19,9 @@ export function buildQueryCreator(store) {
|
|
|
19
19
|
}
|
|
20
20
|
var resultHooks = function (requestParams) {
|
|
21
21
|
var refFetching = useRef(false);
|
|
22
|
-
var _a = useState(defaultData), data = _a[0], setData = _a[1];
|
|
23
|
-
var _b = useState(undefined), error = _b[0], setError = _b[1];
|
|
24
|
-
var _c = useState(defaultLoading), loading = _c[0], setLoading = _c[1];
|
|
22
|
+
var _a = __read(useState(defaultData), 2), data = _a[0], setData = _a[1];
|
|
23
|
+
var _b = __read(useState(undefined), 2), error = _b[0], setError = _b[1];
|
|
24
|
+
var _c = __read(useState(defaultLoading), 2), loading = _c[0], setLoading = _c[1];
|
|
25
25
|
var deps = useMakeDeps(requestParams, subKeysFromParams);
|
|
26
26
|
var loader = useCallback(function (params) { return __awaiter(_this, void 0, void 0, function () {
|
|
27
27
|
var sto, cachedValue, prm;
|
|
@@ -110,7 +110,7 @@ export function buildQueryCreator(store) {
|
|
|
110
110
|
return;
|
|
111
111
|
}
|
|
112
112
|
loader(requestParams);
|
|
113
|
-
}, __spreadArray(__spreadArray([], deps,
|
|
113
|
+
}, __spreadArray(__spreadArray([], __read(deps), false), [lazy], false));
|
|
114
114
|
return {
|
|
115
115
|
data: data,
|
|
116
116
|
error: error,
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './routeSystem.util';
|
|
1
|
+
export * from './useRouteSystem';
|
|
2
|
+
export * from './useRouteSystem.model';
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useParams } from 'react-router-dom';
|
|
3
|
+
import { useRouteSystem } from './useRouteSystem';
|
|
4
|
+
var createTestWrapper = function (text) {
|
|
5
|
+
return function Wrap(_a) {
|
|
6
|
+
var children = _a.children;
|
|
7
|
+
return (React.createElement("section", null,
|
|
8
|
+
React.createElement("h1", null, text),
|
|
9
|
+
children));
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
var createTestComp = function (text) {
|
|
13
|
+
return function Test() {
|
|
14
|
+
return React.createElement("div", null, text);
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
var createTestPathComp = function () {
|
|
18
|
+
return function Test() {
|
|
19
|
+
var params = useParams();
|
|
20
|
+
return React.createElement("div", null, params.id);
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
export var routes = [
|
|
24
|
+
{
|
|
25
|
+
path: '/',
|
|
26
|
+
wrap: createTestWrapper('indexWrapper'),
|
|
27
|
+
element: createTestComp('index'),
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
path: '/main',
|
|
31
|
+
wrap: createTestWrapper('mainWrapper'),
|
|
32
|
+
element: createTestComp('main'),
|
|
33
|
+
children: [
|
|
34
|
+
{
|
|
35
|
+
path: 'order',
|
|
36
|
+
element: createTestComp('mainOrder'),
|
|
37
|
+
children: [
|
|
38
|
+
{
|
|
39
|
+
path: 'news',
|
|
40
|
+
element: createTestComp('mainOrderNews'),
|
|
41
|
+
children: [
|
|
42
|
+
{
|
|
43
|
+
path: ':id',
|
|
44
|
+
element: createTestPathComp(),
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
{ path: ':id', element: createTestPathComp() },
|
|
49
|
+
],
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
path: '*',
|
|
53
|
+
element: createTestComp('mainFallback'),
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
path: '/hello',
|
|
59
|
+
children: [
|
|
60
|
+
{
|
|
61
|
+
path: '',
|
|
62
|
+
element: createTestComp('hello world'),
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
path: '*',
|
|
68
|
+
element: createTestComp('fallback'),
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
export default function App() {
|
|
72
|
+
return useRouteSystem(routes);
|
|
73
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { __read, __spreadArray } from "tslib";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Outlet, useRoutes } from 'react-router-dom';
|
|
4
|
+
function toJSXElement(Wrapper, Element) {
|
|
5
|
+
if (!Wrapper && !Element) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
if (Wrapper) {
|
|
9
|
+
return (React.createElement(Wrapper, null,
|
|
10
|
+
React.createElement(Outlet, null)));
|
|
11
|
+
}
|
|
12
|
+
if (Element) {
|
|
13
|
+
return React.createElement(Element, null);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function recursionChildren(_a) {
|
|
17
|
+
var path = _a.path, element = _a.element, _b = _a.children, children = _b === void 0 ? [] : _b;
|
|
18
|
+
if (element && children.length > 0) {
|
|
19
|
+
return {
|
|
20
|
+
path: path,
|
|
21
|
+
children: __spreadArray([
|
|
22
|
+
{ index: true, element: toJSXElement(undefined, element) }
|
|
23
|
+
], __read(children.map(recursionChildren)), false),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
path: path,
|
|
28
|
+
element: toJSXElement(undefined, element),
|
|
29
|
+
children: children.map(recursionChildren),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export var useRouteSystem = function (moduleRoutes) {
|
|
33
|
+
var routeObject = moduleRoutes.map(function (_a) {
|
|
34
|
+
var path = _a.path, wrap = _a.wrap, element = _a.element, _b = _a.children, children = _b === void 0 ? [] : _b;
|
|
35
|
+
if (wrap && element) {
|
|
36
|
+
return {
|
|
37
|
+
path: path,
|
|
38
|
+
element: toJSXElement(wrap),
|
|
39
|
+
children: __spreadArray([
|
|
40
|
+
{ index: true, element: toJSXElement(undefined, element) }
|
|
41
|
+
], __read(children.map(recursionChildren)), false),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
path: path,
|
|
46
|
+
element: toJSXElement(wrap, element),
|
|
47
|
+
children: children === null || children === void 0 ? void 0 : children.map(recursionChildren),
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
return useRoutes(routeObject);
|
|
51
|
+
};
|
|
File without changes
|
package/esm5/util/collection.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { __spreadArray } from "tslib";
|
|
1
|
+
import { __read, __spreadArray } from "tslib";
|
|
2
2
|
export function reorder(list, startIndex, endIndex) {
|
|
3
|
-
var result = __spreadArray([], list,
|
|
4
|
-
var
|
|
3
|
+
var result = __spreadArray([], __read(list), false);
|
|
4
|
+
var _a = __read(result.splice(startIndex, 1), 1), removed = _a[0];
|
|
5
5
|
result.splice(endIndex, 0, removed);
|
|
6
6
|
return result;
|
|
7
7
|
}
|
|
8
8
|
export function update(list, index, item) {
|
|
9
|
-
var copied = __spreadArray([], list,
|
|
9
|
+
var copied = __spreadArray([], __read(list), false);
|
|
10
10
|
copied[index] = item;
|
|
11
11
|
return copied;
|
|
12
12
|
}
|
|
13
13
|
export function remove(list, index) {
|
|
14
|
-
var copied = __spreadArray([], list,
|
|
14
|
+
var copied = __spreadArray([], __read(list), false);
|
|
15
15
|
copied.splice(index, 1);
|
|
16
16
|
return copied;
|
|
17
17
|
}
|
package/esm5/util/queryString.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { __read } from "tslib";
|
|
1
2
|
import { isNullable, isObject } from './typeCheck';
|
|
2
3
|
function _serialize(params, parentKey) {
|
|
3
4
|
if (parentKey === void 0) { parentKey = ''; }
|
|
4
5
|
return Object.entries(params).reduce(function (acc, _a) {
|
|
5
|
-
var oriKey =
|
|
6
|
+
var _b = __read(_a, 2), oriKey = _b[0], value = _b[1];
|
|
6
7
|
var key = parentKey ? "".concat(parentKey, "%5B").concat(oriKey, "%5D") : oriKey;
|
|
7
8
|
var ret = acc + (acc.length > 1 ? '&' : '');
|
|
8
9
|
if (isObject(value)) {
|
|
@@ -34,7 +35,7 @@ export var qs = {
|
|
|
34
35
|
var key = '';
|
|
35
36
|
var value = '';
|
|
36
37
|
for (var i = 0; i < len; i++) {
|
|
37
|
-
_a = splittedQueries[i].split('='), key = _a[0], value = _a[1];
|
|
38
|
+
_a = __read(splittedQueries[i].split('='), 2), key = _a[0], value = _a[1];
|
|
38
39
|
result[key] = decodeURIComponent(value);
|
|
39
40
|
}
|
|
40
41
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
interface
|
|
1
|
+
import { ReactElement, ReactNode } from 'react';
|
|
2
|
+
interface AdaptiveRenderProps {
|
|
3
3
|
/**
|
|
4
4
|
* 데스크탑에서만 보여질 컴포넌트
|
|
5
5
|
*/
|
|
@@ -12,6 +12,7 @@ interface Props {
|
|
|
12
12
|
* 태블릿일 때는 보이지 않음 여부. 기본 false
|
|
13
13
|
*/
|
|
14
14
|
notTablet?: boolean;
|
|
15
|
+
children?: ReactNode;
|
|
15
16
|
}
|
|
16
17
|
/**
|
|
17
18
|
* 적응형으로 렌더링 할 때 쓰인다.
|
|
@@ -21,5 +22,5 @@ interface Props {
|
|
|
21
22
|
* 모바일일 경우에만 보이게 할 때는 mobile 프로퍼티를 적용 시키면 된다.
|
|
22
23
|
* @param props
|
|
23
24
|
*/
|
|
24
|
-
export declare const AdaptiveRender:
|
|
25
|
+
export declare const AdaptiveRender: ({ mobile, notTablet, children, }: AdaptiveRenderProps) => JSX.Element;
|
|
25
26
|
export {};
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import React
|
|
1
|
+
import React from 'react';
|
|
2
2
|
export declare const DeviceDetectContext: React.Context<boolean[]>;
|
|
3
|
+
interface DeviceDetectProviderProps {
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
}
|
|
3
6
|
/**
|
|
4
7
|
* 컨텍스트: UserAgent 및 Resizing 여부에 따른 태블릿/모바일 여부를 판별 해 준다.
|
|
5
8
|
*
|
|
@@ -10,7 +13,8 @@ export declare const DeviceDetectContext: React.Context<boolean[]>;
|
|
|
10
13
|
* @see https://stackoverflow.com/questions/29046324/whats-the-most-reliable-way-to-integrate-javascript-with-media-queries
|
|
11
14
|
* @see https://jsperf.com/matchmedia-vs-resize/3
|
|
12
15
|
*/
|
|
13
|
-
export declare const DeviceDetectProvider:
|
|
16
|
+
export declare const DeviceDetectProvider: ({ children, }: DeviceDetectProviderProps) => JSX.Element;
|
|
14
17
|
export declare const useIsMobile: () => boolean;
|
|
15
18
|
export declare const useIsTablet: () => boolean;
|
|
16
19
|
export declare const useIsNative: () => boolean;
|
|
20
|
+
export {};
|
package/libs/hooks/index.d.ts
CHANGED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { NavigateOptions, To } from 'react-router-dom';
|
|
2
|
+
export declare type SearchParams = Record<string, any>;
|
|
3
|
+
export declare type SearchParamsOptions = NavigateOptions & {
|
|
4
|
+
merge?: boolean;
|
|
5
|
+
};
|
|
6
|
+
interface NavigationCommander {
|
|
7
|
+
(to: To, option?: NavigateOptions): void;
|
|
8
|
+
(delta: number): void;
|
|
9
|
+
(searchParams: SearchParams, option?: SearchParamsOptions): void;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* react-router-dom v6의 useNavigate 기반으로 기능을 확장한 hooks.
|
|
13
|
+
*
|
|
14
|
+
* navigate 동작 방식을 똑같이 사용할 수 있으며, 필요에 따라 query 조작이 가능하다.
|
|
15
|
+
*
|
|
16
|
+
* 일반 navigate 함수 활용
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const navigate = useNavigate();
|
|
20
|
+
*
|
|
21
|
+
* navigate(-1);
|
|
22
|
+
* navigate("/page", option);
|
|
23
|
+
* navigate({ pathname: "/page", search : "size=10" }, option);
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* 현재 페이지의 query에 원하는 query를 덮어씌워 이동
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* const navigate = useNavigate();
|
|
31
|
+
*
|
|
32
|
+
* navigate({ page: 10, size: 20 });
|
|
33
|
+
*
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* 현재 페이지의 query는 제거하고, 원하는 query로만 이동
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* const navigate = useNavigate();
|
|
40
|
+
*
|
|
41
|
+
* navigate({ page: 10, size: 20 }, { merge: false });
|
|
42
|
+
*
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare function useNavigate(): NavigationCommander;
|
|
46
|
+
export {};
|
package/libs/index.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { DeviceDetectProvider, withAdaptiveRender } from './adaptive-render';
|
|
2
2
|
import { createHttpApi, createHttpUploadApi, createHttpHeaderPipe, httpHeaderOperator, HttpApi, HttpUploadApi, HttpInterceptorHandler, HttpInterceptorConfig, UploadStateArgs, XhrUploadStateArgs } from './http-api';
|
|
3
3
|
import { cache } from './proxies';
|
|
4
|
-
import {
|
|
4
|
+
import { ModuleRouteModel, useRouteSystem } from './route-system';
|
|
5
5
|
import validate, { mergeValidates, ValidateBulkOptionType, ValidateBulkResultModel, ValidateCheckModel, ValidateResultModel } from './validate';
|
|
6
6
|
export * from './hooks';
|
|
7
7
|
export * from './queries';
|
|
8
8
|
export * from './storage';
|
|
9
9
|
export * from './types';
|
|
10
10
|
export * from './util';
|
|
11
|
-
export { ModuleRouteModel, DeviceDetectProvider, withAdaptiveRender, createHttpApi, createHttpUploadApi, createHttpHeaderPipe, httpHeaderOperator, HttpApi, HttpUploadApi, HttpInterceptorHandler, HttpInterceptorConfig, UploadStateArgs, XhrUploadStateArgs, cache,
|
|
11
|
+
export { ModuleRouteModel, DeviceDetectProvider, withAdaptiveRender, createHttpApi, createHttpUploadApi, createHttpHeaderPipe, httpHeaderOperator, HttpApi, HttpUploadApi, HttpInterceptorHandler, HttpInterceptorConfig, UploadStateArgs, XhrUploadStateArgs, cache, useRouteSystem, validate, mergeValidates, ValidateResultModel, ValidateBulkResultModel, ValidateCheckModel, ValidateBulkOptionType, };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EnhancedStore } from '@reduxjs/toolkit';
|
|
1
|
+
import { AnyAction, EnhancedStore, MiddlewareArray } from '@reduxjs/toolkit';
|
|
2
2
|
interface MutationHooksCreatorSettingOptionDto<SR, SP, R, P, ReduxRootState> {
|
|
3
3
|
/**
|
|
4
4
|
* Mutation hooks의 고유키이다. auto dispatch 사용 시 반드시 필요하다.
|
|
@@ -33,5 +33,5 @@ interface MutationResultType<R = void, P = void, E extends Error = Error> {
|
|
|
33
33
|
interface MutationHooks<R = void, P = void, E extends Error = Error> {
|
|
34
34
|
(params?: R): MutationResultType<R, P, E>;
|
|
35
35
|
}
|
|
36
|
-
export declare function buildMutationCreator<S>(store: EnhancedStore<S
|
|
36
|
+
export declare function buildMutationCreator<S>(store: EnhancedStore<S, AnyAction, MiddlewareArray<any[]>>): <SR, SP, R, P, E extends Error>({ key, mutator, parameterConverter, resultConverter, }: MutationHooksCreatorSettingOptionDto<SR, SP, R, P, S>) => MutationHooks<R, P, E>;
|
|
37
37
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EnhancedStore } from '@reduxjs/toolkit';
|
|
1
|
+
import { AnyAction, EnhancedStore, MiddlewareArray } from '@reduxjs/toolkit';
|
|
2
2
|
import { StorageType } from '../storage';
|
|
3
3
|
/**
|
|
4
4
|
* query hooks가 리턴하는 객체
|
|
@@ -111,5 +111,5 @@ interface CreateRepositoryQuery<S> {
|
|
|
111
111
|
<SR, SP, R, P, E extends Error = Error>(config: QueryHooksCreatorSettingOptionDto<SR, SP, R, P, S>): QueryHooks<R, P, E>;
|
|
112
112
|
<R, P, E extends Error = Error>(config: QueryHooksCreatorSettingOptionDto<R, P, R, P, S>): QueryHooks<R, P, E>;
|
|
113
113
|
}
|
|
114
|
-
export declare function buildQueryCreator<S>(store: EnhancedStore<S
|
|
114
|
+
export declare function buildQueryCreator<S>(store: EnhancedStore<S, AnyAction, MiddlewareArray<any[]>>): CreateRepositoryQuery<S>;
|
|
115
115
|
export {};
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './routeSystem.util';
|
|
1
|
+
export * from './useRouteSystem';
|
|
2
|
+
export * from './useRouteSystem.model';
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ModuleRouteModel } from './useRouteSystem.model';
|
|
3
|
+
/**
|
|
4
|
+
* react-router-dom V6의 route system을 적용하는 hooks
|
|
5
|
+
*
|
|
6
|
+
* 내부적으로 useRoutes()를 사용한다.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```tsx
|
|
10
|
+
* const routes = [
|
|
11
|
+
* {
|
|
12
|
+
* path: "/",
|
|
13
|
+
* wrap: Wrapper,
|
|
14
|
+
* element: Element,
|
|
15
|
+
* children: [{
|
|
16
|
+
* path: "main", // '/main'
|
|
17
|
+
* element: Element,
|
|
18
|
+
* children: [{
|
|
19
|
+
* path: ":id", // '/main/:id'
|
|
20
|
+
* element: Element
|
|
21
|
+
* }]
|
|
22
|
+
* }]
|
|
23
|
+
* }
|
|
24
|
+
* ]
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* renderRouteSystem을 사용하기 위해선 `BrowserRouter`로 감싸주어야 한다.
|
|
28
|
+
* ```ts
|
|
29
|
+
* <BrowserRouter>{renderRouteSystem(routes)}</BrowserRouter>
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* @param moduleRoutes
|
|
33
|
+
* @returns
|
|
34
|
+
*/
|
|
35
|
+
export declare const useRouteSystem: (moduleRoutes: ModuleRouteModel[]) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { ComponentType } from 'react';
|
|
2
|
+
export interface ModuleRouteChildModel {
|
|
3
|
+
/**
|
|
4
|
+
* routing 하기 위한 경로 설정
|
|
5
|
+
*/
|
|
6
|
+
path?: string;
|
|
7
|
+
/**
|
|
8
|
+
* 설정된 경로에 렌더링 할 React Component
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* () => JSX.Element
|
|
12
|
+
*/
|
|
13
|
+
element?: ComponentType<any>;
|
|
14
|
+
/**
|
|
15
|
+
* 설정된 경로의 하위 경로 설정
|
|
16
|
+
*
|
|
17
|
+
* `children`에서의 경로(`path`) 설정은 **상대적**이다.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* {
|
|
21
|
+
* path: "/main",
|
|
22
|
+
* elemet: MainElement,
|
|
23
|
+
* children: [
|
|
24
|
+
* { path: "order", element: Element } // `/main/order`
|
|
25
|
+
* ]
|
|
26
|
+
* }
|
|
27
|
+
*/
|
|
28
|
+
children?: ModuleRouteChildModel[];
|
|
29
|
+
}
|
|
30
|
+
export interface ModuleRouteModel extends ModuleRouteChildModel {
|
|
31
|
+
/**
|
|
32
|
+
* 설정된 경로에 본인 포함, 모든 하위 경로에 Wrapper 설정
|
|
33
|
+
*
|
|
34
|
+
* **`children`을 `props`로 받아야만 한다.**
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
*
|
|
38
|
+
* ({children}) => <div>{children}</div>
|
|
39
|
+
*/
|
|
40
|
+
wrap?: ComponentType<any>;
|
|
41
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jordy",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.2",
|
|
4
4
|
"description": "typescript based frontend toolkit",
|
|
5
5
|
"main": "./esm5/index.js",
|
|
6
6
|
"module": "./esm5/index.js",
|
|
@@ -25,10 +25,13 @@
|
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@babel/preset-env": "^7.15.8",
|
|
27
27
|
"@babel/preset-typescript": "^7.15.0",
|
|
28
|
-
"@reduxjs/toolkit": "^1.
|
|
28
|
+
"@reduxjs/toolkit": "^1.8.5",
|
|
29
|
+
"@testing-library/jest-dom": "^5.16.5",
|
|
30
|
+
"@testing-library/react": "^13.3.0",
|
|
29
31
|
"@types/lodash-es": "^4.17.6",
|
|
30
|
-
"@types/react": "^
|
|
31
|
-
"@types/react-
|
|
32
|
+
"@types/react": "^18.0.17",
|
|
33
|
+
"@types/react-dom": "^18.0.6",
|
|
34
|
+
"@types/react-router-dom": "^5.3.3",
|
|
32
35
|
"@typescript-eslint/eslint-plugin": "^4.32.0",
|
|
33
36
|
"@typescript-eslint/parser": "^4.32.0",
|
|
34
37
|
"@vitejs/plugin-legacy": "^2.0.0",
|
|
@@ -40,10 +43,10 @@
|
|
|
40
43
|
"lodash-es": "^4.17.21",
|
|
41
44
|
"npm-run-all": "^4.1.5",
|
|
42
45
|
"prettier": "^2.4.1",
|
|
43
|
-
"react": "^
|
|
44
|
-
"react-dom": "^
|
|
45
|
-
"react-router-dom": "^
|
|
46
|
-
"redux": "^4.
|
|
46
|
+
"react": "^18.2.0",
|
|
47
|
+
"react-dom": "^18.2.0",
|
|
48
|
+
"react-router-dom": "^6.3.0",
|
|
49
|
+
"redux": "^4.2.0",
|
|
47
50
|
"rimraf": "^3.0.2",
|
|
48
51
|
"ts-node": "^10.3.0",
|
|
49
52
|
"tslib": "^2.3.1",
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import React, { useEffect, useState } from 'react';
|
|
2
|
-
import { useHistory } from 'react-router';
|
|
3
|
-
import { noop } from '../util';
|
|
4
|
-
export var AsyncGuard = function (_a) {
|
|
5
|
-
var _b = _a.redirect, redirect = _b === void 0 ? '/' : _b, FailComp = _a.failComponent, guard = _a.guard, children = _a.children;
|
|
6
|
-
var history = useHistory();
|
|
7
|
-
var _c = useState(guard ? null : true), end = _c[0], setEnd = _c[1];
|
|
8
|
-
useEffect(function () {
|
|
9
|
-
if (end || !guard) {
|
|
10
|
-
return noop;
|
|
11
|
-
}
|
|
12
|
-
var handleAsync = function (res) {
|
|
13
|
-
if (res) {
|
|
14
|
-
setEnd(true);
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
if (FailComp) {
|
|
18
|
-
setEnd(false);
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
history.replace(redirect);
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
Promise.resolve(0)
|
|
25
|
-
.then(guard)
|
|
26
|
-
.then(handleAsync)
|
|
27
|
-
.catch(function () { return handleAsync(false); });
|
|
28
|
-
return noop;
|
|
29
|
-
}, [end, FailComp, history, redirect, guard]);
|
|
30
|
-
if (end === false && FailComp) {
|
|
31
|
-
return React.createElement(FailComp, null);
|
|
32
|
-
}
|
|
33
|
-
if (!end) {
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
return React.createElement(React.Fragment, null, children);
|
|
37
|
-
};
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { __spreadArray } from "tslib";
|
|
2
|
-
import React, { Suspense } from 'react';
|
|
3
|
-
import { Redirect, Route, Switch } from 'react-router-dom';
|
|
4
|
-
import { AsyncGuard } from './AsyncGuard';
|
|
5
|
-
function toPromiseList(guardList) {
|
|
6
|
-
return guardList.map(function (fn) {
|
|
7
|
-
var ret = fn();
|
|
8
|
-
if (ret instanceof Promise) {
|
|
9
|
-
return ret;
|
|
10
|
-
}
|
|
11
|
-
return Promise.resolve(ret);
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
function renderSubRoute(route, notFound, guardList) {
|
|
15
|
-
if (guardList === void 0) { guardList = []; }
|
|
16
|
-
var Comp = route.component;
|
|
17
|
-
var Wrap = route.wrap || React.Fragment;
|
|
18
|
-
if (route.guard) {
|
|
19
|
-
guardList.push(route.guard);
|
|
20
|
-
if (route.child) {
|
|
21
|
-
return (React.createElement(Wrap, null, renderRouteSystem(route.child, true, notFound, __spreadArray([], guardList, true))));
|
|
22
|
-
}
|
|
23
|
-
var guardResults = function () {
|
|
24
|
-
return Promise.all(toPromiseList(guardList)).then(function (items) {
|
|
25
|
-
return items.every(Boolean);
|
|
26
|
-
});
|
|
27
|
-
};
|
|
28
|
-
return (React.createElement(Wrap, null,
|
|
29
|
-
React.createElement(Suspense, { fallback: React.createElement(React.Fragment, null) },
|
|
30
|
-
React.createElement(AsyncGuard, { guard: guardResults, redirect: route.redirect, failComponent: route.failComponent }, Comp && React.createElement(Comp, null)))));
|
|
31
|
-
}
|
|
32
|
-
if (route.redirect) {
|
|
33
|
-
return React.createElement(Redirect, { to: route.redirect });
|
|
34
|
-
}
|
|
35
|
-
if (route.child) {
|
|
36
|
-
return (React.createElement(Wrap, null, renderRouteSystem(route.child, true, notFound, __spreadArray([], guardList, true))));
|
|
37
|
-
}
|
|
38
|
-
if (guardList.length > 0) {
|
|
39
|
-
var guardResults = function () {
|
|
40
|
-
return Promise.all(toPromiseList(guardList)).then(function (items) {
|
|
41
|
-
return items.every(Boolean);
|
|
42
|
-
});
|
|
43
|
-
};
|
|
44
|
-
return (React.createElement(Wrap, null,
|
|
45
|
-
React.createElement(Suspense, { fallback: React.createElement(React.Fragment, null) },
|
|
46
|
-
React.createElement(AsyncGuard, { guard: guardResults, redirect: route.redirect, failComponent: route.failComponent }, Comp && React.createElement(Comp, null)))));
|
|
47
|
-
}
|
|
48
|
-
return (React.createElement(Wrap, null,
|
|
49
|
-
React.createElement(Suspense, { fallback: React.createElement(React.Fragment, null) }, Comp && React.createElement(Comp, null))));
|
|
50
|
-
}
|
|
51
|
-
export var renderRouteSystem = function (routes, withSwitch, notFound, guardList) {
|
|
52
|
-
if (guardList === void 0) { guardList = []; }
|
|
53
|
-
var NotFound = notFound;
|
|
54
|
-
if (withSwitch) {
|
|
55
|
-
return (React.createElement(Switch, null,
|
|
56
|
-
routes.map(function (route) { return (React.createElement(Route, { key: route.path, path: route.path, exact: route.exact }, renderSubRoute(route, notFound, __spreadArray([], guardList, true)))); }),
|
|
57
|
-
NotFound && React.createElement(NotFound, null)));
|
|
58
|
-
}
|
|
59
|
-
var renders = routes.map(function (route) { return (React.createElement(Route, { key: route.path, path: route.path, exact: route.exact }, renderSubRoute(route, notFound, __spreadArray([], guardList, true)))); });
|
|
60
|
-
if (NotFound) {
|
|
61
|
-
renders.push(React.createElement(NotFound, { key: "%%not-found%%" }));
|
|
62
|
-
}
|
|
63
|
-
return renders;
|
|
64
|
-
};
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { __awaiter, __generator } from "tslib";
|
|
2
|
-
export function createGuardDispatch(store) {
|
|
3
|
-
return function guardDispatch(effectResult) {
|
|
4
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
5
|
-
var dispatch, action;
|
|
6
|
-
return __generator(this, function (_a) {
|
|
7
|
-
switch (_a.label) {
|
|
8
|
-
case 0:
|
|
9
|
-
dispatch = store.dispatch;
|
|
10
|
-
return [4, dispatch(effectResult)];
|
|
11
|
-
case 1:
|
|
12
|
-
action = _a.sent();
|
|
13
|
-
return [2, action.meta.requestStatus === 'fulfilled'];
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
|
-
});
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
export function createGuardSelector(store) {
|
|
20
|
-
return function guardSelector(selector) {
|
|
21
|
-
return selector(store.getState());
|
|
22
|
-
};
|
|
23
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { ComponentType } from 'react';
|
|
2
|
-
/**
|
|
3
|
-
* 모듈에서 쓰이는 각종 페이지 컴포넌트의 라우팅 정보를 담은 객체
|
|
4
|
-
*/
|
|
5
|
-
export interface ModuleRouteModel {
|
|
6
|
-
/**
|
|
7
|
-
* 수행 경로
|
|
8
|
-
*/
|
|
9
|
-
path: string;
|
|
10
|
-
/**
|
|
11
|
-
* 정확성 여부. 지정된 path 가 정확히 맞아야만 컴포넌트가 렌더링 된다.
|
|
12
|
-
*/
|
|
13
|
-
exact?: boolean;
|
|
14
|
-
/**
|
|
15
|
-
* 현재 경로로 왔을 때 곧바로 이동될 다른 경로.
|
|
16
|
-
*
|
|
17
|
-
* 만약 guard 옵션에 설정이 되어있고 그 결과가 true 가 아니라면 설정된 주소를 사용하여 이동될 것이다.
|
|
18
|
-
*/
|
|
19
|
-
redirect?: string;
|
|
20
|
-
/**
|
|
21
|
-
* 해당 페이지에 접근 시 별도 권한이 필요하다면 쓰이는 기능.
|
|
22
|
-
*
|
|
23
|
-
* 동기 혹은 비동기로 true 가 되면 페이지 렌더링이 된다.
|
|
24
|
-
*
|
|
25
|
-
* 만약 설정 되었음에도 true 가 안된다면,
|
|
26
|
-
* 1. failComponent 에 설정된 컴포넌트를 렌더링 한다.
|
|
27
|
-
* 2. failComponent 가 설정 안되어 있다면, redirect 에 설정된 주소로 이동된다.
|
|
28
|
-
* 3. 아무것도 설정되어 있지 않다면 루트(/) 경로로 이동한다.
|
|
29
|
-
*
|
|
30
|
-
* 설정하지 않을 경우 무조건 렌더링 한다.
|
|
31
|
-
*/
|
|
32
|
-
guard?: () => boolean | Promise<boolean>;
|
|
33
|
-
/**
|
|
34
|
-
* 설정된 페이지 컴포넌트를 감싸서 함께 렌더링될 상위 컴포넌트
|
|
35
|
-
*/
|
|
36
|
-
wrap?: ComponentType<any>;
|
|
37
|
-
/**
|
|
38
|
-
* 렌더링에 사용될 페이지 컴포넌트.
|
|
39
|
-
*/
|
|
40
|
-
component?: ComponentType<any>;
|
|
41
|
-
/**
|
|
42
|
-
* guard 설정 결과가 false 일 때 렌더링 될 컴포넌트.
|
|
43
|
-
*/
|
|
44
|
-
failComponent?: ComponentType<any>;
|
|
45
|
-
/**
|
|
46
|
-
* 하위 라우팅 설정
|
|
47
|
-
*/
|
|
48
|
-
child?: ModuleRouteModel[];
|
|
49
|
-
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { ComponentType } from 'react';
|
|
2
|
-
import { ModuleRouteModel } from './moduleRoute.model';
|
|
3
|
-
declare type GuardFunctionType = () => boolean | Promise<boolean>;
|
|
4
|
-
export declare const renderRouteSystem: (routes: ModuleRouteModel[], withSwitch?: boolean, notFound?: ComponentType<any>, guardList?: GuardFunctionType[]) => JSX.Element | JSX.Element[];
|
|
5
|
-
export {};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { EnhancedStore, AsyncThunkAction } from '@reduxjs/toolkit';
|
|
2
|
-
import { CombinedState } from 'redux';
|
|
3
|
-
export declare function createGuardDispatch<T>(store: EnhancedStore<CombinedState<T>>): <R>(effectResult: AsyncThunkAction<R, any, any>) => Promise<boolean>;
|
|
4
|
-
export declare function createGuardSelector<T>(store: EnhancedStore<CombinedState<T>>): <R>(selector: (state: CombinedState<T>) => R) => R;
|