@faynosync/sdk-js 0.1.0 → 0.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.
@@ -1,519 +0,0 @@
1
- import http from 'http';
2
- import { Client } from '../src/client';
3
- import {
4
- CheckError,
5
- EndpointError,
6
- ErrInvalidBaseURL,
7
- ErrMissingAppName,
8
- ErrMissingBaseURL,
9
- ErrMissingOwner,
10
- ErrMissingVersion,
11
- } from '../src/errors';
12
- import type { CheckOptions } from '../src/types';
13
- import { createTestServer, writeJSON } from './helpers';
14
-
15
- function defaultOptions(): CheckOptions {
16
- return {
17
- owner: 'admin',
18
- appName: 'test',
19
- version: '0.0.0.5',
20
- channel: 'nightly',
21
- platform: 'darwin',
22
- arch: 'arm64',
23
- };
24
- }
25
-
26
- describe('Client.checkForUpdates', () => {
27
- it('sends request to base API with correct params and headers', async () => {
28
- const server = await createTestServer((req, res) => {
29
- const url = new URL(req.url!, `http://${req.headers.host}`);
30
- expect(url.pathname).toBe('/checkVersion');
31
- expect(url.searchParams.get('owner')).toBe('admin');
32
- expect(url.searchParams.get('app_name')).toBe('test');
33
- expect(url.searchParams.get('version')).toBe('0.0.0.5');
34
- expect(url.searchParams.get('channel')).toBe('nightly');
35
- expect(url.searchParams.get('platform')).toBe('darwin');
36
- expect(url.searchParams.get('arch')).toBe('arm64');
37
- expect(req.headers['x-device-id']).toBe('device-1');
38
- expect(req.headers['user-agent']).toBeTruthy();
39
- writeJSON(res, { update_available: true, update_url: 'https://downloads.example/app' });
40
- });
41
-
42
- try {
43
- const client = new Client({ baseURL: server.url });
44
- const resp = await client.checkForUpdates({
45
- owner: 'admin',
46
- appName: 'test',
47
- version: '0.0.0.5',
48
- channel: 'nightly',
49
- platform: 'darwin',
50
- arch: 'arm64',
51
- deviceId: 'device-1',
52
- });
53
- expect(resp.updateAvailable).toBe(true);
54
- expect(resp.updateUrl).toBe('https://downloads.example/app');
55
- expect(resp.source).toBe('api');
56
- } finally {
57
- await server.close();
58
- }
59
- });
60
-
61
- it('uses edge static response and skips API when edge succeeds', async () => {
62
- let apiCalled = false;
63
- const apiServer = await createTestServer((_, res) => {
64
- apiCalled = true;
65
- res.writeHead(500);
66
- res.end();
67
- });
68
-
69
- const edgeServer = await createTestServer((req, res) => {
70
- const url = new URL(req.url!, `http://${req.headers.host}`);
71
- expect(url.pathname).toBe('/responses/admin/test/nightly/darwin/arm64/0.0.0.5.json');
72
- writeJSON(res, { update_available: false });
73
- });
74
-
75
- try {
76
- const client = new Client({ baseURL: apiServer.url, edgeURL: edgeServer.url });
77
- const resp = await client.checkForUpdates(defaultOptions());
78
- expect(resp.source).toBe('edge');
79
- expect(apiCalled).toBe(false);
80
- } finally {
81
- await Promise.all([apiServer.close(), edgeServer.close()]);
82
- }
83
- });
84
-
85
- it('sends telemetry beacon to base API after edge success', async () => {
86
- let apiCalled = false;
87
- let telemetryCalled = false;
88
-
89
- const apiServer = await createTestServer((req, res) => {
90
- const url = new URL(req.url!, `http://${req.headers.host}`);
91
- if (url.pathname === '/telemetry/beacon') {
92
- telemetryCalled = true;
93
- expect(url.searchParams.get('app_name')).toBe('test');
94
- expect(url.searchParams.get('version')).toBe('0.0.0.5');
95
- expect(url.searchParams.get('channel')).toBe('nightly');
96
- expect(url.searchParams.get('platform')).toBe('darwin');
97
- expect(url.searchParams.get('arch')).toBe('arm64');
98
- expect(url.searchParams.get('owner')).toBe('admin');
99
- expect(url.searchParams.get('is_latest')).toBe('false');
100
- expect(req.headers['x-device-id']).toBe('device-1');
101
- res.writeHead(200);
102
- res.end();
103
- } else if (url.pathname === '/checkVersion') {
104
- apiCalled = true;
105
- res.writeHead(500);
106
- res.end();
107
- } else {
108
- res.writeHead(404);
109
- res.end();
110
- }
111
- });
112
-
113
- const edgeServer = await createTestServer((_, res) => {
114
- writeJSON(res, { update_available: true });
115
- });
116
-
117
- try {
118
- const client = new Client({ baseURL: apiServer.url, edgeURL: edgeServer.url });
119
- const resp = await client.checkForUpdates({
120
- owner: 'admin',
121
- appName: 'test',
122
- version: '0.0.0.5',
123
- channel: 'nightly',
124
- platform: 'darwin',
125
- arch: 'arm64',
126
- deviceId: 'device-1',
127
- });
128
- expect(resp.source).toBe('edge');
129
- expect(telemetryCalled).toBe(true);
130
- expect(apiCalled).toBe(false);
131
- } finally {
132
- await Promise.all([apiServer.close(), edgeServer.close()]);
133
- }
134
- });
135
-
136
- it.each<{ updateAvailable: boolean; wantIsLatest: string }>([
137
- { updateAvailable: true, wantIsLatest: 'false' },
138
- { updateAvailable: false, wantIsLatest: 'true' },
139
- ])(
140
- 'telemetry is_latest=$wantIsLatest when updateAvailable=$updateAvailable',
141
- async ({ updateAvailable, wantIsLatest }) => {
142
- let telemetryIsLatest = '';
143
-
144
- const apiServer = await createTestServer((req, res) => {
145
- const url = new URL(req.url!, `http://${req.headers.host}`);
146
- if (url.pathname === '/telemetry/beacon') {
147
- telemetryIsLatest = url.searchParams.get('is_latest') ?? '';
148
- res.writeHead(200);
149
- res.end();
150
- } else {
151
- res.writeHead(404);
152
- res.end();
153
- }
154
- });
155
-
156
- const edgeServer = await createTestServer((_, res) => {
157
- writeJSON(res, { update_available: updateAvailable });
158
- });
159
-
160
- try {
161
- const client = new Client({ baseURL: apiServer.url, edgeURL: edgeServer.url });
162
- await client.checkForUpdates({
163
- owner: 'admin',
164
- appName: 'test',
165
- version: '0.0.0.5',
166
- channel: 'nightly',
167
- platform: 'darwin',
168
- arch: 'arm64',
169
- deviceId: 'device-1',
170
- });
171
- expect(telemetryIsLatest).toBe(wantIsLatest);
172
- } finally {
173
- await Promise.all([apiServer.close(), edgeServer.close()]);
174
- }
175
- },
176
- );
177
-
178
- it('does not send telemetry beacon when deviceId is absent', async () => {
179
- let telemetryCalled = false;
180
-
181
- const apiServer = await createTestServer((req, res) => {
182
- const url = new URL(req.url!, `http://${req.headers.host}`);
183
- if (url.pathname === '/telemetry/beacon') {
184
- telemetryCalled = true;
185
- }
186
- res.writeHead(404);
187
- res.end();
188
- });
189
-
190
- const edgeServer = await createTestServer((_, res) => {
191
- writeJSON(res, { update_available: false });
192
- });
193
-
194
- try {
195
- const client = new Client({ baseURL: apiServer.url, edgeURL: edgeServer.url });
196
- const resp = await client.checkForUpdates(defaultOptions());
197
- expect(resp.source).toBe('edge');
198
- expect(telemetryCalled).toBe(false);
199
- } finally {
200
- await Promise.all([apiServer.close(), edgeServer.close()]);
201
- }
202
- });
203
-
204
- it('ignores telemetry failure and returns edge response', async () => {
205
- const apiServer = await createTestServer((req, res) => {
206
- const url = new URL(req.url!, `http://${req.headers.host}`);
207
- if (url.pathname === '/telemetry/beacon') {
208
- res.writeHead(500);
209
- res.end('telemetry failed');
210
- } else {
211
- res.writeHead(404);
212
- res.end();
213
- }
214
- });
215
-
216
- const edgeServer = await createTestServer((_, res) => {
217
- writeJSON(res, { update_available: true, update_url: 'https://downloads.example/app' });
218
- });
219
-
220
- try {
221
- const client = new Client({ baseURL: apiServer.url, edgeURL: edgeServer.url });
222
- const resp = await client.checkForUpdates({
223
- owner: 'admin',
224
- appName: 'test',
225
- version: '0.0.0.5',
226
- channel: 'nightly',
227
- platform: 'darwin',
228
- arch: 'arm64',
229
- deviceId: 'device-1',
230
- });
231
- expect(resp.source).toBe('edge');
232
- expect(resp.updateUrl).toBe('https://downloads.example/app');
233
- } finally {
234
- await Promise.all([apiServer.close(), edgeServer.close()]);
235
- }
236
- });
237
-
238
- it('falls back from edge 404 to API', async () => {
239
- const edgeServer = await createTestServer((_, res) => {
240
- res.writeHead(404);
241
- res.end();
242
- });
243
-
244
- const apiServer = await createTestServer((_, res) => {
245
- writeJSON(res, { update_available: true, update_url: 'https://downloads.example/app' });
246
- });
247
-
248
- try {
249
- const client = new Client({ baseURL: apiServer.url, edgeURL: edgeServer.url });
250
- const resp = await client.checkForUpdates(defaultOptions());
251
- expect(resp.source).toBe('api');
252
- } finally {
253
- await Promise.all([edgeServer.close(), apiServer.close()]);
254
- }
255
- });
256
-
257
- it('falls back from invalid edge JSON to API', async () => {
258
- const edgeServer = await createTestServer((_, res) => {
259
- res.setHeader('Content-Type', 'application/json');
260
- res.end('{');
261
- });
262
-
263
- const apiServer = await createTestServer((_, res) => {
264
- writeJSON(res, { update_url: 'https://downloads.example/app' });
265
- });
266
-
267
- try {
268
- const client = new Client({ baseURL: apiServer.url, edgeURL: edgeServer.url });
269
- const resp = await client.checkForUpdates(defaultOptions());
270
- expect(resp.source).toBe('api');
271
- } finally {
272
- await Promise.all([edgeServer.close(), apiServer.close()]);
273
- }
274
- });
275
-
276
- it('passes channel, platform, and arch to API without normalization', async () => {
277
- const server = await createTestServer((req, res) => {
278
- const url = new URL(req.url!, `http://${req.headers.host}`);
279
- expect(url.searchParams.get('channel')).toBe('stable');
280
- expect(url.searchParams.get('platform')).toBe('macos');
281
- expect(url.searchParams.get('arch')).toBe('apple-silicon');
282
- writeJSON(res, {});
283
- });
284
-
285
- try {
286
- const client = new Client({ baseURL: server.url });
287
- await client.checkForUpdates({
288
- owner: 'admin',
289
- appName: 'test',
290
- version: '0.0.0.5',
291
- channel: 'stable',
292
- platform: 'macos',
293
- arch: 'apple-silicon',
294
- });
295
- } finally {
296
- await server.close();
297
- }
298
- });
299
-
300
- it('decodes dynamic update_url_<package> fields into packageUrls', async () => {
301
- const server = await createTestServer((_, res) => {
302
- res.setHeader('Content-Type', 'application/json');
303
- res.end(
304
- JSON.stringify({
305
- update_available: true,
306
- update_url_deb: 'https://downloads.example/app.deb',
307
- update_url_rpm: 'https://downloads.example/app.rpm',
308
- changelog: '### Changelog\n\n- Added feature X',
309
- critical: true,
310
- is_intermediate_required: true,
311
- possible_rollback: true,
312
- }),
313
- );
314
- });
315
-
316
- try {
317
- const client = new Client({ baseURL: server.url });
318
- const resp = await client.checkForUpdates(defaultOptions());
319
- expect(resp.updateAvailable).toBe(true);
320
- expect(resp.changelog).toBeTruthy();
321
- expect(resp.critical).toBe(true);
322
- expect(resp.isIntermediateRequired).toBe(true);
323
- expect(resp.possibleRollback).toBe(true);
324
- expect(resp.updateUrl).toBe('');
325
- expect(resp.packageUrls).toHaveLength(2);
326
- expect(resp.packageUrls[0]).toEqual({ package: 'deb', url: 'https://downloads.example/app.deb' });
327
- expect(resp.packageUrls[1]).toEqual({ package: 'rpm', url: 'https://downloads.example/app.rpm' });
328
- } finally {
329
- await server.close();
330
- }
331
- });
332
-
333
- it('decodes binary update_url field with no packageUrls', async () => {
334
- const server = await createTestServer((_, res) => {
335
- res.setHeader('Content-Type', 'application/json');
336
- res.end(JSON.stringify({ update_available: true, update_url: 'https://downloads.example/app' }));
337
- });
338
-
339
- try {
340
- const client = new Client({ baseURL: server.url });
341
- const resp = await client.checkForUpdates(defaultOptions());
342
- expect(resp.updateUrl).toBe('https://downloads.example/app');
343
- expect(resp.packageUrls).toHaveLength(0);
344
- } finally {
345
- await server.close();
346
- }
347
- });
348
-
349
- describe('input validation', () => {
350
- it.each<{ name: string; baseURL: string; opts: CheckOptions; want: Error }>([
351
- {
352
- name: 'missing base URL',
353
- baseURL: '',
354
- opts: defaultOptions(),
355
- want: ErrMissingBaseURL,
356
- },
357
- {
358
- name: 'invalid base URL (no hostname)',
359
- baseURL: 'file:///path/to/api',
360
- opts: defaultOptions(),
361
- want: ErrInvalidBaseURL,
362
- },
363
- {
364
- name: 'missing owner',
365
- baseURL: 'https://api.example',
366
- opts: { owner: '', appName: 'test', version: '0.0.0.5' },
367
- want: ErrMissingOwner,
368
- },
369
- {
370
- name: 'missing app name',
371
- baseURL: 'https://api.example',
372
- opts: { owner: 'admin', appName: '', version: '0.0.0.5' },
373
- want: ErrMissingAppName,
374
- },
375
- {
376
- name: 'missing version',
377
- baseURL: 'https://api.example',
378
- opts: { owner: 'admin', appName: 'test', version: '' },
379
- want: ErrMissingVersion,
380
- },
381
- ])('rejects with $name error', async ({ baseURL, opts, want }) => {
382
- const client = new Client({ baseURL });
383
- await expect(client.checkForUpdates(opts)).rejects.toBe(want);
384
- });
385
- });
386
-
387
- it('supports custom fetch implementation', async () => {
388
- const server = await createTestServer((_, res) => {
389
- writeJSON(res, { update_available: true });
390
- });
391
-
392
- let customFetchCalled = false;
393
- const customFetch: typeof globalThis.fetch = (input, init) => {
394
- customFetchCalled = true;
395
- return globalThis.fetch(input, init);
396
- };
397
-
398
- try {
399
- const client = new Client({ baseURL: server.url, fetch: customFetch });
400
- await client.checkForUpdates(defaultOptions());
401
- expect(customFetchCalled).toBe(true);
402
- } finally {
403
- await server.close();
404
- }
405
- });
406
-
407
- it('accepts custom HTTP server via fetch config', async () => {
408
- const server = await createTestServer((req: http.IncomingMessage, res: http.ServerResponse) => {
409
- const url = new URL(req.url!, `http://${req.headers.host}`);
410
- expect(url.pathname).toBe('/checkVersion');
411
- writeJSON(res, { update_available: false });
412
- });
413
-
414
- try {
415
- const client = new Client({ baseURL: server.url });
416
- const resp = await client.checkForUpdates(defaultOptions());
417
- expect(resp.updateAvailable).toBe(false);
418
- } finally {
419
- await server.close();
420
- }
421
- });
422
-
423
- it('rejects with ErrInvalidBaseURL for a non-absolute base URL', async () => {
424
- const client = new Client({ baseURL: 'not-a-url' });
425
- await expect(client.checkForUpdates(defaultOptions())).rejects.toBe(ErrInvalidBaseURL);
426
- });
427
-
428
- it('throws CheckError with both edgeError and apiError when all endpoints fail', async () => {
429
- const edgeServer = await createTestServer((_, res) => {
430
- res.writeHead(404);
431
- res.end();
432
- });
433
-
434
- const apiServer = await createTestServer((_, res) => {
435
- res.writeHead(500);
436
- res.end();
437
- });
438
-
439
- try {
440
- const client = new Client({ baseURL: apiServer.url, edgeURL: edgeServer.url });
441
- const err = await client.checkForUpdates(defaultOptions()).catch((e) => e);
442
- expect(err).toBeInstanceOf(CheckError);
443
- expect((err as CheckError).edgeError).toBeInstanceOf(EndpointError);
444
- expect((err as CheckError).apiError).toBeInstanceOf(EndpointError);
445
- } finally {
446
- await Promise.all([edgeServer.close(), apiServer.close()]);
447
- }
448
- });
449
-
450
- it('wraps a fetch network error in EndpointError inside CheckError', async () => {
451
- const networkError = new TypeError('fetch failed');
452
- const client = new Client({
453
- baseURL: 'http://api.example.com',
454
- fetch: () => Promise.reject(networkError),
455
- });
456
-
457
- const err = await client.checkForUpdates(defaultOptions()).catch((e) => e);
458
- expect(err).toBeInstanceOf(CheckError);
459
- const apiError = (err as CheckError).apiError as EndpointError;
460
- expect(apiError).toBeInstanceOf(EndpointError);
461
- expect(apiError.cause).toBe(networkError);
462
- });
463
-
464
- it('builds correct API URL when baseURL has a path prefix', async () => {
465
- const server = await createTestServer((req, res) => {
466
- const url = new URL(req.url!, `http://${req.headers.host}`);
467
- expect(url.pathname).toBe('/v1/checkVersion');
468
- writeJSON(res, {});
469
- });
470
-
471
- try {
472
- const client = new Client({ baseURL: `${server.url}/v1` });
473
- await client.checkForUpdates(defaultOptions());
474
- } finally {
475
- await server.close();
476
- }
477
- });
478
-
479
- it('does not fall back to API when AbortSignal is already aborted', async () => {
480
- const edgeServer = await createTestServer((_, res) => {
481
- res.writeHead(404);
482
- res.end();
483
- });
484
-
485
- let apiCalled = false;
486
- const apiServer = await createTestServer((_, res) => {
487
- apiCalled = true;
488
- writeJSON(res, { update_available: false });
489
- });
490
-
491
- const controller = new AbortController();
492
- controller.abort(new Error('cancelled'));
493
-
494
- try {
495
- const client = new Client({ baseURL: apiServer.url, edgeURL: edgeServer.url });
496
- const err = await client.checkForUpdates(defaultOptions(), controller.signal).catch((e) => e);
497
- expect(err).toBeInstanceOf(CheckError);
498
- expect(apiCalled).toBe(false);
499
- } finally {
500
- await Promise.all([edgeServer.close(), apiServer.close()]);
501
- }
502
- });
503
-
504
- it('succeeds with a live (non-aborted) AbortSignal', async () => {
505
- const server = await createTestServer((_, res) => {
506
- writeJSON(res, { update_available: false });
507
- });
508
-
509
- const controller = new AbortController();
510
-
511
- try {
512
- const client = new Client({ baseURL: server.url });
513
- const resp = await client.checkForUpdates(defaultOptions(), controller.signal);
514
- expect(resp.updateAvailable).toBe(false);
515
- } finally {
516
- await server.close();
517
- }
518
- });
519
- });
@@ -1,97 +0,0 @@
1
- import {
2
- CheckError,
3
- EndpointError,
4
- FaynoSyncError,
5
- RequestFailedError,
6
- ValidationError,
7
- } from '../src/errors';
8
-
9
- describe('EndpointError', () => {
10
- it('formats message with statusCode', () => {
11
- const err = new EndpointError('api', 'http://api.example.com/checkVersion', 404);
12
- expect(err.message).toBe(
13
- 'faynosync: request failed: http://api.example.com/checkVersion returned HTTP 404',
14
- );
15
- expect(err.statusCode).toBe(404);
16
- expect(err.source).toBe('api');
17
- expect(err.endpointUrl).toBe('http://api.example.com/checkVersion');
18
- });
19
-
20
- it('formats message with cause when no statusCode', () => {
21
- const cause = new Error('connection refused');
22
- const err = new EndpointError('edge', 'http://cdn.example.com/path', undefined, cause);
23
- expect(err.message).toBe(
24
- 'faynosync: request failed: http://cdn.example.com/path: connection refused',
25
- );
26
- expect(err.cause).toBe(cause);
27
- expect(err.statusCode).toBeUndefined();
28
- });
29
-
30
- it('formats message with neither statusCode nor cause', () => {
31
- const err = new EndpointError('edge', 'http://cdn.example.com/path');
32
- expect(err.message).toBe('faynosync: request failed: http://cdn.example.com/path');
33
- expect(err.statusCode).toBeUndefined();
34
- expect(err.cause).toBeUndefined();
35
- });
36
-
37
- it('is instanceof RequestFailedError and FaynoSyncError', () => {
38
- const err = new EndpointError('api', 'http://example.com', 500);
39
- expect(err).toBeInstanceOf(EndpointError);
40
- expect(err).toBeInstanceOf(RequestFailedError);
41
- expect(err).toBeInstanceOf(FaynoSyncError);
42
- expect(err).toBeInstanceOf(Error);
43
- });
44
- });
45
-
46
- describe('CheckError', () => {
47
- it('formats message with both edgeError and apiError', () => {
48
- const edgeErr = new Error('edge failed');
49
- const apiErr = new Error('api failed');
50
- const err = new CheckError(edgeErr, apiErr);
51
- expect(err.message).toBe(
52
- 'faynosync: request failed: edge failed: edge failed; api failed: api failed',
53
- );
54
- expect(err.edgeError).toBe(edgeErr);
55
- expect(err.apiError).toBe(apiErr);
56
- });
57
-
58
- it('formats message with only edgeError', () => {
59
- const edgeErr = new Error('edge failed');
60
- const err = new CheckError(edgeErr);
61
- expect(err.message).toBe('faynosync: request failed: edge failed: edge failed');
62
- expect(err.edgeError).toBe(edgeErr);
63
- expect(err.apiError).toBeUndefined();
64
- });
65
-
66
- it('formats message with only apiError', () => {
67
- const apiErr = new Error('api failed');
68
- const err = new CheckError(undefined, apiErr);
69
- expect(err.message).toBe('faynosync: request failed: api failed: api failed');
70
- expect(err.edgeError).toBeUndefined();
71
- expect(err.apiError).toBe(apiErr);
72
- });
73
-
74
- it('formats message with neither error', () => {
75
- const err = new CheckError();
76
- expect(err.message).toBe('faynosync: request failed');
77
- expect(err.edgeError).toBeUndefined();
78
- expect(err.apiError).toBeUndefined();
79
- });
80
-
81
- it('is instanceof RequestFailedError and FaynoSyncError', () => {
82
- const err = new CheckError();
83
- expect(err).toBeInstanceOf(CheckError);
84
- expect(err).toBeInstanceOf(RequestFailedError);
85
- expect(err).toBeInstanceOf(FaynoSyncError);
86
- expect(err).toBeInstanceOf(Error);
87
- });
88
- });
89
-
90
- describe('ValidationError', () => {
91
- it('is instanceof FaynoSyncError but not RequestFailedError', () => {
92
- const err = new ValidationError('missing field');
93
- expect(err).toBeInstanceOf(ValidationError);
94
- expect(err).toBeInstanceOf(FaynoSyncError);
95
- expect(err).not.toBeInstanceOf(RequestFailedError);
96
- });
97
- });
package/tests/helpers.ts DELETED
@@ -1,30 +0,0 @@
1
- import http from 'http';
2
- import type { AddressInfo } from 'net';
3
-
4
- export interface TestServer {
5
- readonly url: string;
6
- close(): Promise<void>;
7
- }
8
-
9
- export function createTestServer(handler: http.RequestListener): Promise<TestServer> {
10
- return new Promise((resolve) => {
11
- const server = http.createServer(handler);
12
- server.listen(0, '127.0.0.1', () => {
13
- const { port } = server.address() as AddressInfo;
14
- resolve({
15
- url: `http://127.0.0.1:${port}`,
16
- close: () =>
17
- new Promise<void>((res, rej) => {
18
- server.close((err) => (err ? rej(err) : res()));
19
- }),
20
- });
21
- });
22
- });
23
- }
24
-
25
- export function writeJSON(res: http.ServerResponse, data: unknown): void {
26
- const body = JSON.stringify(data);
27
- res.setHeader('Content-Type', 'application/json');
28
- res.setHeader('Content-Length', Buffer.byteLength(body));
29
- res.end(body);
30
- }
@@ -1,23 +0,0 @@
1
- import { systemArch, systemPlatform } from '../src/system';
2
-
3
- describe('systemPlatform', () => {
4
- it('returns process.platform', () => {
5
- expect(systemPlatform()).toBe(process.platform);
6
- });
7
-
8
- it('returns a non-empty string', () => {
9
- expect(typeof systemPlatform()).toBe('string');
10
- expect(systemPlatform().length).toBeGreaterThan(0);
11
- });
12
- });
13
-
14
- describe('systemArch', () => {
15
- it('returns process.arch', () => {
16
- expect(systemArch()).toBe(process.arch);
17
- });
18
-
19
- it('returns a non-empty string', () => {
20
- expect(typeof systemArch()).toBe('string');
21
- expect(systemArch().length).toBeGreaterThan(0);
22
- });
23
- });
package/tsconfig.json DELETED
@@ -1,17 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "commonjs",
5
- "lib": ["ES2022"],
6
- "outDir": "dist",
7
- "rootDir": "src",
8
- "strict": true,
9
- "declaration": true,
10
- "declarationMap": true,
11
- "sourceMap": true,
12
- "esModuleInterop": true,
13
- "skipLibCheck": true
14
- },
15
- "include": ["src"],
16
- "exclude": ["node_modules", "dist"]
17
- }
@@ -1,8 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "rootDir": ".",
5
- "noEmit": true
6
- },
7
- "include": ["src", "tests"]
8
- }