odac 1.0.1 → 1.2.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 (143) hide show
  1. package/.agent/rules/coding.md +27 -0
  2. package/.agent/rules/memory.md +33 -0
  3. package/.agent/rules/project.md +30 -0
  4. package/.agent/rules/workflow.md +16 -0
  5. package/.github/workflows/auto-pr-description.yml +3 -1
  6. package/.github/workflows/release.yml +42 -1
  7. package/.github/workflows/test-coverage.yml +6 -5
  8. package/.github/workflows/test-publish.yml +36 -0
  9. package/.husky/pre-commit +10 -0
  10. package/.husky/pre-push +13 -0
  11. package/.releaserc.js +3 -3
  12. package/CHANGELOG.md +184 -0
  13. package/README.md +53 -34
  14. package/bin/odac.js +181 -49
  15. package/client/odac.js +878 -995
  16. package/docs/backend/01-overview/03-development-server.md +39 -46
  17. package/docs/backend/02-structure/01-typical-project-layout.md +59 -25
  18. package/docs/backend/03-config/00-configuration-overview.md +15 -6
  19. package/docs/backend/03-config/01-database-connection.md +3 -3
  20. package/docs/backend/03-config/02-static-route-mapping-optional.md +1 -1
  21. package/docs/backend/03-config/03-request-timeout.md +1 -1
  22. package/docs/backend/03-config/04-environment-variables.md +4 -4
  23. package/docs/backend/03-config/05-early-hints.md +2 -2
  24. package/docs/backend/04-routing/02-controller-less-view-routes.md +9 -3
  25. package/docs/backend/04-routing/03-api-and-data-routes.md +18 -0
  26. package/docs/backend/04-routing/07-cron-jobs.md +17 -1
  27. package/docs/backend/04-routing/09-websocket.md +29 -0
  28. package/docs/backend/05-controllers/01-how-to-build-a-controller.md +48 -3
  29. package/docs/backend/05-controllers/02-your-trusty-odac-assistant.md +2 -0
  30. package/docs/backend/05-controllers/03-controller-classes.md +61 -55
  31. package/docs/backend/05-forms/01-custom-forms.md +103 -95
  32. package/docs/backend/05-forms/02-automatic-database-insert.md +21 -21
  33. package/docs/backend/06-request-and-response/01-the-request-object-what-is-the-user-asking-for.md +17 -0
  34. package/docs/backend/07-views/02-rendering-a-view.md +1 -1
  35. package/docs/backend/07-views/03-variables.md +5 -5
  36. package/docs/backend/07-views/04-request-data.md +1 -1
  37. package/docs/backend/07-views/08-backend-javascript.md +1 -1
  38. package/docs/backend/07-views/10-styling-and-tailwind.md +93 -0
  39. package/docs/backend/08-database/01-getting-started.md +100 -0
  40. package/docs/backend/08-database/02-basics.md +136 -0
  41. package/docs/backend/08-database/03-advanced.md +84 -0
  42. package/docs/backend/08-database/04-migrations.md +48 -0
  43. package/docs/backend/09-validation/01-the-validator-service.md +1 -0
  44. package/docs/backend/10-authentication/03-register.md +9 -2
  45. package/docs/backend/10-authentication/04-odac-register-forms.md +48 -48
  46. package/docs/backend/10-authentication/05-session-management.md +16 -2
  47. package/docs/backend/10-authentication/06-odac-login-forms.md +50 -50
  48. package/docs/backend/10-authentication/07-magic-links.md +134 -0
  49. package/docs/backend/11-mail/01-the-mail-service.md +118 -28
  50. package/docs/backend/12-streaming/01-streaming-overview.md +2 -2
  51. package/docs/backend/13-utilities/01-odac-var.md +7 -7
  52. package/docs/backend/13-utilities/02-ipc.md +73 -0
  53. package/docs/frontend/01-overview/01-introduction.md +5 -1
  54. package/docs/frontend/02-ajax-navigation/01-quick-start.md +1 -1
  55. package/docs/index.json +21 -125
  56. package/eslint.config.mjs +5 -47
  57. package/jest.config.js +1 -1
  58. package/package.json +16 -7
  59. package/src/Auth.js +414 -121
  60. package/src/Config.js +12 -7
  61. package/src/Database.js +188 -0
  62. package/src/Env.js +3 -1
  63. package/src/Ipc.js +337 -0
  64. package/src/Lang.js +9 -2
  65. package/src/Mail.js +408 -37
  66. package/src/Odac.js +105 -40
  67. package/src/Request.js +71 -49
  68. package/src/Route/Cron.js +62 -18
  69. package/src/Route/Internal.js +215 -12
  70. package/src/Route/Middleware.js +7 -2
  71. package/src/Route.js +372 -109
  72. package/src/Server.js +118 -12
  73. package/src/Storage.js +169 -0
  74. package/src/Token.js +6 -4
  75. package/src/Validator.js +95 -3
  76. package/src/Var.js +22 -6
  77. package/src/View/EarlyHints.js +43 -33
  78. package/src/View/Form.js +210 -28
  79. package/src/View.js +108 -7
  80. package/src/WebSocket.js +18 -3
  81. package/template/odac.json +5 -0
  82. package/template/package.json +3 -1
  83. package/template/route/www.js +12 -10
  84. package/template/view/content/home.html +3 -3
  85. package/template/view/head/main.html +2 -2
  86. package/test/Client.test.js +168 -0
  87. package/test/Config.test.js +112 -0
  88. package/test/Lang.test.js +92 -0
  89. package/test/Odac.test.js +86 -0
  90. package/test/{framework/middleware.test.js → Route/Middleware.test.js} +2 -2
  91. package/test/{framework/Route.test.js → Route.test.js} +1 -1
  92. package/test/{framework/View → View}/EarlyHints.test.js +1 -1
  93. package/test/{framework/WebSocket.test.js → WebSocket.test.js} +2 -2
  94. package/test/scripts/check-coverage.js +4 -4
  95. package/docs/backend/08-database/01-database-connection.md +0 -99
  96. package/docs/backend/08-database/02-using-mysql.md +0 -322
  97. package/src/Mysql.js +0 -575
  98. package/template/config.json +0 -5
  99. package/test/cli/Cli.test.js +0 -36
  100. package/test/core/Candy.test.js +0 -234
  101. package/test/core/Commands.test.js +0 -538
  102. package/test/core/Config.test.js +0 -1432
  103. package/test/core/Lang.test.js +0 -250
  104. package/test/core/Process.test.js +0 -156
  105. package/test/server/Api.test.js +0 -647
  106. package/test/server/DNS.test.js +0 -2050
  107. package/test/server/DNS.test.js.bak +0 -2084
  108. package/test/server/Hub.test.js +0 -497
  109. package/test/server/Log.test.js +0 -73
  110. package/test/server/Mail.account.test_.js +0 -460
  111. package/test/server/Mail.init.test_.js +0 -411
  112. package/test/server/Mail.test_.js +0 -1340
  113. package/test/server/SSL.test_.js +0 -1491
  114. package/test/server/Server.test.js +0 -765
  115. package/test/server/Service.test_.js +0 -1127
  116. package/test/server/Subdomain.test.js +0 -440
  117. package/test/server/Web/Firewall.test.js +0 -175
  118. package/test/server/Web/Proxy.test.js +0 -397
  119. package/test/server/Web.test.js +0 -1494
  120. package/test/server/__mocks__/acme-client.js +0 -17
  121. package/test/server/__mocks__/bcrypt.js +0 -50
  122. package/test/server/__mocks__/child_process.js +0 -389
  123. package/test/server/__mocks__/crypto.js +0 -432
  124. package/test/server/__mocks__/fs.js +0 -450
  125. package/test/server/__mocks__/globalOdac.js +0 -227
  126. package/test/server/__mocks__/http.js +0 -575
  127. package/test/server/__mocks__/https.js +0 -272
  128. package/test/server/__mocks__/index.js +0 -249
  129. package/test/server/__mocks__/mail/server.js +0 -100
  130. package/test/server/__mocks__/mail/smtp.js +0 -31
  131. package/test/server/__mocks__/mailparser.js +0 -81
  132. package/test/server/__mocks__/net.js +0 -369
  133. package/test/server/__mocks__/node-forge.js +0 -328
  134. package/test/server/__mocks__/os.js +0 -320
  135. package/test/server/__mocks__/path.js +0 -291
  136. package/test/server/__mocks__/selfsigned.js +0 -8
  137. package/test/server/__mocks__/server/src/mail/server.js +0 -100
  138. package/test/server/__mocks__/server/src/mail/smtp.js +0 -31
  139. package/test/server/__mocks__/smtp-server.js +0 -106
  140. package/test/server/__mocks__/sqlite3.js +0 -394
  141. package/test/server/__mocks__/testFactories.js +0 -299
  142. package/test/server/__mocks__/testHelpers.js +0 -363
  143. package/test/server/__mocks__/tls.js +0 -229
@@ -1,328 +0,0 @@
1
- /**
2
- * Mock implementation of node-forge for server tests
3
- */
4
-
5
- // Mock RSA key pair
6
- const createMockKeyPair = (keySize = 2048) => {
7
- return {
8
- privateKey: {
9
- n: 'mock-private-key-modulus',
10
- e: 'mock-private-key-exponent',
11
- d: 'mock-private-key-private-exponent',
12
- p: 'mock-private-key-prime1',
13
- q: 'mock-private-key-prime2',
14
- dP: 'mock-private-key-exponent1',
15
- dQ: 'mock-private-key-exponent2',
16
- qInv: 'mock-private-key-coefficient'
17
- },
18
- publicKey: {
19
- n: 'mock-public-key-modulus',
20
- e: 'mock-public-key-exponent'
21
- }
22
- }
23
- }
24
-
25
- // Mock certificate
26
- const createMockCertificate = () => {
27
- return {
28
- version: 2,
29
- serialNumber: '01',
30
- validity: {
31
- notBefore: new Date(),
32
- notAfter: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000) // 1 year
33
- },
34
- subject: {
35
- attributes: [
36
- {name: 'commonName', value: 'example.com'},
37
- {name: 'organizationName', value: 'Test Organization'}
38
- ]
39
- },
40
- issuer: {
41
- attributes: [
42
- {name: 'commonName', value: 'Test CA'},
43
- {name: 'organizationName', value: 'Test CA Organization'}
44
- ]
45
- },
46
- extensions: [],
47
- publicKey: createMockKeyPair().publicKey,
48
- sign: jest.fn(),
49
- verify: jest.fn(() => true)
50
- }
51
- }
52
-
53
- const forge = {
54
- // PKI (Public Key Infrastructure)
55
- pki: {
56
- // RSA key generation
57
- rsa: {
58
- generateKeyPair: jest.fn((keySize, options, callback) => {
59
- if (typeof options === 'function') {
60
- callback = options
61
- options = {}
62
- }
63
-
64
- const keyPair = createMockKeyPair(keySize)
65
-
66
- if (callback) {
67
- setTimeout(() => callback(null, keyPair), 0)
68
- } else {
69
- return keyPair
70
- }
71
- }),
72
-
73
- setPublicKey: jest.fn((n, e) => {
74
- return {
75
- n: n,
76
- e: e,
77
- encrypt: jest.fn(data => 'encrypted-' + data),
78
- verify: jest.fn(() => true)
79
- }
80
- }),
81
-
82
- setPrivateKey: jest.fn((n, e, d, p, q, dP, dQ, qInv) => {
83
- return {
84
- n,
85
- e,
86
- d,
87
- p,
88
- q,
89
- dP,
90
- dQ,
91
- qInv,
92
- decrypt: jest.fn(data => data.replace('encrypted-', '')),
93
- sign: jest.fn(data => 'signature-' + data)
94
- }
95
- })
96
- },
97
-
98
- // Key conversion functions
99
- privateKeyToPem: jest.fn(privateKey => {
100
- return (
101
- '-----BEGIN PRIVATE KEY-----\n' +
102
- 'MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7VJTUt9Us8cKB\n' +
103
- 'UO4Op/DYDyBcjGh5aAFur4wEGoDf3iLnjN8V9RYubK+wJK8E4Hauv7o+8gMn\n' +
104
- '-----END PRIVATE KEY-----'
105
- )
106
- }),
107
-
108
- publicKeyToPem: jest.fn(publicKey => {
109
- return (
110
- '-----BEGIN PUBLIC KEY-----\n' +
111
- 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu1SU1L7VLPHCgVDuDqfw\n' +
112
- '2A8gXIxoeWgBbq+MBBqA394i54zfFfUWLmyvsCStBOB2rr+6PvIDJ\n' +
113
- '-----END PUBLIC KEY-----'
114
- )
115
- }),
116
-
117
- privateKeyFromPem: jest.fn(pem => {
118
- return createMockKeyPair().privateKey
119
- }),
120
-
121
- publicKeyFromPem: jest.fn(pem => {
122
- return createMockKeyPair().publicKey
123
- }),
124
-
125
- // Certificate functions
126
- createCertificate: jest.fn(() => {
127
- return createMockCertificate()
128
- }),
129
-
130
- certificateToPem: jest.fn(cert => {
131
- return (
132
- '-----BEGIN CERTIFICATE-----\n' +
133
- 'MIIDXTCCAkWgAwIBAgIJAJC1HiIAZAiIMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV\n' +
134
- 'BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX\n' +
135
- '-----END CERTIFICATE-----'
136
- )
137
- }),
138
-
139
- certificateFromPem: jest.fn(pem => {
140
- return createMockCertificate()
141
- }),
142
-
143
- // Certificate signing request
144
- createCertificationRequest: jest.fn(() => {
145
- return {
146
- version: 0,
147
- subject: {
148
- attributes: []
149
- },
150
- publicKey: null,
151
- attributes: [],
152
- sign: jest.fn(),
153
- verify: jest.fn(() => true)
154
- }
155
- }),
156
-
157
- certificationRequestToPem: jest.fn(csr => {
158
- return (
159
- '-----BEGIN CERTIFICATE REQUEST-----\n' +
160
- 'MIICijCCAXICAQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUx\n' +
161
- 'ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcN\n' +
162
- '-----END CERTIFICATE REQUEST-----'
163
- )
164
- }),
165
-
166
- certificationRequestFromPem: jest.fn(pem => {
167
- return {
168
- version: 0,
169
- subject: {attributes: []},
170
- publicKey: createMockKeyPair().publicKey,
171
- attributes: [],
172
- verify: jest.fn(() => true)
173
- }
174
- })
175
- },
176
-
177
- // Message digests
178
- md: {
179
- sha1: {
180
- create: jest.fn(() => ({
181
- update: jest.fn(),
182
- digest: jest.fn(() => ({
183
- toHex: jest.fn(() => 'mock-sha1-hash'),
184
- bytes: jest.fn(() => 'mock-sha1-bytes')
185
- }))
186
- }))
187
- },
188
-
189
- sha256: {
190
- create: jest.fn(() => ({
191
- update: jest.fn(),
192
- digest: jest.fn(() => ({
193
- toHex: jest.fn(() => 'mock-sha256-hash'),
194
- bytes: jest.fn(() => 'mock-sha256-bytes')
195
- }))
196
- }))
197
- },
198
-
199
- sha512: {
200
- create: jest.fn(() => ({
201
- update: jest.fn(),
202
- digest: jest.fn(() => ({
203
- toHex: jest.fn(() => 'mock-sha512-hash'),
204
- bytes: jest.fn(() => 'mock-sha512-bytes')
205
- }))
206
- }))
207
- },
208
-
209
- md5: {
210
- create: jest.fn(() => ({
211
- update: jest.fn(),
212
- digest: jest.fn(() => ({
213
- toHex: jest.fn(() => 'mock-md5-hash'),
214
- bytes: jest.fn(() => 'mock-md5-bytes')
215
- }))
216
- }))
217
- }
218
- },
219
-
220
- // HMAC
221
- hmac: {
222
- create: jest.fn(() => ({
223
- start: jest.fn(),
224
- update: jest.fn(),
225
- digest: jest.fn(() => ({
226
- toHex: jest.fn(() => 'mock-hmac-hash'),
227
- bytes: jest.fn(() => 'mock-hmac-bytes')
228
- }))
229
- }))
230
- },
231
-
232
- // Random number generation
233
- random: {
234
- getBytesSync: jest.fn(count => {
235
- return Array(count)
236
- .fill(0)
237
- .map(() => String.fromCharCode(Math.floor(Math.random() * 256)))
238
- .join('')
239
- }),
240
-
241
- getBytes: jest.fn((count, callback) => {
242
- const bytes = Array(count)
243
- .fill(0)
244
- .map(() => String.fromCharCode(Math.floor(Math.random() * 256)))
245
- .join('')
246
- setTimeout(() => callback(null, bytes), 0)
247
- })
248
- },
249
-
250
- // Utilities
251
- util: {
252
- encode64: jest.fn(data => {
253
- return Buffer.from(data).toString('base64')
254
- }),
255
-
256
- decode64: jest.fn(data => {
257
- return Buffer.from(data, 'base64').toString()
258
- }),
259
-
260
- bytesToHex: jest.fn(bytes => {
261
- return Array.from(bytes)
262
- .map(b => b.toString(16).padStart(2, '0'))
263
- .join('')
264
- }),
265
-
266
- hexToBytes: jest.fn(hex => {
267
- const bytes = []
268
- for (let i = 0; i < hex.length; i += 2) {
269
- bytes.push(parseInt(hex.substr(i, 2), 16))
270
- }
271
- return bytes
272
- }),
273
-
274
- createBuffer: jest.fn(data => {
275
- return {
276
- data: data || '',
277
- length: function () {
278
- return this.data.length
279
- },
280
- at: function (i) {
281
- return this.data.charCodeAt(i)
282
- },
283
- put: function (data) {
284
- this.data += data
285
- },
286
- putByte: function (byte) {
287
- this.data += String.fromCharCode(byte)
288
- },
289
- putBytes: function (bytes) {
290
- this.data += bytes
291
- },
292
- bytes: function () {
293
- return this.data
294
- },
295
- toHex: function () {
296
- return forge.util.bytesToHex(this.data)
297
- }
298
- }
299
- })
300
- },
301
-
302
- // ASN.1 utilities
303
- asn1: {
304
- create: jest.fn((tagClass, type, constructed, value) => {
305
- return {
306
- tagClass: tagClass,
307
- type: type,
308
- constructed: constructed,
309
- value: value || []
310
- }
311
- }),
312
-
313
- toDer: jest.fn(obj => {
314
- return forge.util.createBuffer('mock-der-data')
315
- }),
316
-
317
- fromDer: jest.fn(der => {
318
- return {
319
- tagClass: 0,
320
- type: 16,
321
- constructed: true,
322
- value: []
323
- }
324
- })
325
- }
326
- }
327
-
328
- module.exports = forge
@@ -1,320 +0,0 @@
1
- /**
2
- * Mock implementation of the os module for server tests
3
- * Provides comprehensive mocking of operating system utilities
4
- */
5
-
6
- const os = {
7
- // System information
8
- arch: jest.fn(() => 'x64'),
9
- platform: jest.fn(() => 'linux'),
10
- type: jest.fn(() => 'Linux'),
11
- release: jest.fn(() => '5.4.0-74-generic'),
12
- version: jest.fn(() => '#83-Ubuntu SMP Sat May 8 02:35:39 UTC 2021'),
13
- machine: jest.fn(() => 'x86_64'),
14
-
15
- // Hostname
16
- hostname: jest.fn(() => 'test-hostname'),
17
-
18
- // User information
19
- userInfo: jest.fn((options = {}) => {
20
- return {
21
- uid: 1000,
22
- gid: 1000,
23
- username: 'testuser',
24
- homedir: '/home/testuser',
25
- shell: '/bin/bash'
26
- }
27
- }),
28
-
29
- // Directory paths
30
- homedir: jest.fn(() => '/home/testuser'),
31
- tmpdir: jest.fn(() => '/tmp'),
32
-
33
- // System constants
34
- EOL: '\n',
35
-
36
- // CPU information
37
- cpus: jest.fn(() => [
38
- {
39
- model: 'Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz',
40
- speed: 3700,
41
- times: {
42
- user: 252020,
43
- nice: 0,
44
- sys: 30340,
45
- idle: 1070356870,
46
- irq: 0
47
- }
48
- },
49
- {
50
- model: 'Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz',
51
- speed: 3700,
52
- times: {
53
- user: 306920,
54
- nice: 0,
55
- sys: 26980,
56
- idle: 1071569080,
57
- irq: 0
58
- }
59
- }
60
- ]),
61
-
62
- // Memory information
63
- totalmem: jest.fn(() => 17179869184), // 16 GB
64
- freemem: jest.fn(() => 8589934592), // 8 GB
65
-
66
- // Load average (Unix-like systems only)
67
- loadavg: jest.fn(() => [0.2, 0.1, 0.05]),
68
-
69
- // Uptime
70
- uptime: jest.fn(() => 86400), // 1 day in seconds
71
-
72
- // Network interfaces
73
- networkInterfaces: jest.fn(() => ({
74
- lo: [
75
- {
76
- address: '127.0.0.1',
77
- netmask: '255.0.0.0',
78
- family: 'IPv4',
79
- mac: '00:00:00:00:00:00',
80
- internal: true,
81
- cidr: '127.0.0.1/8'
82
- },
83
- {
84
- address: '::1',
85
- netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
86
- family: 'IPv6',
87
- mac: '00:00:00:00:00:00',
88
- internal: true,
89
- cidr: '::1/128',
90
- scopeid: 0
91
- }
92
- ],
93
- eth0: [
94
- {
95
- address: '192.168.1.100',
96
- netmask: '255.255.255.0',
97
- family: 'IPv4',
98
- mac: '01:02:03:04:05:06',
99
- internal: false,
100
- cidr: '192.168.1.100/24'
101
- },
102
- {
103
- address: 'fe80::a00:27ff:fe4e:66a1',
104
- netmask: 'ffff:ffff:ffff:ffff::',
105
- family: 'IPv6',
106
- mac: '01:02:03:04:05:06',
107
- internal: false,
108
- cidr: 'fe80::a00:27ff:fe4e:66a1/64',
109
- scopeid: 1
110
- }
111
- ]
112
- })),
113
-
114
- // Priority constants
115
- constants: {
116
- // Signals
117
- signals: {
118
- SIGHUP: 1,
119
- SIGINT: 2,
120
- SIGQUIT: 3,
121
- SIGILL: 4,
122
- SIGTRAP: 5,
123
- SIGABRT: 6,
124
- SIGIOT: 6,
125
- SIGBUS: 7,
126
- SIGFPE: 8,
127
- SIGKILL: 9,
128
- SIGUSR1: 10,
129
- SIGSEGV: 11,
130
- SIGUSR2: 12,
131
- SIGPIPE: 13,
132
- SIGALRM: 14,
133
- SIGTERM: 15,
134
- SIGCHLD: 17,
135
- SIGCONT: 18,
136
- SIGSTOP: 19,
137
- SIGTSTP: 20,
138
- SIGTTIN: 21,
139
- SIGTTOU: 22,
140
- SIGURG: 23,
141
- SIGXCPU: 24,
142
- SIGXFSZ: 25,
143
- SIGVTALRM: 26,
144
- SIGPROF: 27,
145
- SIGWINCH: 28,
146
- SIGIO: 29,
147
- SIGPOLL: 29,
148
- SIGPWR: 30,
149
- SIGSYS: 31,
150
- SIGUNUSED: 31
151
- },
152
-
153
- // Error codes
154
- errno: {
155
- E2BIG: 7,
156
- EACCES: 13,
157
- EADDRINUSE: 98,
158
- EADDRNOTAVAIL: 99,
159
- EAFNOSUPPORT: 97,
160
- EAGAIN: 11,
161
- EALREADY: 114,
162
- EBADF: 9,
163
- EBADMSG: 74,
164
- EBUSY: 16,
165
- ECANCELED: 125,
166
- ECHILD: 10,
167
- ECONNABORTED: 103,
168
- ECONNREFUSED: 111,
169
- ECONNRESET: 104,
170
- EDEADLK: 35,
171
- EDESTADDRREQ: 89,
172
- EDOM: 33,
173
- EDQUOT: 122,
174
- EEXIST: 17,
175
- EFAULT: 14,
176
- EFBIG: 27,
177
- EHOSTUNREACH: 113,
178
- EIDRM: 43,
179
- EILSEQ: 84,
180
- EINPROGRESS: 115,
181
- EINTR: 4,
182
- EINVAL: 22,
183
- EIO: 5,
184
- EISCONN: 106,
185
- EISDIR: 21,
186
- ELOOP: 40,
187
- EMFILE: 24,
188
- EMLINK: 31,
189
- EMSGSIZE: 90,
190
- EMULTIHOP: 72,
191
- ENAMETOOLONG: 36,
192
- ENETDOWN: 100,
193
- ENETRESET: 102,
194
- ENETUNREACH: 101,
195
- ENFILE: 23,
196
- ENOBUFS: 105,
197
- ENODATA: 61,
198
- ENODEV: 19,
199
- ENOENT: 2,
200
- ENOEXEC: 8,
201
- ENOLCK: 37,
202
- ENOLINK: 67,
203
- ENOMEM: 12,
204
- ENOMSG: 42,
205
- ENOPROTOOPT: 92,
206
- ENOSPC: 28,
207
- ENOSR: 63,
208
- ENOSTR: 60,
209
- ENOSYS: 38,
210
- ENOTCONN: 107,
211
- ENOTDIR: 20,
212
- ENOTEMPTY: 39,
213
- ENOTSOCK: 88,
214
- ENOTSUP: 95,
215
- ENOTTY: 25,
216
- ENXIO: 6,
217
- EOPNOTSUPP: 95,
218
- EOVERFLOW: 75,
219
- EPERM: 1,
220
- EPIPE: 32,
221
- EPROTO: 71,
222
- EPROTONOSUPPORT: 93,
223
- EPROTOTYPE: 91,
224
- ERANGE: 34,
225
- EROFS: 30,
226
- ESPIPE: 29,
227
- ESRCH: 3,
228
- ESTALE: 116,
229
- ETIME: 62,
230
- ETIMEDOUT: 110,
231
- ETXTBSY: 26,
232
- EWOULDBLOCK: 11,
233
- EXDEV: 18
234
- },
235
-
236
- // Priority levels
237
- priority: {
238
- PRIORITY_LOW: 19,
239
- PRIORITY_BELOW_NORMAL: 10,
240
- PRIORITY_NORMAL: 0,
241
- PRIORITY_ABOVE_NORMAL: -7,
242
- PRIORITY_HIGH: -14,
243
- PRIORITY_HIGHEST: -20
244
- }
245
- },
246
-
247
- // Process priority (Unix-like systems)
248
- getPriority: jest.fn((pid = 0) => {
249
- return 0 // Normal priority
250
- }),
251
-
252
- setPriority: jest.fn((pid, priority) => {
253
- if (typeof pid === 'number' && typeof priority === 'undefined') {
254
- priority = pid
255
- pid = 0
256
- }
257
-
258
- // Mock implementation - just return success
259
- return undefined
260
- }),
261
-
262
- // Endianness
263
- endianness: jest.fn(() => 'LE'), // Little Endian
264
-
265
- // Test helpers
266
- __setArch: arch => {
267
- os.arch.mockReturnValue(arch)
268
- },
269
-
270
- __setPlatform: platform => {
271
- os.platform.mockReturnValue(platform)
272
- },
273
-
274
- __setHostname: hostname => {
275
- os.hostname.mockReturnValue(hostname)
276
- },
277
-
278
- __setHomedir: homedir => {
279
- os.homedir.mockReturnValue(homedir)
280
- },
281
-
282
- __setTmpdir: tmpdir => {
283
- os.tmpdir.mockReturnValue(tmpdir)
284
- },
285
-
286
- __setMemory: (total, free) => {
287
- os.totalmem.mockReturnValue(total)
288
- os.freemem.mockReturnValue(free)
289
- },
290
-
291
- __setLoadAvg: loadavg => {
292
- os.loadavg.mockReturnValue(loadavg)
293
- },
294
-
295
- __setUptime: uptime => {
296
- os.uptime.mockReturnValue(uptime)
297
- },
298
-
299
- __setCpus: cpus => {
300
- os.cpus.mockReturnValue(cpus)
301
- },
302
-
303
- __setNetworkInterfaces: interfaces => {
304
- os.networkInterfaces.mockReturnValue(interfaces)
305
- },
306
-
307
- __setUserInfo: userInfo => {
308
- os.userInfo.mockReturnValue(userInfo)
309
- },
310
-
311
- __resetMocks: () => {
312
- Object.values(os).forEach(fn => {
313
- if (jest.isMockFunction(fn)) {
314
- fn.mockClear()
315
- }
316
- })
317
- }
318
- }
319
-
320
- module.exports = os