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.
Files changed (127) hide show
  1. package/changelog.md +5 -0
  2. package/doc/TODO.md +71 -0
  3. package/package.json +5 -4
  4. package/src/client/{App.tsx → app/component.tsx} +15 -8
  5. package/src/client/app/index.ts +128 -0
  6. package/src/client/app/service.ts +34 -0
  7. package/src/client/app.tsconfig.json +0 -4
  8. package/src/client/assets/css/medias.less +14 -0
  9. package/src/client/components/Card/index.tsx +2 -2
  10. package/src/client/components/Dialog/Manager.tsx +39 -12
  11. package/src/client/components/Form/index.tsx +1 -1
  12. package/src/client/components/button.tsx +2 -2
  13. package/src/client/components/containers/Popover/index.tsx +1 -1
  14. package/src/client/components/data/spintext/index.tsx +1 -1
  15. package/src/client/components/dropdown/index.tsx +1 -1
  16. package/src/client/components/index.ts +8 -0
  17. package/src/client/components/input/BaseV2/index.tsx +1 -1
  18. package/src/client/components/input/UploadImage/index.tsx +1 -1
  19. package/src/client/hooks/index.ts +5 -0
  20. package/src/client/hooks/useState/index.tsx +2 -2
  21. package/src/client/hooks.ts +22 -0
  22. package/src/client/index.ts +5 -0
  23. package/src/client/pages/_layout/landing/index.tsx +0 -2
  24. package/src/client/pages/_messages/400.tsx +2 -2
  25. package/src/client/pages/_messages/401.tsx +2 -2
  26. package/src/client/pages/_messages/403.tsx +2 -2
  27. package/src/client/pages/_messages/404.tsx +2 -2
  28. package/src/client/pages/_messages/500.tsx +2 -2
  29. package/src/client/pages/bug.tsx +1 -1
  30. package/src/client/pages/useHeader.tsx +1 -1
  31. package/src/client/{context/captcha.ts → services/captcha/index.ts} +0 -0
  32. package/src/client/services/metrics/index.ts +37 -0
  33. package/src/client/{router → services/router/components}/Link.tsx +1 -1
  34. package/src/client/services/router/components/Page.tsx +59 -0
  35. package/src/client/{router/component.tsx → services/router/components/router.tsx} +43 -74
  36. package/src/client/services/router/index.tsx +448 -0
  37. package/src/client/services/router/request/api.ts +229 -0
  38. package/src/client/{router → services/router}/request/history.ts +0 -0
  39. package/src/client/services/router/request/index.ts +52 -0
  40. package/src/client/services/router/response/index.tsx +107 -0
  41. package/src/client/services/router/response/page.ts +95 -0
  42. package/src/client/{context/socket.ts → services/socket/index.ts} +2 -2
  43. package/src/client/utils/dom.ts +1 -1
  44. package/src/common/app/index.ts +9 -0
  45. package/src/common/data/chaines/index.ts +9 -6
  46. package/src/common/data/input/validate.ts +3 -166
  47. package/src/common/data/objets.ts +25 -0
  48. package/src/common/data/tableaux.ts +8 -0
  49. package/src/common/errors/index.ts +3 -1
  50. package/src/common/router/index.ts +67 -88
  51. package/src/common/router/layouts.ts +50 -0
  52. package/src/common/router/register.ts +62 -0
  53. package/src/common/router/request/api.ts +72 -0
  54. package/src/common/router/request/index.ts +31 -0
  55. package/src/common/router/{response.ts → response/index.ts} +9 -13
  56. package/src/common/router/response/page.ts +40 -56
  57. package/src/common/validation/index.ts +3 -0
  58. package/src/common/validation/schema.ts +184 -0
  59. package/src/common/validation/validator.ts +88 -0
  60. package/src/common/validation/validators.ts +313 -0
  61. package/src/server/app/config.ts +9 -27
  62. package/src/server/app/index.ts +81 -124
  63. package/src/server/app/service.ts +98 -0
  64. package/src/server/app.tsconfig.json +0 -8
  65. package/src/server/error/index.ts +13 -0
  66. package/src/server/index.ts +5 -0
  67. package/src/server/patch.ts +0 -6
  68. package/src/server/{data/Cache.ts → services/cache/index.ts} +79 -47
  69. package/src/server/services/console/bugReporter.ts +26 -16
  70. package/src/server/services/console/index.ts +59 -51
  71. package/src/server/services/cron/index.ts +12 -26
  72. package/src/server/services/database/bucket.ts +40 -0
  73. package/src/server/services/database/connection.ts +206 -75
  74. package/src/server/services/database/datatypes.ts +63 -40
  75. package/src/server/services/database/index.ts +295 -272
  76. package/src/server/services/database/metas.ts +246 -135
  77. package/src/server/services/database/stats.ts +151 -126
  78. package/src/server/services/email/index.ts +28 -52
  79. package/src/server/services/{router/request/services → metrics}/detect.ts +8 -10
  80. package/src/server/services/{router/request/services/tracking.ts → metrics/index.ts} +68 -45
  81. package/src/server/services/{http → router/http}/index.ts +28 -70
  82. package/src/server/services/{http → router/http}/multipart.ts +0 -0
  83. package/src/server/services/{http → router/http}/session.ts.old +0 -0
  84. package/src/server/services/router/index.ts +273 -203
  85. package/src/server/services/router/request/api.ts +73 -0
  86. package/src/server/services/router/request/index.ts +16 -97
  87. package/src/server/services/router/request/service.ts +21 -0
  88. package/src/server/services/router/response/index.ts +125 -64
  89. package/src/server/services/router/response/{filter → mask}/Filter.ts +0 -0
  90. package/src/server/services/router/response/{filter → mask}/index.ts +0 -2
  91. package/src/server/services/router/response/{filter → mask}/selecteurs.ts +0 -0
  92. package/src/server/services/router/response/page/document.tsx +194 -0
  93. package/src/server/services/router/response/page/index.tsx +157 -0
  94. package/src/server/{libs/pages → services/router/response/page}/schemaGenerator.ts +0 -0
  95. package/src/server/services/router/service.ts +48 -0
  96. package/src/server/services/schema/index.ts +47 -0
  97. package/src/server/services/schema/request.ts +55 -0
  98. package/src/server/services/schema/router.ts +33 -0
  99. package/src/server/services/socket/index.ts +38 -43
  100. package/src/server/services/socket/scope.ts +6 -4
  101. package/src/server/services/users/index.ts +203 -0
  102. package/src/server/services/{auth/base.ts → users/old.ts} +28 -112
  103. package/src/server/services/users/router/index.ts +72 -0
  104. package/src/server/services/users/router/request.ts +49 -0
  105. package/src/types/aliases.d.ts +43 -2
  106. package/templates/composant.tsx +1 -1
  107. package/templates/modal.tsx +1 -1
  108. package/templates/page.tsx +1 -1
  109. package/tsconfig.common.json +0 -4
  110. package/src/client/context/api.ts +0 -92
  111. package/src/client/context/index.ts +0 -246
  112. package/src/client/index.tsx +0 -129
  113. package/src/client/router/index.ts +0 -286
  114. package/src/client/router/request/index.ts +0 -106
  115. package/src/client/router/response/index.ts +0 -38
  116. package/src/client/router/route.ts +0 -75
  117. package/src/common/data/input/validators/basic.ts +0 -299
  118. package/src/common/data/input/validators/build.ts +0 -63
  119. package/src/common/router/request.ts +0 -83
  120. package/src/server/data/ApiClient.ts +0 -119
  121. package/src/server/data/input.ts +0 -41
  122. package/src/server/libs/pages/document.static.tsx +0 -41
  123. package/src/server/libs/pages/document.tsx +0 -203
  124. package/src/server/libs/pages/render.tsx +0 -90
  125. package/src/server/routes/auth.ts +0 -151
  126. package/src/server/services/redis/index.ts +0 -71
  127. 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 route from '@router';
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
- route.error(401, { }, ({ }, { api, toast, modal, request, page }) => {
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 route from '@router';
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
- route.error( 403, {}, ({ message }, { modal }) => {
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 route from '@router';
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
- route.error( 404, {}, ({ message }, { modal }) => {
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 route from '@router';
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
- route.error( 500, {}, ({ message }) => {
18
+ router.error( 500, {}, ({ message }) => {
19
19
 
20
20
  if (!message)
21
21
  message = "A technical error occurred.";
@@ -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 '@client/context';
13
+ import useContext from '@/client/context';
14
14
 
15
15
  /*----------------------------------
16
16
  - TYPES
@@ -3,7 +3,7 @@
3
3
  ----------------------------------*/
4
4
 
5
5
  // Core
6
- import useContext from '@client/context';
6
+ import useContext from '@/client/context';
7
7
 
8
8
  /*----------------------------------
9
9
  - TYPES
@@ -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
+ }
@@ -5,7 +5,7 @@
5
5
  // Npm
6
6
  import React from 'react';
7
7
  import type { ComponentChild } from 'preact';
8
- import { history } from './request/history';
8
+ import { history } from '../request/history';
9
9
 
10
10
  /*----------------------------------
11
11
  - COMPONENT
@@ -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
- // Libs
8
- import useContext from '@client/context';
9
- import ClientRequest from './request';
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 Page = ({ page, isCurrent }: { page: PageResponse, isCurrent?: boolean }) => {
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 gui = useContext();
37
+ const context = useContext();
70
38
 
71
39
  const [pages, setPages] = React.useState<{
72
- current: undefined | PageResponse,
73
- //previous: undefined | PageResponse
40
+ current: undefined | Page,
41
+ //previous: undefined | Page
74
42
  }>({
75
- current: gui.page,
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
- gui.request = request;
86
- const newpage = gui.page = await router.resolve(request, gui);
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 loading state
98
- newpage.loading = <i src="spin" />
65
+ // Set.loadIndicator state
66
+ newpage.loadIndicator = <i src="spin" />
99
67
  // Add page container
100
68
  setPages( pages => {
101
69
 
102
- // Page unchanges
103
- if (pages.current?.route.path === request.path) {
104
- console.warn("Canceling navigation to the same page:", {...request});
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
- // Layout change
109
- const curLayout = pages.current?.route.options.layout;
110
- const newlayout = newpage?.route.options.layout;
111
- if (newlayout && curLayout && newlayout.path !== curLayout.path) {
112
- gui.setLayout(newlayout);
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?: PageResponse) => currentPage?.hash
132
- && document.getElementById( currentPage.hash.substring(1) )?.scrollIntoView({
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 (gui.page === undefined)
147
- resolvePage(gui.request);
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, gui);
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
- gui.page?.updateClient();
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
- <Page page={pages.current} isCurrent key={pages.current.id === undefined ? undefined : 'page_' + pages.current.id} />
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
  }