@innet/server 1.6.4 → 1.6.5
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/action/Action/Action.d.ts +2 -1
- package/action/Action/Action.es6.js +72 -21
- package/action/Action/Action.js +73 -21
- package/action/Action/index.es6.js +1 -1
- package/action/Action/index.js +2 -1
- package/action/index.es6.js +1 -1
- package/action/index.js +2 -1
- package/hooks/index.d.ts +5 -0
- package/hooks/index.es6.js +5 -0
- package/hooks/index.js +17 -0
- package/hooks/useAction/index.d.ts +1 -0
- package/hooks/useAction/index.es6.js +1 -0
- package/hooks/useAction/index.js +9 -0
- package/hooks/useAction/useAction.d.ts +2 -0
- package/hooks/useAction/useAction.es6.js +8 -0
- package/hooks/useAction/useAction.js +12 -0
- package/hooks/useBody/index.d.ts +1 -0
- package/hooks/useBody/index.es6.js +1 -0
- package/hooks/useBody/index.js +9 -0
- package/hooks/useBody/useBody.d.ts +1 -0
- package/hooks/useBody/useBody.es6.js +7 -0
- package/hooks/useBody/useBody.js +11 -0
- package/hooks/useCookies/index.d.ts +1 -0
- package/hooks/useCookies/index.es6.js +1 -0
- package/hooks/useCookies/index.js +9 -0
- package/hooks/useCookies/useCookies.d.ts +2 -0
- package/hooks/useCookies/useCookies.es6.js +7 -0
- package/hooks/useCookies/useCookies.js +11 -0
- package/hooks/useFiles/index.d.ts +1 -0
- package/hooks/useFiles/index.es6.js +1 -0
- package/hooks/useFiles/index.js +9 -0
- package/hooks/useFiles/useFiles.d.ts +1 -0
- package/hooks/useFiles/useFiles.es6.js +7 -0
- package/hooks/useFiles/useFiles.js +11 -0
- package/hooks/useSearch/index.d.ts +1 -0
- package/hooks/useSearch/index.es6.js +1 -0
- package/hooks/useSearch/index.js +9 -0
- package/hooks/useSearch/useSearch.d.ts +1 -0
- package/hooks/useSearch/useSearch.es6.js +7 -0
- package/hooks/useSearch/useSearch.js +11 -0
- package/index.d.ts +1 -0
- package/index.es6.js +6 -1
- package/index.js +12 -1
- package/package.json +1 -1
|
@@ -28,6 +28,8 @@ export interface ActionParams {
|
|
|
28
28
|
}
|
|
29
29
|
export declare type Resources = Exclude<keyof ActionOptions, undefined>;
|
|
30
30
|
export declare const URL_PARSER: RegExp;
|
|
31
|
+
export declare const KEY_FIELD: RegExp;
|
|
32
|
+
export declare const KEY_KEYS: RegExp;
|
|
31
33
|
export declare class Action<O extends ActionOptions = ActionOptions> {
|
|
32
34
|
readonly req: Request;
|
|
33
35
|
readonly res: Response;
|
|
@@ -45,4 +47,3 @@ export declare class Action<O extends ActionOptions = ActionOptions> {
|
|
|
45
47
|
};
|
|
46
48
|
get path(): string;
|
|
47
49
|
}
|
|
48
|
-
export declare function useAction<T extends Partial<ActionOptions>, O extends ActionOptions = ActionOptions & T>(): Action<O>;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { __decorate } from 'tslib';
|
|
2
2
|
import { once } from '@cantinc/utils';
|
|
3
|
-
import { useHandler } from '@innet/jsx';
|
|
4
3
|
import cookie from 'cookie';
|
|
5
4
|
import multiparty from 'multiparty';
|
|
6
5
|
import { parseSearch } from '../../utils/parseSearch/parseSearch.es6.js';
|
|
@@ -8,6 +7,72 @@ import 'qs';
|
|
|
8
7
|
|
|
9
8
|
const ACTION = Symbol('Action');
|
|
10
9
|
const URL_PARSER = /^(?<path>[^?]+)(\?(?<search>.*))?/;
|
|
10
|
+
const KEY_FIELD = /^(?<field>[^[]+)(?<rest>.*)$/;
|
|
11
|
+
const KEY_KEYS = /^\[(?<key>[^\]]+)\](?<rest>.*)$/;
|
|
12
|
+
function getKeys(keys) {
|
|
13
|
+
const match = keys.match(KEY_KEYS);
|
|
14
|
+
if (!match)
|
|
15
|
+
return [keys];
|
|
16
|
+
if (!match.groups.rest)
|
|
17
|
+
return [match.groups.key];
|
|
18
|
+
return [match.groups.key, ...getKeys(match.groups.rest)];
|
|
19
|
+
}
|
|
20
|
+
function parseKey(key) {
|
|
21
|
+
const fieldMatch = key.match(KEY_FIELD);
|
|
22
|
+
if (!(fieldMatch === null || fieldMatch === void 0 ? void 0 : fieldMatch.groups.field)) {
|
|
23
|
+
return {
|
|
24
|
+
field: key,
|
|
25
|
+
keys: [],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
field: fieldMatch.groups.field,
|
|
30
|
+
keys: (fieldMatch === null || fieldMatch === void 0 ? void 0 : fieldMatch.groups.rest) ? getKeys(fieldMatch.groups.rest) : [],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function addField(key, value, fields) {
|
|
34
|
+
if (!key.keys.length) {
|
|
35
|
+
if (!(key.field in fields)) {
|
|
36
|
+
fields[key.field] = value;
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const oldValue = fields[key.field];
|
|
40
|
+
if (Array.isArray(oldValue)) {
|
|
41
|
+
if (Array.isArray(value)) {
|
|
42
|
+
oldValue.push(...value);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
oldValue.push(value);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (Array.isArray(value)) {
|
|
49
|
+
fields[key.field] = [oldValue, ...value];
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
fields[key.field] = [oldValue, value];
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const [field, ...keys] = key.keys;
|
|
56
|
+
const oldValue = fields[key.field];
|
|
57
|
+
if (Array.isArray(oldValue)) {
|
|
58
|
+
throw Error('invalid keys');
|
|
59
|
+
}
|
|
60
|
+
if (!oldValue) {
|
|
61
|
+
fields[key.field] = {};
|
|
62
|
+
}
|
|
63
|
+
else if (typeof oldValue !== 'object') {
|
|
64
|
+
throw Error('invalid keys');
|
|
65
|
+
}
|
|
66
|
+
addField({ field, keys }, value, fields[key.field]);
|
|
67
|
+
}
|
|
68
|
+
function formatFields(fields) {
|
|
69
|
+
const result = {};
|
|
70
|
+
for (const key in fields) {
|
|
71
|
+
const value = fields[key];
|
|
72
|
+
addField(parseKey(key), Array.isArray(value) && value.length === 1 ? value[0] : value, result);
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
11
76
|
class Action {
|
|
12
77
|
constructor(req, res, params = {}) {
|
|
13
78
|
this.req = req;
|
|
@@ -36,22 +101,11 @@ class Action {
|
|
|
36
101
|
new multiparty.Form(this.params.multipartyForm).parse(this.req, (err, fields, files) => {
|
|
37
102
|
if (err) {
|
|
38
103
|
reject(err);
|
|
104
|
+
return;
|
|
39
105
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
fields[key] = fields[key][0];
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
for (const key in files) {
|
|
47
|
-
if (files[key].length === 1) {
|
|
48
|
-
files[key] = files[key][0];
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
this.body = fields;
|
|
52
|
-
this.files = files;
|
|
53
|
-
resolve(fields);
|
|
54
|
-
}
|
|
106
|
+
this.body = formatFields(fields);
|
|
107
|
+
this.files = formatFields(files);
|
|
108
|
+
resolve(fields);
|
|
55
109
|
});
|
|
56
110
|
});
|
|
57
111
|
}
|
|
@@ -77,9 +131,6 @@ __decorate([
|
|
|
77
131
|
], Action.prototype, "search", null);
|
|
78
132
|
__decorate([
|
|
79
133
|
once
|
|
80
|
-
], Action.prototype, "parsedUrl", null);
|
|
81
|
-
function useAction() {
|
|
82
|
-
return useHandler()[ACTION];
|
|
83
|
-
}
|
|
134
|
+
], Action.prototype, "parsedUrl", null);
|
|
84
135
|
|
|
85
|
-
export { ACTION, Action,
|
|
136
|
+
export { ACTION, Action, KEY_FIELD, KEY_KEYS, URL_PARSER };
|
package/action/Action/Action.js
CHANGED
|
@@ -4,7 +4,6 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var tslib = require('tslib');
|
|
6
6
|
var utils = require('@cantinc/utils');
|
|
7
|
-
var jsx = require('@innet/jsx');
|
|
8
7
|
var cookie = require('cookie');
|
|
9
8
|
var multiparty = require('multiparty');
|
|
10
9
|
var parseSearch = require('../../utils/parseSearch/parseSearch.js');
|
|
@@ -17,6 +16,72 @@ var multiparty__default = /*#__PURE__*/_interopDefaultLegacy(multiparty);
|
|
|
17
16
|
|
|
18
17
|
var ACTION = Symbol('Action');
|
|
19
18
|
var URL_PARSER = /^(?<path>[^?]+)(\?(?<search>.*))?/;
|
|
19
|
+
var KEY_FIELD = /^(?<field>[^[]+)(?<rest>.*)$/;
|
|
20
|
+
var KEY_KEYS = /^\[(?<key>[^\]]+)\](?<rest>.*)$/;
|
|
21
|
+
function getKeys(keys) {
|
|
22
|
+
var match = keys.match(KEY_KEYS);
|
|
23
|
+
if (!match)
|
|
24
|
+
return [keys];
|
|
25
|
+
if (!match.groups.rest)
|
|
26
|
+
return [match.groups.key];
|
|
27
|
+
return tslib.__spreadArray([match.groups.key], tslib.__read(getKeys(match.groups.rest)), false);
|
|
28
|
+
}
|
|
29
|
+
function parseKey(key) {
|
|
30
|
+
var fieldMatch = key.match(KEY_FIELD);
|
|
31
|
+
if (!(fieldMatch === null || fieldMatch === void 0 ? void 0 : fieldMatch.groups.field)) {
|
|
32
|
+
return {
|
|
33
|
+
field: key,
|
|
34
|
+
keys: [],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
field: fieldMatch.groups.field,
|
|
39
|
+
keys: (fieldMatch === null || fieldMatch === void 0 ? void 0 : fieldMatch.groups.rest) ? getKeys(fieldMatch.groups.rest) : [],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function addField(key, value, fields) {
|
|
43
|
+
if (!key.keys.length) {
|
|
44
|
+
if (!(key.field in fields)) {
|
|
45
|
+
fields[key.field] = value;
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
var oldValue_1 = fields[key.field];
|
|
49
|
+
if (Array.isArray(oldValue_1)) {
|
|
50
|
+
if (Array.isArray(value)) {
|
|
51
|
+
oldValue_1.push.apply(oldValue_1, tslib.__spreadArray([], tslib.__read(value), false));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
oldValue_1.push(value);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (Array.isArray(value)) {
|
|
58
|
+
fields[key.field] = tslib.__spreadArray([oldValue_1], tslib.__read(value), false);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
fields[key.field] = [oldValue_1, value];
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
var _a = tslib.__read(key.keys), field = _a[0], keys = _a.slice(1);
|
|
65
|
+
var oldValue = fields[key.field];
|
|
66
|
+
if (Array.isArray(oldValue)) {
|
|
67
|
+
throw Error('invalid keys');
|
|
68
|
+
}
|
|
69
|
+
if (!oldValue) {
|
|
70
|
+
fields[key.field] = {};
|
|
71
|
+
}
|
|
72
|
+
else if (typeof oldValue !== 'object') {
|
|
73
|
+
throw Error('invalid keys');
|
|
74
|
+
}
|
|
75
|
+
addField({ field: field, keys: keys }, value, fields[key.field]);
|
|
76
|
+
}
|
|
77
|
+
function formatFields(fields) {
|
|
78
|
+
var result = {};
|
|
79
|
+
for (var key in fields) {
|
|
80
|
+
var value = fields[key];
|
|
81
|
+
addField(parseKey(key), Array.isArray(value) && value.length === 1 ? value[0] : value, result);
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
20
85
|
var Action = /** @class */ (function () {
|
|
21
86
|
function Action(req, res, params) {
|
|
22
87
|
if (params === void 0) { params = {}; }
|
|
@@ -51,22 +116,11 @@ var Action = /** @class */ (function () {
|
|
|
51
116
|
new multiparty__default["default"].Form(_this.params.multipartyForm).parse(_this.req, function (err, fields, files) {
|
|
52
117
|
if (err) {
|
|
53
118
|
reject(err);
|
|
119
|
+
return;
|
|
54
120
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
fields[key] = fields[key][0];
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
for (var key in files) {
|
|
62
|
-
if (files[key].length === 1) {
|
|
63
|
-
files[key] = files[key][0];
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
_this.body = fields;
|
|
67
|
-
_this.files = files;
|
|
68
|
-
resolve(fields);
|
|
69
|
-
}
|
|
121
|
+
_this.body = formatFields(fields);
|
|
122
|
+
_this.files = formatFields(files);
|
|
123
|
+
resolve(fields);
|
|
70
124
|
});
|
|
71
125
|
});
|
|
72
126
|
};
|
|
@@ -105,12 +159,10 @@ var Action = /** @class */ (function () {
|
|
|
105
159
|
utils.once
|
|
106
160
|
], Action.prototype, "parsedUrl", null);
|
|
107
161
|
return Action;
|
|
108
|
-
}());
|
|
109
|
-
function useAction() {
|
|
110
|
-
return jsx.useHandler()[ACTION];
|
|
111
|
-
}
|
|
162
|
+
}());
|
|
112
163
|
|
|
113
164
|
exports.ACTION = ACTION;
|
|
114
165
|
exports.Action = Action;
|
|
166
|
+
exports.KEY_FIELD = KEY_FIELD;
|
|
167
|
+
exports.KEY_KEYS = KEY_KEYS;
|
|
115
168
|
exports.URL_PARSER = URL_PARSER;
|
|
116
|
-
exports.useAction = useAction;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { ACTION, Action,
|
|
1
|
+
export { ACTION, Action, KEY_FIELD, KEY_KEYS, URL_PARSER } from './Action.es6.js';
|
package/action/Action/index.js
CHANGED
|
@@ -8,5 +8,6 @@ var Action = require('./Action.js');
|
|
|
8
8
|
|
|
9
9
|
exports.ACTION = Action.ACTION;
|
|
10
10
|
exports.Action = Action.Action;
|
|
11
|
+
exports.KEY_FIELD = Action.KEY_FIELD;
|
|
12
|
+
exports.KEY_KEYS = Action.KEY_KEYS;
|
|
11
13
|
exports.URL_PARSER = Action.URL_PARSER;
|
|
12
|
-
exports.useAction = Action.useAction;
|
package/action/index.es6.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { ACTION, Action,
|
|
1
|
+
export { ACTION, Action, KEY_FIELD, KEY_KEYS, URL_PARSER } from './Action/Action.es6.js';
|
package/action/index.js
CHANGED
|
@@ -8,5 +8,6 @@ var Action = require('./Action/Action.js');
|
|
|
8
8
|
|
|
9
9
|
exports.ACTION = Action.ACTION;
|
|
10
10
|
exports.Action = Action.Action;
|
|
11
|
+
exports.KEY_FIELD = Action.KEY_FIELD;
|
|
12
|
+
exports.KEY_KEYS = Action.KEY_KEYS;
|
|
11
13
|
exports.URL_PARSER = Action.URL_PARSER;
|
|
12
|
-
exports.useAction = Action.useAction;
|
package/hooks/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { useAction } from './useAction/useAction.es6.js';
|
|
2
|
+
export { useBody } from './useBody/useBody.es6.js';
|
|
3
|
+
export { useCookies } from './useCookies/useCookies.es6.js';
|
|
4
|
+
export { useFiles } from './useFiles/useFiles.es6.js';
|
|
5
|
+
export { useSearch } from './useSearch/useSearch.es6.js';
|
package/hooks/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var useAction = require('./useAction/useAction.js');
|
|
6
|
+
var useBody = require('./useBody/useBody.js');
|
|
7
|
+
var useCookies = require('./useCookies/useCookies.js');
|
|
8
|
+
var useFiles = require('./useFiles/useFiles.js');
|
|
9
|
+
var useSearch = require('./useSearch/useSearch.js');
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
exports.useAction = useAction.useAction;
|
|
14
|
+
exports.useBody = useBody.useBody;
|
|
15
|
+
exports.useCookies = useCookies.useCookies;
|
|
16
|
+
exports.useFiles = useFiles.useFiles;
|
|
17
|
+
exports.useSearch = useSearch.useSearch;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useAction';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useAction } from './useAction.es6.js';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var jsx = require('@innet/jsx');
|
|
6
|
+
var Action = require('../../action/Action/Action.js');
|
|
7
|
+
|
|
8
|
+
function useAction() {
|
|
9
|
+
return jsx.useHandler()[Action.ACTION];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
exports.useAction = useAction;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useBody';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useBody } from './useBody.es6.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useBody<T>(): T;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useCookies';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useCookies } from './useCookies.es6.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useFiles';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useFiles } from './useFiles.es6.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useFiles<T>(): T;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useSearch';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useSearch } from './useSearch.es6.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useSearch<D>(): D;
|
package/index.d.ts
CHANGED
package/index.es6.js
CHANGED
|
@@ -13,6 +13,11 @@ export { validation, validationContext } from './plugins/validation/validation.e
|
|
|
13
13
|
export { formatter } from './plugins/formatter/formatter.es6.js';
|
|
14
14
|
export { access, accessContext } from './plugins/access/access.es6.js';
|
|
15
15
|
export { parseBody } from './plugins/parseBody/parseBody.es6.js';
|
|
16
|
-
export { ACTION, Action,
|
|
16
|
+
export { ACTION, Action, KEY_FIELD, KEY_KEYS, URL_PARSER } from './action/Action/Action.es6.js';
|
|
17
17
|
export { parseSearch } from './utils/parseSearch/parseSearch.es6.js';
|
|
18
18
|
export { stringifySearch } from './utils/stringifySearch/stringifySearch.es6.js';
|
|
19
|
+
export { useAction } from './hooks/useAction/useAction.es6.js';
|
|
20
|
+
export { useBody } from './hooks/useBody/useBody.es6.js';
|
|
21
|
+
export { useCookies } from './hooks/useCookies/useCookies.es6.js';
|
|
22
|
+
export { useFiles } from './hooks/useFiles/useFiles.es6.js';
|
|
23
|
+
export { useSearch } from './hooks/useSearch/useSearch.es6.js';
|
package/index.js
CHANGED
|
@@ -20,6 +20,11 @@ var parseBody = require('./plugins/parseBody/parseBody.js');
|
|
|
20
20
|
var Action = require('./action/Action/Action.js');
|
|
21
21
|
var parseSearch = require('./utils/parseSearch/parseSearch.js');
|
|
22
22
|
var stringifySearch = require('./utils/stringifySearch/stringifySearch.js');
|
|
23
|
+
var useAction = require('./hooks/useAction/useAction.js');
|
|
24
|
+
var useBody = require('./hooks/useBody/useBody.js');
|
|
25
|
+
var useCookies = require('./hooks/useCookies/useCookies.js');
|
|
26
|
+
var useFiles = require('./hooks/useFiles/useFiles.js');
|
|
27
|
+
var useSearch = require('./hooks/useSearch/useSearch.js');
|
|
23
28
|
|
|
24
29
|
|
|
25
30
|
|
|
@@ -54,7 +59,13 @@ exports.accessContext = access.accessContext;
|
|
|
54
59
|
exports.parseBody = parseBody.parseBody;
|
|
55
60
|
exports.ACTION = Action.ACTION;
|
|
56
61
|
exports.Action = Action.Action;
|
|
62
|
+
exports.KEY_FIELD = Action.KEY_FIELD;
|
|
63
|
+
exports.KEY_KEYS = Action.KEY_KEYS;
|
|
57
64
|
exports.URL_PARSER = Action.URL_PARSER;
|
|
58
|
-
exports.useAction = Action.useAction;
|
|
59
65
|
exports.parseSearch = parseSearch.parseSearch;
|
|
60
66
|
exports.stringifySearch = stringifySearch.stringifySearch;
|
|
67
|
+
exports.useAction = useAction.useAction;
|
|
68
|
+
exports.useBody = useBody.useBody;
|
|
69
|
+
exports.useCookies = useCookies.useCookies;
|
|
70
|
+
exports.useFiles = useFiles.useFiles;
|
|
71
|
+
exports.useSearch = useSearch.useSearch;
|