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/README.md CHANGED
@@ -1,29 +1,29 @@
1
1
  <p align="center">
2
- <img src="https://candypack.dev/assets/img/github/header.png?v=1" alt="CandyPack Header">
2
+ <img src="https://odac.run/assets/img/github/header.png?v=1" alt="Odac Header">
3
3
  </p>
4
4
 
5
- # 🍭 CandyPack
5
+ # Odac
6
6
 
7
- **CandyPack** is a lightweight yet powerful server + framework toolkit for building and deploying modern web apps with ease — with built-in automation and a developer-first philosophy.
7
+ **Odac** is a lightweight yet powerful server + framework toolkit for building and deploying modern web apps with ease — with built-in automation and a developer-first philosophy.
8
8
 
9
9
  ## ✨ Key Features
10
10
 
11
11
  ### Core Server Features
12
12
 
13
- * ⚡ **Blazing Fast & Ultra Light:** Optimized for performance, CandyPack is significantly lighter and faster than traditional server solutions, ensuring maximum performance with minimal resource usage.
14
- * 🚀 **Zero-Config Hosting:** Leave the complex server configurations to CandyPack and focus solely on your code. Get your web applications up and running in minutes.
15
- * 🌐 **One Server, Many Domains:** Easily host and manage multiple websites on a single CandyPack instance, each with its own domain and resources.
13
+ * ⚡ **Blazing Fast & Ultra Light:** Optimized for performance, Odac is significantly lighter and faster than traditional server solutions, ensuring maximum performance with minimal resource usage.
14
+ * 🚀 **Zero-Config Hosting:** Leave the complex server configurations to Odac and focus solely on your code. Get your web applications up and running in minutes.
15
+ * 🌐 **One Server, Many Domains:** Easily host and manage multiple websites on a single Odac instance, each with its own domain and resources.
16
16
  * 🔒 **SSL in Seconds:** Secure all your websites in seconds with free, auto-renewing SSL certificates.
17
17
  * 📬 **Native Mail Server:** A full-featured, built-in mail server (IMAP/SMTP) that allows you to create and manage email accounts for your domains without needing an external service.
18
18
  * ⚙️ **Process & CLI Monitor:** Keep your applications running smoothly with the integrated process manager and monitor your server from anywhere with the powerful command-line tool.
19
19
 
20
- ### Integrated Candy Framework
20
+ ### Integrated Web Framework
21
21
 
22
22
  * 🔗 **Custom URLs & Infinite Pages:** Easily create clean, custom URLs and an unlimited number of pages thanks to the powerful routing and skeleton system.
23
23
  * ✨ **No-Code AJAX:** Automatically enable AJAX for form submissions and page transitions without writing any custom JavaScript, providing your users with a seamless single-page application (SPA) experience.
24
24
  * 🛡️ **Safe Requests:** Automatically secure all your endpoints against common vulnerabilities like CSRF with built-in token verification for POST and GET requests.
25
25
  * 🔐 **Auth Made Easy:** Implement user authentication in minutes with built-in session management, password hashing, and ready-to-use login/register forms.
26
- * 🌍 **Global Ready:** Reach a worldwide audience with built-in, automatic multi-language support. The Candy Framework simplifies internationalization (i18n).
26
+ * 🌍 **Global Ready:** Reach a worldwide audience with built-in, automatic multi-language support. The framework simplifies internationalization (i18n).
27
27
  * ⏰ **Built-in Cron Jobs:** Schedule and automate recurring tasks with the integrated cron system, perfect for background jobs, data cleanup, and scheduled operations.
28
28
 
29
29
  ## 🚀 Quick Start
@@ -33,24 +33,24 @@
33
33
  #### Linux & macOS
34
34
 
35
35
  ```bash
36
- curl -sL https://candypack.dev/install | sudo bash
36
+ curl -sL https://odac.run/install | sudo bash
37
37
  ```
38
38
 
39
39
  #### Windows (PowerShell)
40
40
 
41
41
  ```powershell
42
- irm https://candypack.dev/install | iex
42
+ irm https://odac.run/install | iex
43
43
  ```
44
44
 
45
45
  This command:
46
46
 
47
47
  - Installs Node.js (v18+) if missing
48
- - Installs CandyPack globally via npm
48
+ - Installs Odac globally via npm
49
49
  - Prepares your system for development or deployment
50
50
 
51
51
  ## 📚 Documentation
52
52
 
53
- For more detailed information and API reference, please check out our [official documentation website](https://docs.candypack.dev).
53
+ For more detailed information and API reference, please check out our [official documentation website](https://docs.odac.run).
54
54
 
55
55
  ## 📄 License
56
56
 
package/SECURITY.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Supported Versions
4
4
 
5
- We are committed to ensuring the security of CandyPack. Below is a table of our currently supported versions and their security patch status.
5
+ We are committed to ensuring the security of Odac. Below is a table of our currently supported versions and their security patch status.
6
6
 
7
7
  | Version | Supported |
8
8
  | ------- | ------------------ |
@@ -12,15 +12,15 @@ We are committed to ensuring the security of CandyPack. Below is a table of our
12
12
 
13
13
  We take all security vulnerabilities seriously. Thank you for improving the security of our project. We appreciate your efforts and responsible disclosure and will make every effort to acknowledge your contributions.
14
14
 
15
- To report a security vulnerability, please send an email to **support@candypack.dev**. **Do not create a public GitHub issue.**
15
+ To report a security vulnerability, please send an email to **support@odac.run**. **Do not create a public GitHub issue.**
16
16
 
17
17
  Please include the following details with your report:
18
18
 
19
19
  - A clear description of the vulnerability.
20
- - The version of CandyPack affected.
20
+ - The version of Odac affected.
21
21
  - Steps to reproduce the vulnerability.
22
22
  - Any proof-of-concept code or screenshots.
23
23
 
24
24
  Once the vulnerability is confirmed, we will work on a patch and release it as quickly as possible.
25
25
 
26
- We look forward to working with you to make CandyPack safer for everyone.
26
+ We look forward to working with you to make Odac safer for everyone.
package/bin/odac.js ADDED
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require('node:fs')
4
+ const path = require('node:path')
5
+ const readline = require('node:readline')
6
+ const { execSync } = require('node:child_process')
7
+
8
+ const command = process.argv[2]
9
+ const args = process.argv.slice(3)
10
+
11
+ const rl = readline.createInterface({
12
+ input: process.stdin,
13
+ output: process.stdout
14
+ })
15
+
16
+ const ask = question => new Promise(resolve => rl.question(question, answer => resolve(answer.trim())))
17
+
18
+ async function run() {
19
+ if (command === 'init') {
20
+ const projectName = args[0] || '.'
21
+ const targetDir = path.resolve(process.cwd(), projectName)
22
+
23
+ // 1. Validate Target Directory
24
+ if (fs.existsSync(targetDir)) {
25
+ const files = fs.readdirSync(targetDir)
26
+ const isNotEmpty = files.some(file =>
27
+ !['.git', '.DS_Store', '.gitignore', '.idea', '.vscode'].includes(file)
28
+ )
29
+
30
+ if (isNotEmpty) {
31
+ console.error(`❌ Error: Directory "${projectName === '.' ? 'Current directory' : projectName}" is not empty.`)
32
+ console.error(' Please run in an empty directory or specify a new project name.')
33
+ process.exit(1)
34
+ }
35
+ } else {
36
+ fs.mkdirSync(targetDir, { recursive: true })
37
+ }
38
+
39
+ // 4. Copy Template
40
+ console.log(`🚀 Initializing new Odac project in: ${targetDir}`)
41
+ const templateDir = path.resolve(__dirname, '../template')
42
+
43
+ try {
44
+ // Recursive copy
45
+ fs.cpSync(templateDir, targetDir, { recursive: true })
46
+
47
+ // Update package.json
48
+ const pkgPath = path.join(targetDir, 'package.json')
49
+ const frameworkPkg = require('../package.json')
50
+
51
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'))
52
+ pkg.name = projectName === '.' ? path.basename(targetDir) : projectName
53
+ pkg.version = '0.0.1'
54
+
55
+ // Inject framework dependency
56
+ if (!pkg.dependencies) pkg.dependencies = {}
57
+ pkg.dependencies[frameworkPkg.name] = `^${frameworkPkg.version}`
58
+
59
+ fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2))
60
+
61
+ console.log('\n📦 Installing dependencies...')
62
+ try {
63
+ execSync('npm install', {
64
+ stdio: 'inherit',
65
+ cwd: targetDir
66
+ })
67
+ } catch (err) {
68
+ console.warn('⚠️ npm install failed. You might need to run it manually.')
69
+ process.exit(1)
70
+ }
71
+
72
+ console.log('\n✨ Project initialized successfully!')
73
+ console.log('\n🚀 Starting server...')
74
+
75
+ try {
76
+ execSync('npm run dev', {
77
+ stdio: 'inherit',
78
+ cwd: targetDir
79
+ })
80
+ } catch (err) {
81
+ // User probably cancelled with Ctrl+C
82
+ console.log('\n👋 Server stopped.')
83
+ }
84
+
85
+ } catch (error) {
86
+ console.error('❌ Error initializing project:', error.message)
87
+ }
88
+
89
+ } else if (command === 'dev') {
90
+ // Start the framework
91
+ require('../index.js')
92
+ } else {
93
+ console.log('Usage:')
94
+ console.log(' npx odac init (Interactive mode)')
95
+ console.log(' npx odac init <project> (Quick mode)')
96
+ }
97
+
98
+ rl.close()
99
+ }
100
+
101
+ run()