odac 1.1.0 → 1.3.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/.agent/rules/coding.md +27 -0
- package/.agent/rules/memory.md +42 -0
- package/.agent/rules/project.md +30 -0
- package/.agent/rules/workflow.md +16 -0
- package/.github/workflows/release.yml +68 -1
- package/.github/workflows/test-coverage.yml +6 -5
- package/.husky/pre-commit +10 -0
- package/.husky/pre-push +13 -0
- package/.releaserc.js +1 -1
- package/CHANGELOG.md +99 -0
- package/README.md +16 -0
- package/bin/odac.js +196 -38
- package/client/odac.js +238 -171
- package/docs/backend/01-overview/03-development-server.md +38 -45
- package/docs/backend/02-structure/01-typical-project-layout.md +59 -26
- package/docs/backend/03-config/00-configuration-overview.md +6 -6
- package/docs/backend/03-config/01-database-connection.md +2 -2
- package/docs/backend/03-config/02-static-route-mapping-optional.md +1 -1
- package/docs/backend/03-config/03-request-timeout.md +1 -1
- package/docs/backend/03-config/04-environment-variables.md +4 -4
- package/docs/backend/03-config/05-early-hints.md +2 -2
- package/docs/backend/04-routing/03-api-and-data-routes.md +18 -0
- package/docs/backend/04-routing/07-cron-jobs.md +17 -1
- package/docs/backend/04-routing/09-websocket.md +14 -1
- package/docs/backend/05-controllers/01-how-to-build-a-controller.md +48 -3
- package/docs/backend/05-controllers/03-controller-classes.md +40 -20
- package/docs/backend/06-request-and-response/01-the-request-object-what-is-the-user-asking-for.md +17 -0
- package/docs/backend/07-views/10-styling-and-tailwind.md +93 -0
- package/docs/backend/08-database/01-getting-started.md +2 -2
- package/docs/backend/10-authentication/03-register.md +1 -1
- package/docs/backend/10-authentication/04-odac-register-forms.md +2 -2
- package/docs/backend/10-authentication/05-session-management.md +15 -1
- package/docs/backend/10-authentication/06-odac-login-forms.md +2 -2
- package/docs/backend/10-authentication/07-magic-links.md +1 -1
- package/docs/index.json +5 -1
- package/jest.config.js +1 -1
- package/package.json +18 -14
- package/src/Auth.js +58 -23
- package/src/Config.js +7 -7
- package/src/Database.js +1 -1
- package/src/Env.js +3 -1
- package/src/Ipc.js +7 -0
- package/src/Lang.js +9 -2
- package/src/Mail.js +19 -9
- package/src/Odac.js +56 -44
- package/src/Request.js +6 -2
- package/src/Route/Cron.js +58 -17
- package/src/Route/Internal.js +1 -1
- package/src/Route.js +375 -125
- package/src/Server.js +40 -3
- package/src/Storage.js +4 -0
- package/src/Token.js +6 -4
- package/src/Validator.js +24 -15
- package/src/Var.js +22 -6
- package/src/View/EarlyHints.js +43 -33
- package/src/View/Form.js +17 -11
- package/src/View.js +68 -12
- package/src/WebSocket.js +45 -12
- package/template/package.json +3 -1
- package/template/view/content/home.html +3 -3
- package/template/view/head/main.html +2 -2
- package/test/Client.test.js +168 -0
- package/test/Config.test.js +112 -0
- package/test/Lang.test.js +92 -0
- package/test/Odac.test.js +88 -0
- package/test/{framework/middleware.test.js → Route/Middleware.test.js} +2 -2
- package/test/{framework/Route.test.js → Route.test.js} +105 -1
- package/test/{framework/View → View}/EarlyHints.test.js +1 -1
- package/test/WebSocket.test.js +238 -0
- package/test/scripts/check-coverage.js +4 -4
- package/test/cli/Cli.test.js +0 -36
- package/test/core/Commands.test.js +0 -538
- package/test/core/Config.test.js +0 -1432
- package/test/core/Lang.test.js +0 -250
- package/test/core/Odac.test.js +0 -234
- package/test/core/Process.test.js +0 -156
- package/test/framework/WebSocket.test.js +0 -100
- package/test/server/Api.test.js +0 -647
- package/test/server/DNS.test.js +0 -2050
- package/test/server/DNS.test.js.bak +0 -2084
- package/test/server/Hub.test.js +0 -497
- package/test/server/Log.test.js +0 -73
- package/test/server/Mail.account.test_.js +0 -460
- package/test/server/Mail.init.test_.js +0 -411
- package/test/server/Mail.test_.js +0 -1340
- package/test/server/SSL.test_.js +0 -1491
- package/test/server/Server.test.js +0 -765
- package/test/server/Service.test_.js +0 -1127
- package/test/server/Subdomain.test.js +0 -440
- package/test/server/Web/Firewall.test.js +0 -175
- package/test/server/Web/Proxy.test.js +0 -397
- package/test/server/Web.test.js +0 -1494
- package/test/server/__mocks__/acme-client.js +0 -17
- package/test/server/__mocks__/bcrypt.js +0 -50
- package/test/server/__mocks__/child_process.js +0 -389
- package/test/server/__mocks__/crypto.js +0 -432
- package/test/server/__mocks__/fs.js +0 -450
- package/test/server/__mocks__/globalOdac.js +0 -227
- package/test/server/__mocks__/http.js +0 -575
- package/test/server/__mocks__/https.js +0 -272
- package/test/server/__mocks__/index.js +0 -249
- package/test/server/__mocks__/mail/server.js +0 -100
- package/test/server/__mocks__/mail/smtp.js +0 -31
- package/test/server/__mocks__/mailparser.js +0 -81
- package/test/server/__mocks__/net.js +0 -369
- package/test/server/__mocks__/node-forge.js +0 -328
- package/test/server/__mocks__/os.js +0 -320
- package/test/server/__mocks__/path.js +0 -291
- package/test/server/__mocks__/selfsigned.js +0 -8
- package/test/server/__mocks__/server/src/mail/server.js +0 -100
- package/test/server/__mocks__/server/src/mail/smtp.js +0 -31
- package/test/server/__mocks__/smtp-server.js +0 -106
- package/test/server/__mocks__/sqlite3.js +0 -394
- package/test/server/__mocks__/testFactories.js +0 -299
- package/test/server/__mocks__/testHelpers.js +0 -363
- package/test/server/__mocks__/tls.js +0 -229
- /package/template/{config.json → odac.json} +0 -0
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
const {WebSocketServer} = require('../../framework/src/WebSocket.js')
|
|
2
|
-
|
|
3
|
-
describe('WebSocketServer', () => {
|
|
4
|
-
let server
|
|
5
|
-
|
|
6
|
-
beforeEach(() => {
|
|
7
|
-
server = new WebSocketServer()
|
|
8
|
-
})
|
|
9
|
-
|
|
10
|
-
describe('route', () => {
|
|
11
|
-
it('should register a route', () => {
|
|
12
|
-
const handler = jest.fn()
|
|
13
|
-
server.route('/chat', handler)
|
|
14
|
-
expect(server.getRoute('/chat')).toBe(handler)
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
it('should return null for unregistered route', () => {
|
|
18
|
-
expect(server.getRoute('/unknown')).toBeNull()
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
it('should match parameterized routes', () => {
|
|
22
|
-
const handler = jest.fn()
|
|
23
|
-
server.route('/room/{id}', handler)
|
|
24
|
-
|
|
25
|
-
const result = server.getRoute('/room/123')
|
|
26
|
-
expect(result).toBeDefined()
|
|
27
|
-
expect(result.handler).toBe(handler)
|
|
28
|
-
expect(result.params).toEqual({id: '123'})
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
it('should match multiple parameters', () => {
|
|
32
|
-
const handler = jest.fn()
|
|
33
|
-
server.route('/chat/{room}/user/{userId}', handler)
|
|
34
|
-
|
|
35
|
-
const result = server.getRoute('/chat/general/user/42')
|
|
36
|
-
expect(result.params).toEqual({room: 'general', userId: '42'})
|
|
37
|
-
})
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
describe('rooms', () => {
|
|
41
|
-
it('should join and leave rooms', () => {
|
|
42
|
-
server.joinRoom('client1', 'room1')
|
|
43
|
-
server.joinRoom('client2', 'room1')
|
|
44
|
-
|
|
45
|
-
server.leaveRoom('client1', 'room1')
|
|
46
|
-
server.leaveRoom('client2', 'room1')
|
|
47
|
-
})
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
describe('broadcast', () => {
|
|
51
|
-
it('should have broadcast method', () => {
|
|
52
|
-
expect(typeof server.broadcast).toBe('function')
|
|
53
|
-
})
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
describe('clients', () => {
|
|
57
|
-
it('should track client count', () => {
|
|
58
|
-
expect(server.clientCount).toBe(0)
|
|
59
|
-
})
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
describe('cleanup on disconnect', () => {
|
|
63
|
-
it('should be handled by Route.setWs wrapper', () => {
|
|
64
|
-
expect(true).toBe(true)
|
|
65
|
-
})
|
|
66
|
-
})
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
describe('Route WebSocket Integration', () => {
|
|
70
|
-
const Route = require('../../framework/src/Route.js')
|
|
71
|
-
|
|
72
|
-
beforeEach(() => {
|
|
73
|
-
global.Odac = {
|
|
74
|
-
Route: new Route()
|
|
75
|
-
}
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
it('should support ws() method', () => {
|
|
79
|
-
expect(typeof Odac.Route.ws).toBe('function')
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
it('should support auth.ws() method', () => {
|
|
83
|
-
expect(typeof Odac.Route.auth.ws).toBe('function')
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
it('should support middleware with ws()', () => {
|
|
87
|
-
const chain = Odac.Route.use('test-middleware')
|
|
88
|
-
expect(typeof chain.ws).toBe('function')
|
|
89
|
-
})
|
|
90
|
-
|
|
91
|
-
it('should support middleware with auth.ws()', () => {
|
|
92
|
-
const chain = Odac.Route.use('test-middleware')
|
|
93
|
-
expect(typeof chain.auth.ws).toBe('function')
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
it('should support auth.use() with ws()', () => {
|
|
97
|
-
const chain = Odac.Route.auth.use('test-middleware')
|
|
98
|
-
expect(typeof chain.ws).toBe('function')
|
|
99
|
-
})
|
|
100
|
-
})
|