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.
Files changed (117) hide show
  1. package/.agent/rules/coding.md +27 -0
  2. package/.agent/rules/memory.md +42 -0
  3. package/.agent/rules/project.md +30 -0
  4. package/.agent/rules/workflow.md +16 -0
  5. package/.github/workflows/release.yml +68 -1
  6. package/.github/workflows/test-coverage.yml +6 -5
  7. package/.husky/pre-commit +10 -0
  8. package/.husky/pre-push +13 -0
  9. package/.releaserc.js +1 -1
  10. package/CHANGELOG.md +99 -0
  11. package/README.md +16 -0
  12. package/bin/odac.js +196 -38
  13. package/client/odac.js +238 -171
  14. package/docs/backend/01-overview/03-development-server.md +38 -45
  15. package/docs/backend/02-structure/01-typical-project-layout.md +59 -26
  16. package/docs/backend/03-config/00-configuration-overview.md +6 -6
  17. package/docs/backend/03-config/01-database-connection.md +2 -2
  18. package/docs/backend/03-config/02-static-route-mapping-optional.md +1 -1
  19. package/docs/backend/03-config/03-request-timeout.md +1 -1
  20. package/docs/backend/03-config/04-environment-variables.md +4 -4
  21. package/docs/backend/03-config/05-early-hints.md +2 -2
  22. package/docs/backend/04-routing/03-api-and-data-routes.md +18 -0
  23. package/docs/backend/04-routing/07-cron-jobs.md +17 -1
  24. package/docs/backend/04-routing/09-websocket.md +14 -1
  25. package/docs/backend/05-controllers/01-how-to-build-a-controller.md +48 -3
  26. package/docs/backend/05-controllers/03-controller-classes.md +40 -20
  27. package/docs/backend/06-request-and-response/01-the-request-object-what-is-the-user-asking-for.md +17 -0
  28. package/docs/backend/07-views/10-styling-and-tailwind.md +93 -0
  29. package/docs/backend/08-database/01-getting-started.md +2 -2
  30. package/docs/backend/10-authentication/03-register.md +1 -1
  31. package/docs/backend/10-authentication/04-odac-register-forms.md +2 -2
  32. package/docs/backend/10-authentication/05-session-management.md +15 -1
  33. package/docs/backend/10-authentication/06-odac-login-forms.md +2 -2
  34. package/docs/backend/10-authentication/07-magic-links.md +1 -1
  35. package/docs/index.json +5 -1
  36. package/jest.config.js +1 -1
  37. package/package.json +18 -14
  38. package/src/Auth.js +58 -23
  39. package/src/Config.js +7 -7
  40. package/src/Database.js +1 -1
  41. package/src/Env.js +3 -1
  42. package/src/Ipc.js +7 -0
  43. package/src/Lang.js +9 -2
  44. package/src/Mail.js +19 -9
  45. package/src/Odac.js +56 -44
  46. package/src/Request.js +6 -2
  47. package/src/Route/Cron.js +58 -17
  48. package/src/Route/Internal.js +1 -1
  49. package/src/Route.js +375 -125
  50. package/src/Server.js +40 -3
  51. package/src/Storage.js +4 -0
  52. package/src/Token.js +6 -4
  53. package/src/Validator.js +24 -15
  54. package/src/Var.js +22 -6
  55. package/src/View/EarlyHints.js +43 -33
  56. package/src/View/Form.js +17 -11
  57. package/src/View.js +68 -12
  58. package/src/WebSocket.js +45 -12
  59. package/template/package.json +3 -1
  60. package/template/view/content/home.html +3 -3
  61. package/template/view/head/main.html +2 -2
  62. package/test/Client.test.js +168 -0
  63. package/test/Config.test.js +112 -0
  64. package/test/Lang.test.js +92 -0
  65. package/test/Odac.test.js +88 -0
  66. package/test/{framework/middleware.test.js → Route/Middleware.test.js} +2 -2
  67. package/test/{framework/Route.test.js → Route.test.js} +105 -1
  68. package/test/{framework/View → View}/EarlyHints.test.js +1 -1
  69. package/test/WebSocket.test.js +238 -0
  70. package/test/scripts/check-coverage.js +4 -4
  71. package/test/cli/Cli.test.js +0 -36
  72. package/test/core/Commands.test.js +0 -538
  73. package/test/core/Config.test.js +0 -1432
  74. package/test/core/Lang.test.js +0 -250
  75. package/test/core/Odac.test.js +0 -234
  76. package/test/core/Process.test.js +0 -156
  77. package/test/framework/WebSocket.test.js +0 -100
  78. package/test/server/Api.test.js +0 -647
  79. package/test/server/DNS.test.js +0 -2050
  80. package/test/server/DNS.test.js.bak +0 -2084
  81. package/test/server/Hub.test.js +0 -497
  82. package/test/server/Log.test.js +0 -73
  83. package/test/server/Mail.account.test_.js +0 -460
  84. package/test/server/Mail.init.test_.js +0 -411
  85. package/test/server/Mail.test_.js +0 -1340
  86. package/test/server/SSL.test_.js +0 -1491
  87. package/test/server/Server.test.js +0 -765
  88. package/test/server/Service.test_.js +0 -1127
  89. package/test/server/Subdomain.test.js +0 -440
  90. package/test/server/Web/Firewall.test.js +0 -175
  91. package/test/server/Web/Proxy.test.js +0 -397
  92. package/test/server/Web.test.js +0 -1494
  93. package/test/server/__mocks__/acme-client.js +0 -17
  94. package/test/server/__mocks__/bcrypt.js +0 -50
  95. package/test/server/__mocks__/child_process.js +0 -389
  96. package/test/server/__mocks__/crypto.js +0 -432
  97. package/test/server/__mocks__/fs.js +0 -450
  98. package/test/server/__mocks__/globalOdac.js +0 -227
  99. package/test/server/__mocks__/http.js +0 -575
  100. package/test/server/__mocks__/https.js +0 -272
  101. package/test/server/__mocks__/index.js +0 -249
  102. package/test/server/__mocks__/mail/server.js +0 -100
  103. package/test/server/__mocks__/mail/smtp.js +0 -31
  104. package/test/server/__mocks__/mailparser.js +0 -81
  105. package/test/server/__mocks__/net.js +0 -369
  106. package/test/server/__mocks__/node-forge.js +0 -328
  107. package/test/server/__mocks__/os.js +0 -320
  108. package/test/server/__mocks__/path.js +0 -291
  109. package/test/server/__mocks__/selfsigned.js +0 -8
  110. package/test/server/__mocks__/server/src/mail/server.js +0 -100
  111. package/test/server/__mocks__/server/src/mail/smtp.js +0 -31
  112. package/test/server/__mocks__/smtp-server.js +0 -106
  113. package/test/server/__mocks__/sqlite3.js +0 -394
  114. package/test/server/__mocks__/testFactories.js +0 -299
  115. package/test/server/__mocks__/testHelpers.js +0 -363
  116. package/test/server/__mocks__/tls.js +0 -229
  117. /package/template/{config.json → odac.json} +0 -0
@@ -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