proteum 1.0.3 → 2.0.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 (184) hide show
  1. package/AGENTS.md +92 -0
  2. package/agents/codex/AGENTS.md +95 -0
  3. package/agents/codex/CODING_STYLE.md +71 -0
  4. package/agents/codex/agents.md.zip +0 -0
  5. package/agents/codex/client/AGENTS.md +102 -0
  6. package/agents/codex/client/pages/AGENTS.md +35 -0
  7. package/agents/codex/server/routes/AGENTS.md +12 -0
  8. package/agents/codex/server/services/AGENTS.md +137 -0
  9. package/agents/codex/tests/AGENTS.md +8 -0
  10. package/cli/app/config.ts +12 -17
  11. package/cli/app/index.ts +59 -99
  12. package/cli/bin.js +1 -1
  13. package/cli/commands/build.ts +23 -12
  14. package/cli/commands/check.ts +19 -0
  15. package/cli/commands/deploy/app.ts +4 -8
  16. package/cli/commands/deploy/web.ts +16 -20
  17. package/cli/commands/dev.ts +185 -75
  18. package/cli/commands/devEvents.ts +106 -0
  19. package/cli/commands/init.ts +63 -57
  20. package/cli/commands/lint.ts +21 -0
  21. package/cli/commands/refresh.ts +6 -6
  22. package/cli/commands/typecheck.ts +18 -0
  23. package/cli/compiler/client/identite.ts +79 -49
  24. package/cli/compiler/client/index.ts +132 -214
  25. package/cli/compiler/common/bundleAnalysis.ts +94 -0
  26. package/cli/compiler/common/clientManifest.ts +67 -0
  27. package/cli/compiler/common/controllers.ts +288 -0
  28. package/cli/compiler/common/files/autres.ts +7 -18
  29. package/cli/compiler/common/files/images.ts +40 -37
  30. package/cli/compiler/common/files/style.ts +12 -25
  31. package/cli/compiler/common/generatedRouteModules.ts +368 -0
  32. package/cli/compiler/common/index.ts +29 -68
  33. package/cli/compiler/common/loaders/forbid-ssr-import.js +13 -0
  34. package/cli/compiler/common/rspackAliases.ts +13 -0
  35. package/cli/compiler/common/scripts.ts +37 -0
  36. package/cli/compiler/index.ts +764 -234
  37. package/cli/compiler/server/index.ts +52 -77
  38. package/cli/compiler/writeIfChanged.ts +21 -0
  39. package/cli/index.ts +65 -90
  40. package/cli/paths.ts +51 -57
  41. package/cli/print.ts +17 -11
  42. package/cli/tsconfig.json +5 -4
  43. package/cli/utils/agents.ts +100 -0
  44. package/cli/utils/check.ts +71 -0
  45. package/cli/utils/index.ts +1 -3
  46. package/cli/utils/keyboard.ts +8 -25
  47. package/cli/utils/runProcess.ts +30 -0
  48. package/client/app/component.tsx +29 -29
  49. package/client/app/index.ts +36 -57
  50. package/client/app/service.ts +7 -12
  51. package/client/app.tsconfig.json +2 -2
  52. package/client/components/Dialog/Manager.ssr.tsx +40 -0
  53. package/client/components/Dialog/Manager.tsx +119 -150
  54. package/client/components/Dialog/status.tsx +3 -3
  55. package/client/components/index.ts +1 -1
  56. package/client/components/types.d.ts +1 -3
  57. package/client/dev/hmr.ts +65 -0
  58. package/client/global.d.ts +2 -2
  59. package/client/hooks.ts +6 -9
  60. package/client/index.ts +2 -1
  61. package/client/islands/index.ts +7 -0
  62. package/client/islands/useDeferredModule.ts +199 -0
  63. package/client/pages/_layout/index.tsx +4 -12
  64. package/client/pages/useHeader.tsx +14 -21
  65. package/client/router.ts +27 -0
  66. package/client/services/router/components/Link.tsx +34 -27
  67. package/client/services/router/components/Page.tsx +6 -14
  68. package/client/services/router/components/router.ssr.tsx +36 -0
  69. package/client/services/router/components/router.tsx +63 -83
  70. package/client/services/router/index.tsx +185 -220
  71. package/client/services/router/request/api.ts +97 -119
  72. package/client/services/router/request/history.ts +2 -2
  73. package/client/services/router/request/index.ts +13 -12
  74. package/client/services/router/request/multipart.ts +72 -62
  75. package/client/services/router/response/index.tsx +68 -61
  76. package/client/services/router/response/page.ts +28 -32
  77. package/client/utils/dom.ts +17 -33
  78. package/common/app/index.ts +3 -3
  79. package/common/data/chaines/index.ts +22 -23
  80. package/common/data/dates.ts +35 -70
  81. package/common/data/markdown.ts +42 -39
  82. package/common/dev/serverHotReload.ts +26 -0
  83. package/common/errors/index.tsx +110 -142
  84. package/common/router/contracts.ts +29 -0
  85. package/common/router/index.ts +89 -108
  86. package/common/router/layouts.ts +34 -47
  87. package/common/router/pageSetup.ts +50 -0
  88. package/common/router/register.ts +53 -24
  89. package/common/router/request/api.ts +30 -36
  90. package/common/router/request/index.ts +2 -8
  91. package/common/router/response/index.ts +8 -15
  92. package/common/router/response/page.ts +70 -58
  93. package/common/utils.ts +1 -1
  94. package/eslint.js +62 -0
  95. package/package.json +12 -45
  96. package/prettier.config.cjs +9 -0
  97. package/scripts/cleanup-generated-controllers.ts +62 -0
  98. package/scripts/fix-reference-app-typing.ts +490 -0
  99. package/scripts/refactor-client-app-imports.ts +244 -0
  100. package/scripts/refactor-client-pages.ts +587 -0
  101. package/scripts/refactor-server-controllers.ts +470 -0
  102. package/scripts/refactor-server-runtime-aliases.ts +360 -0
  103. package/scripts/restore-client-app-import-files.ts +41 -0
  104. package/scripts/restore-files-from-git-head.ts +20 -0
  105. package/scripts/update-codex-agents.ts +35 -0
  106. package/server/app/commands.ts +35 -64
  107. package/server/app/container/config.ts +39 -69
  108. package/server/app/container/console/index.ts +202 -248
  109. package/server/app/container/index.ts +33 -71
  110. package/server/app/controller/index.ts +61 -0
  111. package/server/app/index.ts +39 -105
  112. package/server/app/service/container.ts +41 -42
  113. package/server/app/service/index.ts +120 -147
  114. package/server/context.ts +1 -1
  115. package/server/index.ts +25 -1
  116. package/server/services/auth/index.ts +75 -115
  117. package/server/services/auth/router/index.ts +31 -32
  118. package/server/services/auth/router/request.ts +14 -16
  119. package/server/services/cron/CronTask.ts +13 -26
  120. package/server/services/cron/index.ts +14 -36
  121. package/server/services/disks/driver.ts +40 -58
  122. package/server/services/disks/drivers/local/index.ts +79 -90
  123. package/server/services/disks/drivers/s3/index.ts +116 -163
  124. package/server/services/disks/index.ts +23 -38
  125. package/server/services/email/index.ts +45 -104
  126. package/server/services/email/utils.ts +14 -27
  127. package/server/services/fetch/index.ts +53 -85
  128. package/server/services/prisma/Facet.ts +39 -91
  129. package/server/services/prisma/index.ts +74 -110
  130. package/server/services/router/generatedRuntime.ts +29 -0
  131. package/server/services/router/http/index.ts +77 -72
  132. package/server/services/router/http/multipart.ts +19 -42
  133. package/server/services/router/index.ts +378 -365
  134. package/server/services/router/request/api.ts +26 -25
  135. package/server/services/router/request/index.ts +44 -51
  136. package/server/services/router/request/service.ts +7 -11
  137. package/server/services/router/request/validation/zod.ts +111 -148
  138. package/server/services/router/response/index.ts +110 -125
  139. package/server/services/router/response/mask/Filter.ts +31 -72
  140. package/server/services/router/response/mask/index.ts +8 -15
  141. package/server/services/router/response/mask/selecteurs.ts +11 -25
  142. package/server/services/router/response/page/clientManifest.ts +25 -0
  143. package/server/services/router/response/page/document.tsx +199 -127
  144. package/server/services/router/response/page/index.tsx +89 -94
  145. package/server/services/router/service.ts +13 -15
  146. package/server/services/schema/index.ts +17 -26
  147. package/server/services/schema/request.ts +19 -33
  148. package/server/services/schema/router/index.ts +8 -11
  149. package/server/services/security/encrypt/aes/index.ts +15 -35
  150. package/server/utils/slug.ts +29 -32
  151. package/skills/clean-project-code/SKILL.md +63 -0
  152. package/skills/clean-project-code/agents/openai.yaml +4 -0
  153. package/tsconfig.common.json +4 -3
  154. package/tsconfig.json +4 -1
  155. package/types/aliases.d.ts +17 -21
  156. package/types/controller-input.test.ts +48 -0
  157. package/types/express-extra.d.ts +6 -0
  158. package/types/global/constants.d.ts +1 -0
  159. package/types/global/express-extra.d.ts +6 -0
  160. package/types/global/modules.d.ts +13 -16
  161. package/types/global/utils.d.ts +17 -49
  162. package/types/global/vendors.d.ts +62 -0
  163. package/types/icons.d.ts +65 -1
  164. package/types/uuid.d.ts +3 -0
  165. package/types/vendors.d.ts +62 -0
  166. package/cli/compiler/common/babel/index.ts +0 -173
  167. package/cli/compiler/common/babel/plugins/index.ts +0 -0
  168. package/cli/compiler/common/babel/plugins/services.ts +0 -586
  169. package/cli/compiler/common/babel/routes/imports.ts +0 -127
  170. package/cli/compiler/common/babel/routes/routes.ts +0 -1170
  171. package/client/services/captcha/index.ts +0 -67
  172. package/client/services/socket/index.ts +0 -147
  173. package/common/data/rte/nodes.ts +0 -83
  174. package/common/data/stats.ts +0 -90
  175. package/common/utils/rte.ts +0 -183
  176. package/server/services/auth/old.ts +0 -277
  177. package/server/services/cache/commands.ts +0 -41
  178. package/server/services/cache/index.ts +0 -297
  179. package/server/services/cache/service.json +0 -6
  180. package/server/services/socket/index.ts +0 -162
  181. package/server/services/socket/scope.ts +0 -226
  182. package/server/services/socket/service.json +0 -6
  183. package/server/services_old/SocketClient.ts +0 -92
  184. package/server/services_old/Token.old.ts +0 -97
@@ -12,12 +12,10 @@ import type { TBasicUser } from '@server/services/auth';
12
12
  - TYPES
13
13
  ----------------------------------*/
14
14
 
15
-
16
15
  /*----------------------------------
17
16
  - CONTEXT
18
17
  ----------------------------------*/
19
18
  export default abstract class BaseRequest {
20
-
21
19
  // Permet d'accèder à l'instance complète via spread
22
20
  public request: this = this;
23
21
  public url!: string;
@@ -27,9 +25,5 @@ export default abstract class BaseRequest {
27
25
  public abstract response?: Response;
28
26
  public user: TBasicUser | null = null;
29
27
 
30
- public constructor(
31
- public path: string,
32
- ) {
33
-
34
- }
35
- }
28
+ public constructor(public path: string) {}
29
+ }
@@ -2,35 +2,28 @@
2
2
  - DEPENDANCES
3
3
  ----------------------------------*/
4
4
 
5
- // Npm
6
- import { FunctionalComponent } from "preact";
7
-
8
5
  // Core
9
- import { TAnyRoute } from "..";
10
- import type ClientRequest from '@client/services/router/request';
11
- import Page from '@client/services/router/response/page'
6
+ import { TAnyRoute } from '..';
7
+ import type BaseRequest from '@common/router/request';
12
8
 
13
9
  /*----------------------------------
14
10
  - TYPES
15
11
  ----------------------------------*/
16
12
 
17
- export type TResponseData = Page
13
+ export type TResponseData = unknown;
18
14
 
19
15
  /*----------------------------------
20
16
  - CONTEXT
21
17
  ----------------------------------*/
22
18
  export default abstract class BaseResponse<
23
- TData extends TResponseData = Page,
24
- TRequest extends ClientRequest = ClientRequest
19
+ TData extends TResponseData = TResponseData,
20
+ TRequest extends BaseRequest = BaseRequest,
25
21
  > {
26
-
27
22
  public data?: TData;
28
23
  public request: TRequest;
29
24
  public route?: TAnyRoute;
30
25
 
31
- public constructor(
32
- request: TRequest,
33
- ) {
26
+ public constructor(request: TRequest) {
34
27
  // ServerResponse et ClientResponse assignent request.response
35
28
  request.response = this;
36
29
  this.request = request as TRequest;
@@ -41,5 +34,5 @@ export default abstract class BaseResponse<
41
34
  return this;
42
35
  }
43
36
 
44
- public abstract redirect(url: string, code: number);
45
- }
37
+ public abstract redirect(url: string, code?: number, absolute?: boolean): unknown;
38
+ }
@@ -7,66 +7,71 @@ import type { VNode } from 'preact';
7
7
  import type { Thing } from 'schema-dts';
8
8
 
9
9
  // Core libs
10
- import { ClientOrServerRouter, TClientOrServerContextForPage, TRoute, TErrorRoute } from '@common/router';
11
- import { TFetcherList, TDataReturnedByFetchers } from '@common/router/request/api';
10
+ import type { ClientContext } from '@/client/context';
11
+ import { ClientOrServerRouter, TErrorRoute, TPageErrorRoute, TPageRoute, TRoute } from '@common/router';
12
+ import type { TFetcher, TFetcherList } from '@common/router/request/api';
13
+ import { splitRouteSetupResult } from '@common/router/pageSetup';
12
14
 
13
15
  /*----------------------------------
14
16
  - TYPES
15
17
  ----------------------------------*/
16
18
 
17
- // The function that fetch data from the api before to pass them as context to the renderer
18
- export type TDataProvider<TProvidedData extends TFetcherList = TFetcherList> = (
19
- context: TClientOrServerContextForPage & {
19
+ export type TPageSetupContext = ClientContext;
20
+
21
+ export type TPageRenderContext = With<ClientContext, 'page'>;
22
+
23
+ export type TResolvedPageData<TProvidedData extends {} = {}> = {
24
+ [Property in keyof TProvidedData]: TProvidedData[Property] extends TFetcher<infer TData>
25
+ ? TData
26
+ : Awaited<TProvidedData[Property]>;
27
+ };
28
+
29
+ // The function that prepares route config and SSR data before rendering.
30
+ export type TPageSetup<TProvidedData extends {} = {}> = (
31
+ context: TPageSetupContext & {
20
32
  // URL query parameters
21
33
  // TODO: typings
22
- data: {[key: string]: string | number}
23
- }
24
- ) => TProvidedData
34
+ data: { [key: string]: string | number };
35
+ },
36
+ ) => TProvidedData;
37
+
38
+ export type TDataProvider<TProvidedData extends {} = TFetcherList> = (
39
+ context: TPageSetupContext & { data: { [key: string]: PrimitiveValue } },
40
+ ) => TProvidedData;
25
41
 
26
42
  // The function that renders routes
27
43
  export type TFrontRenderer<
28
- TProvidedData extends TFetcherList = TFetcherList,
44
+ TProvidedData extends {} = {},
29
45
  TAdditionnalData extends {} = {},
30
46
  TRouter = ClientOrServerRouter,
31
- > = (
32
- context: (
33
- TClientOrServerContextForPage
34
- &
35
- TAdditionnalData
36
- &
37
- {
38
- context: TClientOrServerContextForPage,
39
- data: {[key: string]: PrimitiveValue}
40
- }
41
- )
42
- ) => VNode<any> | null
47
+ > = (
48
+ context: TPageRenderContext &
49
+ TResolvedPageData<TProvidedData> &
50
+ TAdditionnalData & { context: TPageRenderContext; data: { [key: string]: PrimitiveValue } },
51
+ ) => VNode<any> | null;
43
52
 
44
53
  // Script or CSS resource
45
- export type TPageResource = {
46
- id: string,
47
- attrs?: TObjetDonnees
48
- } & ({
49
- inline: string
50
- } | {
51
- url: string,
52
- preload?: boolean
53
- })
54
-
55
- type TMetasDict = {
56
- [key: string]: string | Date | undefined | null
57
- }
54
+ export type TPageResource = { id: string; attrs?: TObjetDonnees } & (
55
+ | { inline: string }
56
+ | { url: string; preload?: boolean }
57
+ );
58
58
 
59
- type TMetasList = ({ $: string } & TMetasDict)[]
59
+ type TMetasDict = { [key: string]: string | Date | undefined | null };
60
+
61
+ type TMetasList = ({ $: string } & TMetasDict)[];
60
62
 
61
63
  const debug = false;
62
64
 
63
65
  /*----------------------------------
64
66
  - CLASS
65
67
  ----------------------------------*/
66
- export default abstract class PageResponse<TRouter extends ClientOrServerRouter = ClientOrServerRouter> {
67
-
68
+ export default abstract class PageResponse<
69
+ TRouter extends ClientOrServerRouter = ClientOrServerRouter,
70
+ TRouteLike extends TRoute | TErrorRoute = TPageRoute | TPageErrorRoute,
71
+ TContext extends TPageRenderContext = TPageRenderContext,
72
+ > {
68
73
  // Metadata
69
- public chunkId: string;
74
+ public chunkId?: string;
70
75
  public title?: string;
71
76
  public description?: string;
72
77
  public bodyClass: Set<string> = new Set<string>();
@@ -79,50 +84,57 @@ export default abstract class PageResponse<TRouter extends ClientOrServerRouter
79
84
  public jsonld: Thing[] = [];
80
85
  public scripts: TPageResource[] = [];
81
86
  public style: TPageResource[] = [];
87
+ public layout?: { data?: TDataProvider };
82
88
 
83
89
  // Data
84
90
  public fetchers: TFetcherList = {};
85
91
  public data: TObjetDonnees = {};
86
92
 
87
93
  public constructor(
88
- public route: TRoute | TErrorRoute,
94
+ public route: TRouteLike,
89
95
  public renderer: TFrontRenderer,
90
- public context: TClientOrServerContextForPage
96
+ public context: TContext,
91
97
  ) {
92
-
93
- this.chunkId = context.route.options["id"];
98
+ this.chunkId = context.route.options.id;
94
99
 
95
100
  this.url = context.request.url;
96
-
97
- this.fetchers = this.createFetchers(route.options.data);
98
-
99
101
  }
100
102
 
101
- private createFetchers( dataProvider?: TDataProvider ) {
103
+ private resolveSetup() {
104
+ const setup = this.route.options.setup;
105
+ if (!setup) return { options: {}, data: {} };
102
106
 
103
- // Load the fetchers list to load data if needed
104
- if (dataProvider)
105
- return dataProvider({
106
- ...this.context,
107
- data: this.context.request.data
108
- });
109
- else
110
- return {}
107
+ const setupContext = { ...this.context, data: this.context.request.data } as Parameters<typeof setup>[0];
111
108
 
109
+ return splitRouteSetupResult(setup(setupContext) || {});
112
110
  }
113
-
111
+
112
+ private createFetchers() {
113
+ const { options, data } = this.resolveSetup();
114
+ this.route.options = { ...this.route.options, ...options };
115
+ this.chunkId = this.route.options.id;
116
+
117
+ return data as TFetcherList;
118
+ }
119
+
114
120
  public async fetchData() {
121
+ this.fetchers = this.createFetchers();
122
+ this.bodyId = this.route.options.bodyId;
115
123
 
116
124
  // Fetch layout data
117
125
  if (this.layout?.data) {
118
- const fetchers = this.createFetchers(this.layout.data);
126
+ const layoutContext = {
127
+ ...this.context,
128
+ data: this.context.request.data,
129
+ } as Parameters<typeof this.layout.data>[0];
130
+ const fetchers = this.layout.data(layoutContext);
119
131
  this.fetchers = { ...this.fetchers, ...fetchers };
120
132
  }
121
133
 
122
134
  // Fetch page data
123
135
  debug && console.log(`[router][page] Fetching api data:` + Object.keys(this.fetchers));
124
- this.data = await this.context.request.api.fetchSync( this.fetchers, this.data );
136
+ this.data = await this.context.request.api.fetchSync(this.fetchers, this.data);
125
137
 
126
138
  return this.data;
127
139
  }
128
- }
140
+ }
package/common/utils.ts CHANGED
@@ -4,4 +4,4 @@
4
4
  * @param seconds The number of seconds to wait
5
5
  * @returns A void promise
6
6
  */
7
- export const seconds = (seconds: number) => new Promise((resolve) => setTimeout(resolve, seconds * 1000));
7
+ export const seconds = (seconds: number) => new Promise((resolve) => setTimeout(resolve, seconds * 1000));
package/eslint.js ADDED
@@ -0,0 +1,62 @@
1
+ const tseslint = require('typescript-eslint');
2
+ const reactPlugin = require('eslint-plugin-react');
3
+ const reactHooksPlugin = require('eslint-plugin-react-hooks');
4
+ const jsxA11yPlugin = require('eslint-plugin-jsx-a11y');
5
+
6
+ const defaultIgnores = [
7
+ '**/node_modules/**',
8
+ '**/bin/**',
9
+ '**/bin-dev/**',
10
+ '**/.generated/**',
11
+ '**/var/**',
12
+ ];
13
+
14
+ const createDoubleAssertionSelector = (typeKeyword) =>
15
+ `TSAsExpression[expression.type='TSAsExpression'][expression.typeAnnotation.type='${typeKeyword}']`;
16
+
17
+ const createProteumEslintConfig = ({ ignores = [] } = {}) => [
18
+ {
19
+ ignores: [...defaultIgnores, ...ignores],
20
+ },
21
+ {
22
+ linterOptions: {
23
+ reportUnusedDisableDirectives: 'off',
24
+ },
25
+ },
26
+ {
27
+ files: ['**/*.{ts,tsx,mts,cts}'],
28
+ languageOptions: {
29
+ parser: tseslint.parser,
30
+ parserOptions: {
31
+ ecmaVersion: 'latest',
32
+ sourceType: 'module',
33
+ ecmaFeatures: {
34
+ jsx: true,
35
+ },
36
+ },
37
+ },
38
+ plugins: {
39
+ '@typescript-eslint': tseslint.plugin,
40
+ react: reactPlugin,
41
+ 'react-hooks': reactHooksPlugin,
42
+ 'jsx-a11y': jsxA11yPlugin,
43
+ },
44
+ rules: {
45
+ 'no-restricted-syntax': [
46
+ 'error',
47
+ {
48
+ selector: createDoubleAssertionSelector('TSUnknownKeyword'),
49
+ message: 'Do not use double assertions through `unknown`.',
50
+ },
51
+ {
52
+ selector: createDoubleAssertionSelector('TSAnyKeyword'),
53
+ message: 'Do not use double assertions through `any`.',
54
+ },
55
+ ],
56
+ },
57
+ },
58
+ ];
59
+
60
+ module.exports = {
61
+ createProteumEslintConfig,
62
+ };
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "proteum",
3
- "description": "Convenient TypeScript framework designed for Performance and Productivity.",
4
- "version": "1.0.3",
3
+ "description": "AI-first SSR, SEO, and TypeScript framework optimized for autonomous agent development.",
4
+ "version": "2.0.0",
5
5
  "author": "Gaetan Le Gac (https://github.com/gaetanlegac)",
6
6
  "repository": "git://github.com/gaetanlegac/proteum.git",
7
7
  "license": "MIT",
8
8
  "engines": {
9
- "node": ">=16.1.0",
9
+ "node": ">=20.19.0",
10
10
  "npm": ">=3.10.10"
11
11
  },
12
12
  "keywords": [
@@ -16,42 +16,26 @@
16
16
  "proteum": "cli/bin.js"
17
17
  },
18
18
  "dependencies": {
19
- "@babel/cli": "^7.15.4",
20
- "@babel/plugin-proposal-class-properties": "^7.14.5",
21
- "@babel/plugin-proposal-decorators": "^7.25.9",
22
- "@babel/plugin-proposal-private-methods": "^7.14.5",
23
- "@babel/plugin-proposal-private-property-in-object": "^7.15.4",
24
- "@babel/plugin-transform-react-constant-elements": "^7.14.5",
25
- "@babel/preset-env": "^7.15.6",
26
- "@babel/preset-react": "^7.14.5",
27
- "@babel/preset-typescript": "^7.15.0",
28
- "@prefresh/webpack": "^3.3.2",
29
19
  "@prisma/client": "^6.5.0",
20
+ "@rspack/core": "^1.7.9",
30
21
  "@tailwindcss/postcss": "^4.1.17",
31
22
  "accepts": "^1.3.7",
32
23
  "ansi-to-html": "^0.7.1",
33
24
  "autoprefixer": "^10.4.21",
34
25
  "aws-sdk": "^2.1415.0",
35
- "babel-loader": "^10.0.0",
36
- "babel-plugin-glob-import": "^0.0.9-1",
37
- "babel-plugin-transform-imports": "^2.0.0",
38
- "babel-plugin-transform-react-remove-prop-types": "^0.4.24",
39
- "babel-plugin-transform-remove-console": "^6.9.4",
40
26
  "bowser": "^2.11.0",
41
- "brotli-webpack-plugin": "^1.1.0",
42
- "browser-sync": "^2.27.5",
43
27
  "cli-highlight": "^2.1.11",
44
28
  "compression": "^1.7.4",
45
- "compression-webpack-plugin": "^8.0.1",
46
29
  "cookie-parser": "^1.4.5",
47
- "core-js": "^3.18.1",
48
30
  "cors": "^2.8.5",
49
31
  "cron-parser": "^4.0.0",
50
32
  "css-loader": "^6.2.0",
51
- "css-minimizer-webpack-plugin": "^7.0.4",
52
33
  "dayjs": "^1.11.5",
53
- "dottie": "^2.0.2",
54
34
  "escape-regexp": "^0.0.1",
35
+ "eslint": "^9.39.4",
36
+ "eslint-plugin-jsx-a11y": "^6.10.2",
37
+ "eslint-plugin-react": "^7.37.5",
38
+ "eslint-plugin-react-hooks": "^7.0.1",
55
39
  "express": "^4.17.1",
56
40
  "express-csp-header": "^5.0.0",
57
41
  "express-fileupload": "^1.2.1",
@@ -63,34 +47,23 @@
63
47
  "history": "^5.0.1",
64
48
  "hpp": "^0.2.3",
65
49
  "human-interval": "^2.0.1",
66
- "image-minimizer-webpack-plugin": "^4.1.4",
67
- "imagemin": "^9.0.1",
68
- "imagemin-svgo": "^10.0.0",
69
- "imagemin-webp": "^6.0.0",
70
50
  "intl": "^1.2.5",
71
51
  "iso-639-1": "^2.1.9",
72
- "json5": "^2.2.0",
73
52
  "jsonwebtoken": "^8.5.1",
74
53
  "less-loader": "^10.0.1",
75
- "load-script": "^2.0.0",
76
54
  "locale": "^0.1.0",
77
55
  "markdown-it": "^13.0.1",
78
56
  "md5": "^2.3.0",
79
57
  "mime-types": "^2.1.35",
80
- "mini-css-extract-plugin": "^2.2.2",
81
58
  "module-alias": "^2.2.2",
82
59
  "mysql2": "^2.3.0",
83
60
  "node-cmd": "^5.0.0",
84
61
  "null-loader": "^4.0.1",
85
- "object-sizeof": "^1.6.3",
86
62
  "path-to-regexp": "^6.2.0",
87
63
  "postcss-loader": "^8.2.0",
88
64
  "preact": "^10.27.1",
89
65
  "preact-render-to-string": "^6.6.1",
90
- "prettier": "^3.3.3",
91
66
  "prompts": "^2.4.2",
92
- "react-dev-utils": "^11.0.4",
93
- "regenerator-runtime": "^0.13.9",
94
67
  "replace-once": "^1.0.0",
95
68
  "request": "^2.88.2",
96
69
  "responsive-loader": "^3.1.2",
@@ -99,17 +72,15 @@
99
72
  "slugify": "^1.6.6",
100
73
  "source-map-support": "^0.5.21",
101
74
  "stopword": "^3.1.1",
75
+ "style-loader": "^4.0.0",
102
76
  "tailwindcss": "^4.1.17",
103
- "terser-webpack-plugin": "^5.2.4",
104
77
  "ts-alias": "^0.0.7",
105
78
  "ts-node": "^10.9.1",
106
79
  "tslog": "^4.9.1",
80
+ "typescript": "^5.9.3",
81
+ "typescript-eslint": "^8.57.1",
107
82
  "uuid": "^8.3.2",
108
83
  "validator": "^13.7.0",
109
- "webpack": "^5.104.1",
110
- "webpack-assets-manifest": "^5.0.6",
111
- "webpack-bundle-analyzer": "^4.4.2",
112
- "ws": "^8.2.2",
113
84
  "yaml": "^1.10.2",
114
85
  "yargs-parser": "^21.1.1",
115
86
  "youch": "^3.3.3",
@@ -117,8 +88,6 @@
117
88
  "zod": "^4.1.5"
118
89
  },
119
90
  "devDependencies": {
120
- "@types/babel__core": "^7.1.16",
121
- "@types/babel__preset-env": "^7.9.6",
122
91
  "@types/cookie": "^0.4.1",
123
92
  "@types/express": "^4.17.13",
124
93
  "@types/favicons": "^6.2.2",
@@ -132,10 +101,8 @@
132
101
  "@types/prompts": "^2.0.14",
133
102
  "@types/sharp": "^0.31.1",
134
103
  "@types/universal-analytics": "^0.4.5",
135
- "@types/webpack-env": "^1.16.2",
136
- "@types/ws": "^7.4.7",
137
104
  "@types/yargs-parser": "^21.0.0",
138
105
  "schema-dts": "^1.1.2",
139
- "speed-measure-webpack-v5-plugin": "^1.5.2"
106
+ "webpack-bundle-analyzer": "^5.2.0"
140
107
  }
141
108
  }
@@ -0,0 +1,9 @@
1
+ module.exports = {
2
+ tabWidth: 4,
3
+ printWidth: 120,
4
+ singleQuote: true,
5
+ jsxSingleQuote: false,
6
+ semi: true,
7
+ trailingComma: 'all',
8
+ objectWrap: 'preserve',
9
+ };
@@ -0,0 +1,62 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+
4
+ const findControllerFiles = (dir: string): string[] => {
5
+ if (!fs.existsSync(dir)) return [];
6
+
7
+ const files: string[] = [];
8
+
9
+ for (const dirent of fs.readdirSync(dir, { withFileTypes: true })) {
10
+ const filepath = path.join(dir, dirent.name);
11
+
12
+ if (dirent.isDirectory()) {
13
+ files.push(...findControllerFiles(filepath));
14
+ continue;
15
+ }
16
+
17
+ if (dirent.isFile() && dirent.name.endsWith('.controller.ts')) files.push(filepath);
18
+ }
19
+
20
+ return files;
21
+ };
22
+
23
+ const repoRoots = process.argv.slice(2);
24
+ if (!repoRoots.length)
25
+ throw new Error('Usage: ts-node scripts/cleanup-generated-controllers.ts <repo-root> [repo-root...]');
26
+
27
+ for (const repoRoot of repoRoots) {
28
+ const controllerFiles = findControllerFiles(path.join(repoRoot, 'server', 'services'));
29
+ let updated = 0;
30
+
31
+ for (const controllerFile of controllerFiles) {
32
+ let content = fs.readFileSync(controllerFile, 'utf8');
33
+ let changed = false;
34
+
35
+ if (
36
+ content.includes('this.input(schema.') &&
37
+ content.includes("import Controller from '@server/app/controller';")
38
+ ) {
39
+ content = content.replace(
40
+ "import Controller from '@server/app/controller';",
41
+ "import Controller, { schema } from '@server/app/controller';",
42
+ );
43
+ changed = true;
44
+ }
45
+
46
+ if (content.includes('export default class indexController extends Controller')) {
47
+ const parentName = path.basename(path.dirname(controllerFile)).replace(/[^A-Za-z0-9_$]/g, '');
48
+ content = content.replace(
49
+ 'export default class indexController extends Controller',
50
+ `export default class ${parentName || 'Generated'}Controller extends Controller`,
51
+ );
52
+ changed = true;
53
+ }
54
+
55
+ if (!changed) continue;
56
+
57
+ fs.writeFileSync(controllerFile, content);
58
+ updated++;
59
+ }
60
+
61
+ console.log(`[cleanup-generated-controllers] ${repoRoot}: updated ${updated} controller files`);
62
+ }