5htp-core 0.1.2 → 0.2.0
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/changelog.md +5 -0
- package/doc/TODO.md +71 -0
- package/package.json +5 -4
- package/src/client/{App.tsx → app/component.tsx} +15 -8
- package/src/client/app/index.ts +128 -0
- package/src/client/app/service.ts +34 -0
- package/src/client/app.tsconfig.json +0 -4
- package/src/client/assets/css/medias.less +14 -0
- package/src/client/components/Card/index.tsx +2 -2
- package/src/client/components/Dialog/Manager.tsx +39 -12
- package/src/client/components/Form/index.tsx +1 -1
- package/src/client/components/button.tsx +2 -2
- package/src/client/components/containers/Popover/index.tsx +1 -1
- package/src/client/components/data/spintext/index.tsx +1 -1
- package/src/client/components/dropdown/index.tsx +1 -1
- package/src/client/components/index.ts +8 -0
- package/src/client/components/input/BaseV2/index.tsx +1 -1
- package/src/client/components/input/UploadImage/index.tsx +1 -1
- package/src/client/hooks/index.ts +5 -0
- package/src/client/hooks/useState/index.tsx +2 -2
- package/src/client/hooks.ts +22 -0
- package/src/client/index.ts +5 -0
- package/src/client/pages/_layout/landing/index.tsx +0 -2
- package/src/client/pages/_messages/400.tsx +2 -2
- package/src/client/pages/_messages/401.tsx +2 -2
- package/src/client/pages/_messages/403.tsx +2 -2
- package/src/client/pages/_messages/404.tsx +2 -2
- package/src/client/pages/_messages/500.tsx +2 -2
- package/src/client/pages/bug.tsx +1 -1
- package/src/client/pages/useHeader.tsx +1 -1
- package/src/client/{context/captcha.ts → services/captcha/index.ts} +0 -0
- package/src/client/services/metrics/index.ts +37 -0
- package/src/client/{router → services/router/components}/Link.tsx +1 -1
- package/src/client/services/router/components/Page.tsx +59 -0
- package/src/client/{router/component.tsx → services/router/components/router.tsx} +43 -74
- package/src/client/services/router/index.tsx +448 -0
- package/src/client/services/router/request/api.ts +229 -0
- package/src/client/{router → services/router}/request/history.ts +0 -0
- package/src/client/services/router/request/index.ts +52 -0
- package/src/client/services/router/response/index.tsx +107 -0
- package/src/client/services/router/response/page.ts +95 -0
- package/src/client/{context/socket.ts → services/socket/index.ts} +2 -2
- package/src/client/utils/dom.ts +1 -1
- package/src/common/app/index.ts +9 -0
- package/src/common/data/chaines/index.ts +9 -6
- package/src/common/data/input/validate.ts +3 -166
- package/src/common/data/objets.ts +25 -0
- package/src/common/data/tableaux.ts +8 -0
- package/src/common/errors/index.ts +3 -1
- package/src/common/router/index.ts +67 -88
- package/src/common/router/layouts.ts +50 -0
- package/src/common/router/register.ts +62 -0
- package/src/common/router/request/api.ts +72 -0
- package/src/common/router/request/index.ts +31 -0
- package/src/common/router/{response.ts → response/index.ts} +9 -13
- package/src/common/router/response/page.ts +40 -56
- package/src/common/validation/index.ts +3 -0
- package/src/common/validation/schema.ts +184 -0
- package/src/common/validation/validator.ts +88 -0
- package/src/common/validation/validators.ts +313 -0
- package/src/server/app/config.ts +9 -27
- package/src/server/app/index.ts +81 -124
- package/src/server/app/service.ts +98 -0
- package/src/server/app.tsconfig.json +0 -8
- package/src/server/error/index.ts +13 -0
- package/src/server/index.ts +5 -0
- package/src/server/patch.ts +0 -6
- package/src/server/{data/Cache.ts → services/cache/index.ts} +79 -47
- package/src/server/services/console/bugReporter.ts +26 -16
- package/src/server/services/console/index.ts +59 -51
- package/src/server/services/cron/index.ts +12 -26
- package/src/server/services/database/bucket.ts +40 -0
- package/src/server/services/database/connection.ts +206 -75
- package/src/server/services/database/datatypes.ts +63 -40
- package/src/server/services/database/index.ts +295 -272
- package/src/server/services/database/metas.ts +246 -135
- package/src/server/services/database/stats.ts +151 -126
- package/src/server/services/email/index.ts +28 -52
- package/src/server/services/{router/request/services → metrics}/detect.ts +8 -10
- package/src/server/services/{router/request/services/tracking.ts → metrics/index.ts} +68 -45
- package/src/server/services/{http → router/http}/index.ts +28 -70
- package/src/server/services/{http → router/http}/multipart.ts +0 -0
- package/src/server/services/{http → router/http}/session.ts.old +0 -0
- package/src/server/services/router/index.ts +273 -203
- package/src/server/services/router/request/api.ts +73 -0
- package/src/server/services/router/request/index.ts +16 -97
- package/src/server/services/router/request/service.ts +21 -0
- package/src/server/services/router/response/index.ts +125 -64
- package/src/server/services/router/response/{filter → mask}/Filter.ts +0 -0
- package/src/server/services/router/response/{filter → mask}/index.ts +0 -2
- package/src/server/services/router/response/{filter → mask}/selecteurs.ts +0 -0
- package/src/server/services/router/response/page/document.tsx +194 -0
- package/src/server/services/router/response/page/index.tsx +157 -0
- package/src/server/{libs/pages → services/router/response/page}/schemaGenerator.ts +0 -0
- package/src/server/services/router/service.ts +48 -0
- package/src/server/services/schema/index.ts +47 -0
- package/src/server/services/schema/request.ts +55 -0
- package/src/server/services/schema/router.ts +33 -0
- package/src/server/services/socket/index.ts +38 -43
- package/src/server/services/socket/scope.ts +6 -4
- package/src/server/services/users/index.ts +203 -0
- package/src/server/services/{auth/base.ts → users/old.ts} +28 -112
- package/src/server/services/users/router/index.ts +72 -0
- package/src/server/services/users/router/request.ts +49 -0
- package/src/types/aliases.d.ts +43 -2
- package/templates/composant.tsx +1 -1
- package/templates/modal.tsx +1 -1
- package/templates/page.tsx +1 -1
- package/tsconfig.common.json +0 -4
- package/src/client/context/api.ts +0 -92
- package/src/client/context/index.ts +0 -246
- package/src/client/index.tsx +0 -129
- package/src/client/router/index.ts +0 -286
- package/src/client/router/request/index.ts +0 -106
- package/src/client/router/response/index.ts +0 -38
- package/src/client/router/route.ts +0 -75
- package/src/common/data/input/validators/basic.ts +0 -299
- package/src/common/data/input/validators/build.ts +0 -63
- package/src/common/router/request.ts +0 -83
- package/src/server/data/ApiClient.ts +0 -119
- package/src/server/data/input.ts +0 -41
- package/src/server/libs/pages/document.static.tsx +0 -41
- package/src/server/libs/pages/document.tsx +0 -203
- package/src/server/libs/pages/render.tsx +0 -90
- package/src/server/routes/auth.ts +0 -151
- package/src/server/services/redis/index.ts +0 -71
- package/src/server/services/router/request/services/auth.ts +0 -177
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import React from 'react';
|
|
7
7
|
|
|
8
8
|
// Core
|
|
9
|
-
import
|
|
9
|
+
import { router } from '@app';
|
|
10
10
|
import Button from '@client/components/button';
|
|
11
11
|
|
|
12
12
|
// App
|
|
@@ -18,7 +18,7 @@ import Button from '@client/components/button';
|
|
|
18
18
|
/*----------------------------------
|
|
19
19
|
- CONTROLEUR
|
|
20
20
|
----------------------------------*/
|
|
21
|
-
|
|
21
|
+
router.error(401, { }, ({ api, toast, modal, request, page }) => {
|
|
22
22
|
|
|
23
23
|
request.response?.redirect('/');
|
|
24
24
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import React from 'react';
|
|
7
7
|
|
|
8
8
|
// Core
|
|
9
|
-
import
|
|
9
|
+
import { router } from '@app';
|
|
10
10
|
import Button from '@client/components/button';
|
|
11
11
|
|
|
12
12
|
// App
|
|
@@ -15,7 +15,7 @@ import useHeader from '@client/pages/useHeader';
|
|
|
15
15
|
/*----------------------------------
|
|
16
16
|
- CONTROLEUR
|
|
17
17
|
----------------------------------*/
|
|
18
|
-
|
|
18
|
+
router.error( 403, {}, ({ message, modal }) => {
|
|
19
19
|
|
|
20
20
|
if (!message)
|
|
21
21
|
message = "You do not have sufficient permissions to access this content.";
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import React from 'react';
|
|
7
7
|
|
|
8
8
|
// Core
|
|
9
|
-
import
|
|
9
|
+
import { router } from '@app';
|
|
10
10
|
import Button from '@client/components/button';
|
|
11
11
|
|
|
12
12
|
// App
|
|
@@ -15,7 +15,7 @@ import useHeader from '@client/pages/useHeader';
|
|
|
15
15
|
/*----------------------------------
|
|
16
16
|
- CONTROLEUR
|
|
17
17
|
----------------------------------*/
|
|
18
|
-
|
|
18
|
+
router.error( 404, {}, ({ message, modal }) => {
|
|
19
19
|
|
|
20
20
|
if (!message)
|
|
21
21
|
message = "The content you asked for was not found.";
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import React from 'react';
|
|
7
7
|
|
|
8
8
|
// Core
|
|
9
|
-
import
|
|
9
|
+
import { router } from '@app';
|
|
10
10
|
import Button from '@client/components/button';
|
|
11
11
|
|
|
12
12
|
// App
|
|
@@ -15,7 +15,7 @@ import useHeader from '@client/pages/useHeader';
|
|
|
15
15
|
/*----------------------------------
|
|
16
16
|
- CONTROLEUR
|
|
17
17
|
----------------------------------*/
|
|
18
|
-
|
|
18
|
+
router.error( 500, {}, ({ message }) => {
|
|
19
19
|
|
|
20
20
|
if (!message)
|
|
21
21
|
message = "A technical error occurred.";
|
package/src/client/pages/bug.tsx
CHANGED
|
@@ -10,7 +10,7 @@ import Textarea from '@client/components/input/Textarea';
|
|
|
10
10
|
import Card, { Props as CardProps } from '@client/components/Dialog/card';
|
|
11
11
|
|
|
12
12
|
// Core libs
|
|
13
|
-
import useContext from '
|
|
13
|
+
import useContext from '@/client/context';
|
|
14
14
|
|
|
15
15
|
/*----------------------------------
|
|
16
16
|
- TYPES
|
|
File without changes
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
|
|
5
|
+
// Npm
|
|
6
|
+
|
|
7
|
+
// Core
|
|
8
|
+
import type ClientApplication from '@client/app';
|
|
9
|
+
|
|
10
|
+
/*----------------------------------
|
|
11
|
+
- TYPES
|
|
12
|
+
----------------------------------*/
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
/*----------------------------------
|
|
17
|
+
- SERVICE
|
|
18
|
+
----------------------------------*/
|
|
19
|
+
export default class ClientMetrics {
|
|
20
|
+
|
|
21
|
+
public constructor( public app: ClientApplication ) {
|
|
22
|
+
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public start() {
|
|
26
|
+
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Tracking
|
|
30
|
+
public event( name: string, params?: object ) {
|
|
31
|
+
if (!window.gtag) return;
|
|
32
|
+
if (name === 'pageview')
|
|
33
|
+
window.gtag('send', name);
|
|
34
|
+
else
|
|
35
|
+
window.gtag('event', name, params);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/*----------------------------------
|
|
2
|
+
- DEPENDANCES
|
|
3
|
+
----------------------------------*/
|
|
4
|
+
// Npm
|
|
5
|
+
import React from 'react';
|
|
6
|
+
|
|
7
|
+
// Core
|
|
8
|
+
import useContext from '@/client/context';
|
|
9
|
+
|
|
10
|
+
// Specific
|
|
11
|
+
import type Page from '../response/page';
|
|
12
|
+
|
|
13
|
+
/*----------------------------------
|
|
14
|
+
- PAGE STATE
|
|
15
|
+
----------------------------------*/
|
|
16
|
+
|
|
17
|
+
export default ({ page, isCurrent }: { page: Page, isCurrent?: boolean }) => {
|
|
18
|
+
|
|
19
|
+
const context = useContext();
|
|
20
|
+
|
|
21
|
+
const [apiData, setApiData] = React.useState<{[k: string]: any} | null>(
|
|
22
|
+
page.loadIndicator ? null : page.data
|
|
23
|
+
);
|
|
24
|
+
page.setAllData = setApiData;
|
|
25
|
+
|
|
26
|
+
React.useEffect(() => {
|
|
27
|
+
|
|
28
|
+
// Fetch the data asynchronously for the first time
|
|
29
|
+
if (apiData === null && isCurrent)
|
|
30
|
+
page.fetchData().then( loadedData => {
|
|
31
|
+
page.loadIndicator = false;
|
|
32
|
+
setApiData(loadedData);
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
}, []);
|
|
36
|
+
|
|
37
|
+
return (
|
|
38
|
+
<div
|
|
39
|
+
class={"page" + (isCurrent ? ' current' : '')}
|
|
40
|
+
id={page.chunkId === undefined ? undefined : 'page_' + page.chunkId}
|
|
41
|
+
>
|
|
42
|
+
|
|
43
|
+
{/* Make request parameters and api data accessible from the page component */}
|
|
44
|
+
{page.renderer ? (
|
|
45
|
+
|
|
46
|
+
<page.renderer
|
|
47
|
+
// Services
|
|
48
|
+
{...context}
|
|
49
|
+
// URL params
|
|
50
|
+
{...context.request.data}
|
|
51
|
+
// API data
|
|
52
|
+
{...apiData}
|
|
53
|
+
/>
|
|
54
|
+
|
|
55
|
+
) : null}
|
|
56
|
+
|
|
57
|
+
</div>
|
|
58
|
+
)
|
|
59
|
+
}
|
|
@@ -4,21 +4,21 @@
|
|
|
4
4
|
// Npm
|
|
5
5
|
import React from 'react';
|
|
6
6
|
|
|
7
|
-
//
|
|
8
|
-
import useContext from '
|
|
9
|
-
|
|
7
|
+
// Core
|
|
8
|
+
import useContext from '@/client/context';
|
|
9
|
+
|
|
10
|
+
// Specific
|
|
11
|
+
import type Router from '..';
|
|
12
|
+
import PageComponent from './Page';
|
|
13
|
+
import ClientRequest from '../request';
|
|
14
|
+
import { history, location, Update } from '../request/history';
|
|
10
15
|
//import initTooltips from '@client/components/Donnees/Tooltip';
|
|
11
|
-
|
|
12
|
-
// Navigation
|
|
13
|
-
import router from '.';
|
|
14
|
-
import { history, location, Update } from './request/history';
|
|
16
|
+
import type Page from '../response/page';
|
|
15
17
|
|
|
16
18
|
/*----------------------------------
|
|
17
19
|
- TYPES
|
|
18
20
|
----------------------------------*/
|
|
19
21
|
|
|
20
|
-
import type PageResponse from '../../common/router/response/page';
|
|
21
|
-
|
|
22
22
|
export type PropsPage<TParams extends { [cle: string]: unknown }> = TParams & {
|
|
23
23
|
data: {[cle: string]: unknown}
|
|
24
24
|
}
|
|
@@ -27,52 +27,20 @@ export type PropsPage<TParams extends { [cle: string]: unknown }> = TParams & {
|
|
|
27
27
|
- PAGE STATE
|
|
28
28
|
----------------------------------*/
|
|
29
29
|
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
const gui = useContext();
|
|
33
|
-
|
|
34
|
-
const [data, setData] = React.useState<{[k: string]: any} | null>( page.loading ? null : page.data );
|
|
35
|
-
page.setAllData = setData;
|
|
36
|
-
|
|
37
|
-
React.useEffect(() => {
|
|
38
|
-
|
|
39
|
-
if (data === null && isCurrent)
|
|
40
|
-
page.fetchData().then( loadedData => {
|
|
41
|
-
page.loading = false;
|
|
42
|
-
setData(loadedData);
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
}, []);
|
|
46
|
-
|
|
47
|
-
return (
|
|
48
|
-
<div
|
|
49
|
-
class={"page" + (isCurrent ? ' current' : '')}
|
|
50
|
-
id={page.id === undefined ? undefined : 'page_' + page.id}
|
|
51
|
-
>
|
|
52
|
-
|
|
53
|
-
{/* Make request parameters and api data accessible from the page component */}
|
|
54
|
-
{page.component ? (
|
|
55
|
-
|
|
56
|
-
<page.component {...gui.request.data} {...data} />
|
|
57
|
-
|
|
58
|
-
) : null}
|
|
59
|
-
|
|
60
|
-
</div>
|
|
61
|
-
)
|
|
62
|
-
}
|
|
30
|
+
const LogPrefix = `[router][component]`
|
|
63
31
|
|
|
64
32
|
/*----------------------------------
|
|
65
33
|
- COMPONENT
|
|
66
34
|
----------------------------------*/
|
|
67
|
-
export default () => {
|
|
35
|
+
export default ({ service: router }: { service: Router }) => {
|
|
68
36
|
|
|
69
|
-
const
|
|
37
|
+
const context = useContext();
|
|
70
38
|
|
|
71
39
|
const [pages, setPages] = React.useState<{
|
|
72
|
-
current: undefined |
|
|
73
|
-
//previous: undefined |
|
|
40
|
+
current: undefined | Page,
|
|
41
|
+
//previous: undefined | Page
|
|
74
42
|
}>({
|
|
75
|
-
current:
|
|
43
|
+
current: context.page,
|
|
76
44
|
//previous: undefined
|
|
77
45
|
});
|
|
78
46
|
|
|
@@ -82,8 +50,8 @@ export default () => {
|
|
|
82
50
|
// If needed to play with pages, do it in the setPages callback below
|
|
83
51
|
|
|
84
52
|
// Load the route chunks
|
|
85
|
-
|
|
86
|
-
const newpage =
|
|
53
|
+
context.request = request;
|
|
54
|
+
const newpage = context.page = await router.resolve(request);
|
|
87
55
|
|
|
88
56
|
// Page not found: Directly load with the browser
|
|
89
57
|
if (newpage === undefined) {
|
|
@@ -94,22 +62,25 @@ export default () => {
|
|
|
94
62
|
return;
|
|
95
63
|
}
|
|
96
64
|
|
|
97
|
-
// Set
|
|
98
|
-
newpage.
|
|
65
|
+
// Set.loadIndicator state
|
|
66
|
+
newpage.loadIndicator = <i src="spin" />
|
|
99
67
|
// Add page container
|
|
100
68
|
setPages( pages => {
|
|
101
69
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
70
|
+
const currentRoute = pages.current?.route;
|
|
71
|
+
|
|
72
|
+
// Check if the page changed
|
|
73
|
+
if (currentRoute?.path === request.path) {
|
|
74
|
+
console.warn(LogPrefix, "Canceling navigation to the same page:", {...request});
|
|
105
75
|
return pages;
|
|
106
76
|
}
|
|
107
77
|
|
|
108
|
-
//
|
|
109
|
-
const curLayout =
|
|
110
|
-
const
|
|
111
|
-
if (
|
|
112
|
-
|
|
78
|
+
// If if the layout changed
|
|
79
|
+
const curLayout = currentRoute?.options.layout;
|
|
80
|
+
const newLayout = newpage?.route.options.layout;
|
|
81
|
+
if (newLayout && curLayout && newLayout.path !== curLayout.path) {
|
|
82
|
+
console.log(LogPrefix, `Changing layout. Before:`, curLayout, 'New layout:', newLayout);
|
|
83
|
+
context.app.setLayout(newLayout);
|
|
113
84
|
}
|
|
114
85
|
|
|
115
86
|
// Remove old page after the aff-page css transition
|
|
@@ -128,8 +99,8 @@ export default () => {
|
|
|
128
99
|
});
|
|
129
100
|
}
|
|
130
101
|
|
|
131
|
-
const restoreScroll = (currentPage?:
|
|
132
|
-
&& document.getElementById( currentPage.
|
|
102
|
+
const restoreScroll = (currentPage?: Page) => currentPage?.scrollToId
|
|
103
|
+
&& document.getElementById( currentPage.scrollToId.substring(1) )?.scrollIntoView({
|
|
133
104
|
behavior: "smooth",
|
|
134
105
|
block: "start",
|
|
135
106
|
inline: "nearest"
|
|
@@ -138,19 +109,15 @@ export default () => {
|
|
|
138
109
|
// First load
|
|
139
110
|
React.useEffect(() => {
|
|
140
111
|
|
|
141
|
-
/*gui.api.set = (newData: TObjetDonnees) => {
|
|
142
|
-
setPage(a => ({ ...a, data: { ...a.data, ...newData } }));
|
|
143
|
-
}*/
|
|
144
|
-
|
|
145
112
|
// Resolve page if it wasn't done via SSR
|
|
146
|
-
if (
|
|
147
|
-
resolvePage(
|
|
113
|
+
if (context.page === undefined)
|
|
114
|
+
resolvePage(context.request);
|
|
148
115
|
|
|
149
116
|
// Foreach URL change (Ex: bowser' back buttton)
|
|
150
117
|
return history?.listen(async (locationUpdate) => {
|
|
151
118
|
|
|
152
119
|
// Load the concerned route
|
|
153
|
-
const request = new ClientRequest(locationUpdate.location,
|
|
120
|
+
const request = new ClientRequest(locationUpdate.location, context);
|
|
154
121
|
await resolvePage(request);
|
|
155
122
|
|
|
156
123
|
// Scroll to the selected content via url hash
|
|
@@ -161,16 +128,15 @@ export default () => {
|
|
|
161
128
|
// On every page change
|
|
162
129
|
React.useEffect(() => {
|
|
163
130
|
|
|
164
|
-
// Tracking
|
|
165
|
-
gui.event('pageview');
|
|
166
131
|
// Reset scroll
|
|
167
132
|
window.scrollTo(0, 0);
|
|
168
133
|
// Should be called AFTER rendering the page (so after the state change)
|
|
169
|
-
|
|
170
|
-
|
|
134
|
+
pages.current?.updateClient();
|
|
171
135
|
// Scroll to the selected content via url hash
|
|
172
136
|
restoreScroll(pages.current);
|
|
173
|
-
|
|
137
|
+
|
|
138
|
+
// Hooks
|
|
139
|
+
router.runHook('page.changed', pages.current)
|
|
174
140
|
|
|
175
141
|
}, [pages.current]);
|
|
176
142
|
|
|
@@ -181,7 +147,10 @@ export default () => {
|
|
|
181
147
|
)*/}
|
|
182
148
|
|
|
183
149
|
{pages.current && (
|
|
184
|
-
<
|
|
150
|
+
<PageComponent page={pages.current}
|
|
151
|
+
isCurrent
|
|
152
|
+
key={pages.current.id === undefined ? undefined : 'page_' + pages.current.id}
|
|
153
|
+
/>
|
|
185
154
|
)}
|
|
186
155
|
</>
|
|
187
156
|
}
|