odac 0.9.0 → 1.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 (208) hide show
  1. package/.github/workflows/auto-pr-description.yml +0 -2
  2. package/.github/workflows/codeql.yml +46 -0
  3. package/.github/workflows/release.yml +13 -6
  4. package/.github/workflows/test-coverage.yml +10 -9
  5. package/.releaserc.js +9 -6
  6. package/CHANGELOG.md +62 -150
  7. package/CODE_OF_CONDUCT.md +1 -1
  8. package/CONTRIBUTING.md +8 -8
  9. package/LICENSE +21 -661
  10. package/README.md +12 -12
  11. package/SECURITY.md +4 -4
  12. package/bin/odac.js +101 -0
  13. package/{framework/web/candy.js → client/odac.js} +310 -44
  14. package/docs/backend/01-overview/{01-whats-in-the-candy-box.md → 01-whats-in-the-odac-box.md} +4 -2
  15. package/docs/backend/01-overview/02-super-handy-helper-functions.md +29 -1
  16. package/docs/backend/01-overview/03-development-server.md +11 -11
  17. package/docs/backend/02-structure/01-typical-project-layout.md +4 -4
  18. package/docs/backend/03-config/00-configuration-overview.md +6 -6
  19. package/docs/backend/03-config/01-database-connection.md +1 -1
  20. package/docs/backend/03-config/02-static-route-mapping-optional.md +4 -4
  21. package/docs/backend/03-config/04-environment-variables.md +20 -20
  22. package/docs/backend/03-config/05-early-hints.md +4 -4
  23. package/docs/backend/04-routing/01-basic-page-routes.md +4 -4
  24. package/docs/backend/04-routing/02-controller-less-view-routes.md +5 -5
  25. package/docs/backend/04-routing/03-api-and-data-routes.md +3 -3
  26. package/docs/backend/04-routing/04-authentication-aware-routes.md +5 -5
  27. package/docs/backend/04-routing/05-advanced-routing.md +3 -3
  28. package/docs/backend/04-routing/06-error-pages.md +17 -17
  29. package/docs/backend/04-routing/07-cron-jobs.md +13 -13
  30. package/docs/backend/04-routing/08-middleware.md +214 -0
  31. package/docs/backend/04-routing/09-websocket-auth-middleware.md +292 -0
  32. package/docs/backend/04-routing/09-websocket-examples.md +381 -0
  33. package/docs/backend/04-routing/09-websocket-quick-reference.md +211 -0
  34. package/docs/backend/04-routing/09-websocket.md +298 -0
  35. package/docs/backend/05-controllers/01-how-to-build-a-controller.md +3 -3
  36. package/docs/backend/05-controllers/02-your-trusty-odac-assistant.md +41 -0
  37. package/docs/backend/05-controllers/03-controller-classes.md +19 -19
  38. package/docs/backend/05-forms/01-custom-forms.md +114 -114
  39. package/docs/backend/05-forms/02-automatic-database-insert.md +82 -82
  40. package/docs/backend/06-request-and-response/01-the-request-object-what-is-the-user-asking-for.md +26 -26
  41. package/docs/backend/06-request-and-response/02-sending-a-response-replying-to-the-user.md +10 -10
  42. package/docs/backend/07-views/01-the-view-directory.md +1 -1
  43. package/docs/backend/07-views/02-rendering-a-view.md +22 -22
  44. package/docs/backend/07-views/03-template-syntax.md +52 -52
  45. package/docs/backend/07-views/03-variables.md +84 -84
  46. package/docs/backend/07-views/04-request-data.md +57 -57
  47. package/docs/backend/07-views/05-conditionals.md +78 -78
  48. package/docs/backend/07-views/06-loops.md +114 -114
  49. package/docs/backend/07-views/07-translations.md +66 -66
  50. package/docs/backend/07-views/08-backend-javascript.md +103 -103
  51. package/docs/backend/07-views/09-comments.md +71 -71
  52. package/docs/backend/08-database/01-database-connection.md +8 -8
  53. package/docs/backend/08-database/02-using-mysql.md +49 -49
  54. package/docs/backend/09-validation/01-the-validator-service.md +38 -38
  55. package/docs/backend/10-authentication/01-user-logins-with-authjs.md +15 -15
  56. package/docs/backend/10-authentication/02-foiling-villains-with-csrf-protection.md +10 -10
  57. package/docs/backend/10-authentication/03-register.md +12 -12
  58. package/docs/backend/10-authentication/{04-candy-register-forms.md → 04-odac-register-forms.md} +141 -141
  59. package/docs/backend/10-authentication/05-session-management.md +10 -10
  60. package/docs/backend/10-authentication/{06-candy-login-forms.md → 06-odac-login-forms.md} +125 -125
  61. package/docs/backend/11-mail/01-the-mail-service.md +5 -5
  62. package/docs/backend/12-streaming/01-streaming-overview.md +96 -54
  63. package/docs/backend/13-utilities/{01-candy-var.md → 01-odac-var.md} +109 -109
  64. package/docs/frontend/01-overview/01-introduction.md +30 -30
  65. package/docs/frontend/02-ajax-navigation/01-quick-start.md +45 -45
  66. package/docs/frontend/02-ajax-navigation/02-configuration.md +14 -14
  67. package/docs/frontend/02-ajax-navigation/03-advanced-usage.md +36 -36
  68. package/docs/frontend/03-forms/01-form-handling.md +32 -32
  69. package/docs/frontend/04-api-requests/01-get-post.md +33 -33
  70. package/docs/frontend/05-streaming/01-client-streaming.md +15 -15
  71. package/docs/frontend/06-websocket/00-overview.md +76 -0
  72. package/docs/frontend/06-websocket/01-websocket-client.md +139 -0
  73. package/docs/frontend/06-websocket/02-shared-websocket.md +149 -0
  74. package/docs/index.json +49 -11
  75. package/eslint.config.mjs +6 -6
  76. package/{framework/index.js → index.js} +1 -1
  77. package/package.json +14 -39
  78. package/{framework/src → src}/Auth.js +59 -59
  79. package/{framework/src → src}/Config.js +3 -3
  80. package/{framework/src → src}/Lang.js +7 -7
  81. package/{framework/src → src}/Mail.js +5 -5
  82. package/{framework/src → src}/Mysql.js +42 -42
  83. package/src/Odac.js +112 -0
  84. package/{framework/src → src}/Request.js +38 -36
  85. package/{framework/src → src}/Route/Internal.js +116 -116
  86. package/src/Route/Middleware.js +75 -0
  87. package/src/Route.js +621 -0
  88. package/src/Server.js +22 -0
  89. package/{framework/src → src}/Stream.js +11 -3
  90. package/{framework/src → src}/Validator.js +21 -21
  91. package/{framework/src → src}/Var.js +5 -5
  92. package/{framework/src → src}/View/EarlyHints.js +1 -1
  93. package/{framework/src → src}/View/Form.js +69 -69
  94. package/{framework/src → src}/View.js +78 -81
  95. package/src/WebSocket.js +403 -0
  96. package/template/config.json +5 -0
  97. package/{web → template}/controller/page/about.js +6 -6
  98. package/{web → template}/controller/page/index.js +9 -9
  99. package/{web → template}/package.json +4 -5
  100. package/{web → template}/public/assets/css/style.css +4 -4
  101. package/{web → template}/public/assets/js/app.js +6 -6
  102. package/{web → template}/route/www.js +6 -6
  103. package/{web → template}/skeleton/main.html +1 -1
  104. package/{web → template}/view/content/about.html +5 -5
  105. package/{web → template}/view/content/home.html +12 -12
  106. package/template/view/footer/main.html +11 -0
  107. package/{web → template}/view/head/main.html +1 -1
  108. package/{web → template}/view/header/main.html +2 -2
  109. package/test/core/Candy.test.js +58 -58
  110. package/test/core/Commands.test.js +7 -7
  111. package/test/core/Config.test.js +82 -85
  112. package/test/core/Lang.test.js +2 -2
  113. package/test/core/Process.test.js +6 -6
  114. package/test/framework/Route.test.js +56 -37
  115. package/test/framework/View/EarlyHints.test.js +2 -2
  116. package/test/framework/WebSocket.test.js +100 -0
  117. package/test/framework/middleware.test.js +85 -0
  118. package/test/server/Api.test.js +31 -31
  119. package/test/server/DNS.test.js +11 -11
  120. package/test/server/Hub.test.js +497 -0
  121. package/test/server/Mail.account.test_.js +3 -3
  122. package/test/server/Mail.init.test_.js +10 -10
  123. package/test/server/Mail.test_.js +20 -20
  124. package/test/server/SSL.test_.js +54 -54
  125. package/test/server/Server.test.js +39 -39
  126. package/test/server/Service.test_.js +7 -7
  127. package/test/server/Subdomain.test.js +7 -7
  128. package/test/server/Web/Firewall.test.js +87 -87
  129. package/test/server/Web/Proxy.test.js +397 -0
  130. package/test/server/{Web.test_.js → Web.test.js} +137 -205
  131. package/test/server/__mocks__/fs.js +2 -2
  132. package/test/server/__mocks__/{globalCandy.js → globalOdac.js} +5 -5
  133. package/test/server/__mocks__/index.js +6 -6
  134. package/test/server/__mocks__/testFactories.js +1 -1
  135. package/test/server/__mocks__/testHelpers.js +7 -7
  136. package/.husky/pre-commit +0 -2
  137. package/.kiro/steering/code-style.md +0 -56
  138. package/.kiro/steering/product.md +0 -20
  139. package/.kiro/steering/structure.md +0 -77
  140. package/.kiro/steering/tech.md +0 -87
  141. package/AGENTS.md +0 -84
  142. package/bin/candy +0 -10
  143. package/bin/candypack +0 -10
  144. package/cli/index.js +0 -3
  145. package/cli/src/Cli.js +0 -348
  146. package/cli/src/Connector.js +0 -93
  147. package/cli/src/Monitor.js +0 -416
  148. package/core/Candy.js +0 -87
  149. package/core/Commands.js +0 -239
  150. package/core/Config.js +0 -1094
  151. package/core/Lang.js +0 -52
  152. package/core/Log.js +0 -43
  153. package/core/Process.js +0 -26
  154. package/docs/backend/05-controllers/02-your-trusty-candy-assistant.md +0 -20
  155. package/docs/server/01-installation/01-quick-install.md +0 -19
  156. package/docs/server/01-installation/02-manual-installation-via-npm.md +0 -9
  157. package/docs/server/02-get-started/01-core-concepts.md +0 -7
  158. package/docs/server/02-get-started/02-basic-commands.md +0 -57
  159. package/docs/server/02-get-started/03-cli-reference.md +0 -276
  160. package/docs/server/02-get-started/04-cli-quick-reference.md +0 -102
  161. package/docs/server/03-service/01-start-a-new-service.md +0 -57
  162. package/docs/server/03-service/02-delete-a-service.md +0 -48
  163. package/docs/server/04-web/01-create-a-website.md +0 -36
  164. package/docs/server/04-web/02-list-websites.md +0 -9
  165. package/docs/server/04-web/03-delete-a-website.md +0 -29
  166. package/docs/server/05-subdomain/01-create-a-subdomain.md +0 -32
  167. package/docs/server/05-subdomain/02-list-subdomains.md +0 -33
  168. package/docs/server/05-subdomain/03-delete-a-subdomain.md +0 -41
  169. package/docs/server/06-ssl/01-renew-an-ssl-certificate.md +0 -34
  170. package/docs/server/07-mail/01-create-a-mail-account.md +0 -23
  171. package/docs/server/07-mail/02-delete-a-mail-account.md +0 -20
  172. package/docs/server/07-mail/03-list-mail-accounts.md +0 -20
  173. package/docs/server/07-mail/04-change-account-password.md +0 -23
  174. package/framework/src/Candy.js +0 -81
  175. package/framework/src/Route.js +0 -455
  176. package/framework/src/Server.js +0 -15
  177. package/locale/de-DE.json +0 -80
  178. package/locale/en-US.json +0 -79
  179. package/locale/es-ES.json +0 -80
  180. package/locale/fr-FR.json +0 -80
  181. package/locale/pt-BR.json +0 -80
  182. package/locale/ru-RU.json +0 -80
  183. package/locale/tr-TR.json +0 -85
  184. package/locale/zh-CN.json +0 -80
  185. package/server/index.js +0 -5
  186. package/server/src/Api.js +0 -88
  187. package/server/src/DNS.js +0 -940
  188. package/server/src/Hub.js +0 -535
  189. package/server/src/Mail.js +0 -571
  190. package/server/src/SSL.js +0 -180
  191. package/server/src/Server.js +0 -27
  192. package/server/src/Service.js +0 -248
  193. package/server/src/Subdomain.js +0 -64
  194. package/server/src/Web/Firewall.js +0 -170
  195. package/server/src/Web/Proxy.js +0 -134
  196. package/server/src/Web.js +0 -451
  197. package/server/src/mail/imap.js +0 -1091
  198. package/server/src/mail/server.js +0 -32
  199. package/server/src/mail/smtp.js +0 -786
  200. package/test/server/Client.test.js +0 -338
  201. package/test/server/__mocks__/http-proxy.js +0 -105
  202. package/watchdog/index.js +0 -3
  203. package/watchdog/src/Watchdog.js +0 -156
  204. package/web/config.json +0 -5
  205. package/web/view/footer/main.html +0 -11
  206. /package/{framework/src → src}/Env.js +0 -0
  207. /package/{framework/src → src}/Route/Cron.js +0 -0
  208. /package/{framework/src → src}/Token.js +0 -0
package/core/Commands.js DELETED
@@ -1,239 +0,0 @@
1
- require('./Candy.js')
2
-
3
- const path = require('path')
4
-
5
- module.exports = {
6
- auth: {
7
- args: ['key', '-k', '--key'],
8
- description: 'Define your server to your CandyPack account',
9
- action: async args => {
10
- const cli = Candy.cli('Cli')
11
- let key = cli.parseArg(args, ['-k', '--key']) || args[0]
12
- if (!key) key = await cli.question(__('Enter your authentication key: '))
13
-
14
- await Candy.cli('Connector').call({
15
- action: 'auth',
16
- data: [key]
17
- })
18
- }
19
- },
20
- debug: {
21
- description: 'Debug CandyPack Server',
22
- action: async () => Candy.cli('Monitor').debug()
23
- },
24
- help: {
25
- description: 'List all available commands',
26
- action: async () => Candy.cli('Cli').help()
27
- },
28
- monit: {
29
- description: 'Monitor Website or Service',
30
- action: async () => Candy.cli('Monitor').monit()
31
- },
32
- restart: {
33
- description: 'Restart CandyPack Server',
34
- action: async () => Candy.cli('Cli').boot()
35
- },
36
- run: {
37
- args: ['file'],
38
- description: 'Add a new Service',
39
- action: async args => {
40
- let service = args[0]
41
- if (!service.startsWith('/') && !/^[a-zA-Z]:\\|^\\\\/.test(service)) {
42
- service = path.resolve() + '/' + service
43
- }
44
- await Candy.cli('Connector').call({action: 'service.start', data: [service]})
45
- }
46
- },
47
-
48
- mail: {
49
- title: 'MAIL',
50
- sub: {
51
- create: {
52
- description: 'Create a new mail account',
53
- args: ['-e', '--email', '-p', '--password'],
54
- action: async args => {
55
- const cli = Candy.cli('Cli')
56
- let email = cli.parseArg(args, ['-e', '--email'])
57
- let password = cli.parseArg(args, ['-p', '--password'])
58
-
59
- if (!email) email = await cli.question(__('Enter the e-mail address: '))
60
- if (!password) password = await cli.question(__('Enter the password: '))
61
-
62
- let confirmPassword = password
63
- if (!cli.parseArg(args, ['-p', '--password'])) {
64
- confirmPassword = await cli.question(__('Re-enter the password: '))
65
- }
66
-
67
- await Candy.cli('Connector').call({
68
- action: 'mail.create',
69
- data: [email, password, confirmPassword]
70
- })
71
- }
72
- },
73
- delete: {
74
- description: 'Delete a mail account',
75
- args: ['-e', '--email'],
76
- action: async args => {
77
- const cli = Candy.cli('Cli')
78
- let email = cli.parseArg(args, ['-e', '--email'])
79
- if (!email) email = await cli.question(__('Enter the e-mail address: '))
80
-
81
- await Candy.cli('Connector').call({
82
- action: 'mail.delete',
83
- data: [email]
84
- })
85
- }
86
- },
87
- list: {
88
- description: 'List all domain mail accounts',
89
- args: ['-d', '--domain'],
90
- action: async args => {
91
- const cli = Candy.cli('Cli')
92
- let domain = cli.parseArg(args, ['-d', '--domain'])
93
- if (!domain) domain = await cli.question(__('Enter the domain name: '))
94
-
95
- await Candy.cli('Connector').call({action: 'mail.list', data: [domain]})
96
- }
97
- },
98
- password: {
99
- description: 'Change mail account password',
100
- args: ['-e', '--email', '-p', '--password'],
101
- action: async args => {
102
- const cli = Candy.cli('Cli')
103
- let email = cli.parseArg(args, ['-e', '--email'])
104
- let password = cli.parseArg(args, ['-p', '--password'])
105
-
106
- if (!email) email = await cli.question(__('Enter the e-mail address: '))
107
- if (!password) password = await cli.question(__('Enter the new password: '))
108
-
109
- let confirmPassword = password
110
- if (!cli.parseArg(args, ['-p', '--password'])) {
111
- confirmPassword = await cli.question(__('Re-enter the new password: '))
112
- }
113
-
114
- await Candy.cli('Connector').call({
115
- action: 'mail.password',
116
- data: [email, password, confirmPassword]
117
- })
118
- }
119
- }
120
- }
121
- },
122
- ssl: {
123
- title: 'SSL',
124
- sub: {
125
- renew: {
126
- description: 'Renew SSL certificate for a domain',
127
- args: ['-d', '--domain'],
128
- action: async args => {
129
- const cli = Candy.cli('Cli')
130
- let domain = cli.parseArg(args, ['-d', '--domain'])
131
- if (!domain) domain = await cli.question(__('Enter the domain name: '))
132
-
133
- await Candy.cli('Connector').call({action: 'ssl.renew', data: [domain]})
134
- }
135
- }
136
- }
137
- },
138
- service: {
139
- title: 'SERVICE',
140
- sub: {
141
- delete: {
142
- description: 'Delete a Service',
143
- args: ['-i', '--id'],
144
- action: async args => {
145
- const cli = Candy.cli('Cli')
146
- let service = cli.parseArg(args, ['-i', '--id'])
147
- if (!service) service = await cli.question(__('Enter the Service ID or Name: '))
148
- await Candy.cli('Connector').call({action: 'service.delete', data: [service]})
149
- }
150
- }
151
- }
152
- },
153
- subdomain: {
154
- title: 'SUBDOMAIN',
155
- sub: {
156
- create: {
157
- description: 'Create a new subdomain',
158
- args: ['-s', '--subdomain'],
159
- action: async args => {
160
- const cli = Candy.cli('Cli')
161
- let subdomain = cli.parseArg(args, ['-s', '--subdomain'])
162
- if (!subdomain) subdomain = await cli.question(__('Enter the subdomain name (subdomain.example.com): '))
163
-
164
- await Candy.cli('Connector').call({
165
- action: 'subdomain.create',
166
- data: [subdomain]
167
- })
168
- }
169
- },
170
- delete: {
171
- description: 'Delete a subdomain',
172
- args: ['-s', '--subdomain'],
173
- action: async args => {
174
- const cli = Candy.cli('Cli')
175
- let subdomain = cli.parseArg(args, ['-s', '--subdomain'])
176
- if (!subdomain) subdomain = await cli.question(__('Enter the subdomain name (subdomain.example.com): '))
177
-
178
- await Candy.cli('Connector').call({
179
- action: 'subdomain.delete',
180
- data: [subdomain]
181
- })
182
- }
183
- },
184
- list: {
185
- description: 'List all domain subdomains',
186
- args: ['-d', '--domain'],
187
- action: async args => {
188
- const cli = Candy.cli('Cli')
189
- let domain = cli.parseArg(args, ['-d', '--domain'])
190
- if (!domain) domain = await cli.question(__('Enter the domain name: '))
191
-
192
- await Candy.cli('Connector').call({
193
- action: 'subdomain.list',
194
- data: [domain]
195
- })
196
- }
197
- }
198
- }
199
- },
200
- web: {
201
- title: 'WEBSITE',
202
- sub: {
203
- create: {
204
- description: 'Create a new website',
205
- args: ['-d', '--domain'],
206
- action: async args => {
207
- const cli = Candy.cli('Cli')
208
- let domain = cli.parseArg(args, ['-d', '--domain'])
209
- if (!domain) {
210
- domain = await cli.question(__('Enter the domain name: '))
211
- }
212
- await Candy.cli('Connector').call({
213
- action: 'web.create',
214
- data: [domain]
215
- })
216
- }
217
- },
218
- delete: {
219
- description: 'Delete a website',
220
- args: ['-d', '--domain'],
221
- action: async args => {
222
- const cli = Candy.cli('Cli')
223
- let domain = cli.parseArg(args, ['-d', '--domain'])
224
- if (!domain) {
225
- domain = await cli.question(__('Enter the domain name: '))
226
- }
227
- await Candy.cli('Connector').call({
228
- action: 'web.delete',
229
- data: [domain]
230
- })
231
- }
232
- },
233
- list: {
234
- description: 'List all websites',
235
- action: async () => await Candy.cli('Connector').call({action: 'web.list'})
236
- }
237
- }
238
- }
239
- }