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.
- package/.github/workflows/auto-pr-description.yml +0 -2
- package/.github/workflows/codeql.yml +46 -0
- package/.github/workflows/release.yml +13 -6
- package/.github/workflows/test-coverage.yml +10 -9
- package/.releaserc.js +9 -6
- package/CHANGELOG.md +62 -150
- package/CODE_OF_CONDUCT.md +1 -1
- package/CONTRIBUTING.md +8 -8
- package/LICENSE +21 -661
- package/README.md +12 -12
- package/SECURITY.md +4 -4
- package/bin/odac.js +101 -0
- package/{framework/web/candy.js → client/odac.js} +310 -44
- package/docs/backend/01-overview/{01-whats-in-the-candy-box.md → 01-whats-in-the-odac-box.md} +4 -2
- package/docs/backend/01-overview/02-super-handy-helper-functions.md +29 -1
- package/docs/backend/01-overview/03-development-server.md +11 -11
- package/docs/backend/02-structure/01-typical-project-layout.md +4 -4
- package/docs/backend/03-config/00-configuration-overview.md +6 -6
- package/docs/backend/03-config/01-database-connection.md +1 -1
- package/docs/backend/03-config/02-static-route-mapping-optional.md +4 -4
- package/docs/backend/03-config/04-environment-variables.md +20 -20
- package/docs/backend/03-config/05-early-hints.md +4 -4
- package/docs/backend/04-routing/01-basic-page-routes.md +4 -4
- package/docs/backend/04-routing/02-controller-less-view-routes.md +5 -5
- package/docs/backend/04-routing/03-api-and-data-routes.md +3 -3
- package/docs/backend/04-routing/04-authentication-aware-routes.md +5 -5
- package/docs/backend/04-routing/05-advanced-routing.md +3 -3
- package/docs/backend/04-routing/06-error-pages.md +17 -17
- package/docs/backend/04-routing/07-cron-jobs.md +13 -13
- package/docs/backend/04-routing/08-middleware.md +214 -0
- package/docs/backend/04-routing/09-websocket-auth-middleware.md +292 -0
- package/docs/backend/04-routing/09-websocket-examples.md +381 -0
- package/docs/backend/04-routing/09-websocket-quick-reference.md +211 -0
- package/docs/backend/04-routing/09-websocket.md +298 -0
- package/docs/backend/05-controllers/01-how-to-build-a-controller.md +3 -3
- package/docs/backend/05-controllers/02-your-trusty-odac-assistant.md +41 -0
- package/docs/backend/05-controllers/03-controller-classes.md +19 -19
- package/docs/backend/05-forms/01-custom-forms.md +114 -114
- package/docs/backend/05-forms/02-automatic-database-insert.md +82 -82
- package/docs/backend/06-request-and-response/01-the-request-object-what-is-the-user-asking-for.md +26 -26
- package/docs/backend/06-request-and-response/02-sending-a-response-replying-to-the-user.md +10 -10
- package/docs/backend/07-views/01-the-view-directory.md +1 -1
- package/docs/backend/07-views/02-rendering-a-view.md +22 -22
- package/docs/backend/07-views/03-template-syntax.md +52 -52
- package/docs/backend/07-views/03-variables.md +84 -84
- package/docs/backend/07-views/04-request-data.md +57 -57
- package/docs/backend/07-views/05-conditionals.md +78 -78
- package/docs/backend/07-views/06-loops.md +114 -114
- package/docs/backend/07-views/07-translations.md +66 -66
- package/docs/backend/07-views/08-backend-javascript.md +103 -103
- package/docs/backend/07-views/09-comments.md +71 -71
- package/docs/backend/08-database/01-database-connection.md +8 -8
- package/docs/backend/08-database/02-using-mysql.md +49 -49
- package/docs/backend/09-validation/01-the-validator-service.md +38 -38
- package/docs/backend/10-authentication/01-user-logins-with-authjs.md +15 -15
- package/docs/backend/10-authentication/02-foiling-villains-with-csrf-protection.md +10 -10
- package/docs/backend/10-authentication/03-register.md +12 -12
- package/docs/backend/10-authentication/{04-candy-register-forms.md → 04-odac-register-forms.md} +141 -141
- package/docs/backend/10-authentication/05-session-management.md +10 -10
- package/docs/backend/10-authentication/{06-candy-login-forms.md → 06-odac-login-forms.md} +125 -125
- package/docs/backend/11-mail/01-the-mail-service.md +5 -5
- package/docs/backend/12-streaming/01-streaming-overview.md +96 -54
- package/docs/backend/13-utilities/{01-candy-var.md → 01-odac-var.md} +109 -109
- package/docs/frontend/01-overview/01-introduction.md +30 -30
- package/docs/frontend/02-ajax-navigation/01-quick-start.md +45 -45
- package/docs/frontend/02-ajax-navigation/02-configuration.md +14 -14
- package/docs/frontend/02-ajax-navigation/03-advanced-usage.md +36 -36
- package/docs/frontend/03-forms/01-form-handling.md +32 -32
- package/docs/frontend/04-api-requests/01-get-post.md +33 -33
- package/docs/frontend/05-streaming/01-client-streaming.md +15 -15
- package/docs/frontend/06-websocket/00-overview.md +76 -0
- package/docs/frontend/06-websocket/01-websocket-client.md +139 -0
- package/docs/frontend/06-websocket/02-shared-websocket.md +149 -0
- package/docs/index.json +49 -11
- package/eslint.config.mjs +6 -6
- package/{framework/index.js → index.js} +1 -1
- package/package.json +14 -39
- package/{framework/src → src}/Auth.js +59 -59
- package/{framework/src → src}/Config.js +3 -3
- package/{framework/src → src}/Lang.js +7 -7
- package/{framework/src → src}/Mail.js +5 -5
- package/{framework/src → src}/Mysql.js +42 -42
- package/src/Odac.js +112 -0
- package/{framework/src → src}/Request.js +38 -36
- package/{framework/src → src}/Route/Internal.js +116 -116
- package/src/Route/Middleware.js +75 -0
- package/src/Route.js +621 -0
- package/src/Server.js +22 -0
- package/{framework/src → src}/Stream.js +11 -3
- package/{framework/src → src}/Validator.js +21 -21
- package/{framework/src → src}/Var.js +5 -5
- package/{framework/src → src}/View/EarlyHints.js +1 -1
- package/{framework/src → src}/View/Form.js +69 -69
- package/{framework/src → src}/View.js +78 -81
- package/src/WebSocket.js +403 -0
- package/template/config.json +5 -0
- package/{web → template}/controller/page/about.js +6 -6
- package/{web → template}/controller/page/index.js +9 -9
- package/{web → template}/package.json +4 -5
- package/{web → template}/public/assets/css/style.css +4 -4
- package/{web → template}/public/assets/js/app.js +6 -6
- package/{web → template}/route/www.js +6 -6
- package/{web → template}/skeleton/main.html +1 -1
- package/{web → template}/view/content/about.html +5 -5
- package/{web → template}/view/content/home.html +12 -12
- package/template/view/footer/main.html +11 -0
- package/{web → template}/view/head/main.html +1 -1
- package/{web → template}/view/header/main.html +2 -2
- package/test/core/Candy.test.js +58 -58
- package/test/core/Commands.test.js +7 -7
- package/test/core/Config.test.js +82 -85
- package/test/core/Lang.test.js +2 -2
- package/test/core/Process.test.js +6 -6
- package/test/framework/Route.test.js +56 -37
- package/test/framework/View/EarlyHints.test.js +2 -2
- package/test/framework/WebSocket.test.js +100 -0
- package/test/framework/middleware.test.js +85 -0
- package/test/server/Api.test.js +31 -31
- package/test/server/DNS.test.js +11 -11
- package/test/server/Hub.test.js +497 -0
- package/test/server/Mail.account.test_.js +3 -3
- package/test/server/Mail.init.test_.js +10 -10
- package/test/server/Mail.test_.js +20 -20
- package/test/server/SSL.test_.js +54 -54
- package/test/server/Server.test.js +39 -39
- package/test/server/Service.test_.js +7 -7
- package/test/server/Subdomain.test.js +7 -7
- package/test/server/Web/Firewall.test.js +87 -87
- package/test/server/Web/Proxy.test.js +397 -0
- package/test/server/{Web.test_.js → Web.test.js} +137 -205
- package/test/server/__mocks__/fs.js +2 -2
- package/test/server/__mocks__/{globalCandy.js → globalOdac.js} +5 -5
- package/test/server/__mocks__/index.js +6 -6
- package/test/server/__mocks__/testFactories.js +1 -1
- package/test/server/__mocks__/testHelpers.js +7 -7
- package/.husky/pre-commit +0 -2
- package/.kiro/steering/code-style.md +0 -56
- package/.kiro/steering/product.md +0 -20
- package/.kiro/steering/structure.md +0 -77
- package/.kiro/steering/tech.md +0 -87
- package/AGENTS.md +0 -84
- package/bin/candy +0 -10
- package/bin/candypack +0 -10
- package/cli/index.js +0 -3
- package/cli/src/Cli.js +0 -348
- package/cli/src/Connector.js +0 -93
- package/cli/src/Monitor.js +0 -416
- package/core/Candy.js +0 -87
- package/core/Commands.js +0 -239
- package/core/Config.js +0 -1094
- package/core/Lang.js +0 -52
- package/core/Log.js +0 -43
- package/core/Process.js +0 -26
- package/docs/backend/05-controllers/02-your-trusty-candy-assistant.md +0 -20
- package/docs/server/01-installation/01-quick-install.md +0 -19
- package/docs/server/01-installation/02-manual-installation-via-npm.md +0 -9
- package/docs/server/02-get-started/01-core-concepts.md +0 -7
- package/docs/server/02-get-started/02-basic-commands.md +0 -57
- package/docs/server/02-get-started/03-cli-reference.md +0 -276
- package/docs/server/02-get-started/04-cli-quick-reference.md +0 -102
- package/docs/server/03-service/01-start-a-new-service.md +0 -57
- package/docs/server/03-service/02-delete-a-service.md +0 -48
- package/docs/server/04-web/01-create-a-website.md +0 -36
- package/docs/server/04-web/02-list-websites.md +0 -9
- package/docs/server/04-web/03-delete-a-website.md +0 -29
- package/docs/server/05-subdomain/01-create-a-subdomain.md +0 -32
- package/docs/server/05-subdomain/02-list-subdomains.md +0 -33
- package/docs/server/05-subdomain/03-delete-a-subdomain.md +0 -41
- package/docs/server/06-ssl/01-renew-an-ssl-certificate.md +0 -34
- package/docs/server/07-mail/01-create-a-mail-account.md +0 -23
- package/docs/server/07-mail/02-delete-a-mail-account.md +0 -20
- package/docs/server/07-mail/03-list-mail-accounts.md +0 -20
- package/docs/server/07-mail/04-change-account-password.md +0 -23
- package/framework/src/Candy.js +0 -81
- package/framework/src/Route.js +0 -455
- package/framework/src/Server.js +0 -15
- package/locale/de-DE.json +0 -80
- package/locale/en-US.json +0 -79
- package/locale/es-ES.json +0 -80
- package/locale/fr-FR.json +0 -80
- package/locale/pt-BR.json +0 -80
- package/locale/ru-RU.json +0 -80
- package/locale/tr-TR.json +0 -85
- package/locale/zh-CN.json +0 -80
- package/server/index.js +0 -5
- package/server/src/Api.js +0 -88
- package/server/src/DNS.js +0 -940
- package/server/src/Hub.js +0 -535
- package/server/src/Mail.js +0 -571
- package/server/src/SSL.js +0 -180
- package/server/src/Server.js +0 -27
- package/server/src/Service.js +0 -248
- package/server/src/Subdomain.js +0 -64
- package/server/src/Web/Firewall.js +0 -170
- package/server/src/Web/Proxy.js +0 -134
- package/server/src/Web.js +0 -451
- package/server/src/mail/imap.js +0 -1091
- package/server/src/mail/server.js +0 -32
- package/server/src/mail/smtp.js +0 -786
- package/test/server/Client.test.js +0 -338
- package/test/server/__mocks__/http-proxy.js +0 -105
- package/watchdog/index.js +0 -3
- package/watchdog/src/Watchdog.js +0 -156
- package/web/config.json +0 -5
- package/web/view/footer/main.html +0 -11
- /package/{framework/src → src}/Env.js +0 -0
- /package/{framework/src → src}/Route/Cron.js +0 -0
- /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://
|
|
2
|
+
<img src="https://odac.run/assets/img/github/header.png?v=1" alt="Odac Header">
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
|
-
#
|
|
5
|
+
# ⚡ Odac
|
|
6
6
|
|
|
7
|
-
**
|
|
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,
|
|
14
|
-
* 🚀 **Zero-Config Hosting:** Leave the complex server configurations to
|
|
15
|
-
* 🌐 **One Server, Many Domains:** Easily host and manage multiple websites on a single
|
|
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
|
|
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
|
|
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://
|
|
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://
|
|
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
|
|
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.
|
|
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
|
|
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@
|
|
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
|
|
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
|
|
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()
|