@antseed/cli 0.1.193 → 0.1.195

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 (145) hide show
  1. package/dist/cli/commands/buyer/start.d.ts.map +1 -1
  2. package/dist/cli/commands/buyer/start.js +9 -4
  3. package/dist/cli/commands/buyer/start.js.map +1 -1
  4. package/dist/cli/commands/gateway/index.d.ts.map +1 -1
  5. package/dist/cli/commands/gateway/index.js +6 -0
  6. package/dist/cli/commands/gateway/index.js.map +1 -1
  7. package/dist/cli/commands/seller/start.d.ts.map +1 -1
  8. package/dist/cli/commands/seller/start.js +9 -0
  9. package/dist/cli/commands/seller/start.js.map +1 -1
  10. package/dist/cli/commands/tunnel/start.d.ts.map +1 -1
  11. package/dist/cli/commands/tunnel/start.js +8 -2
  12. package/dist/cli/commands/tunnel/start.js.map +1 -1
  13. package/dist/cli/commands/update.d.ts +19 -0
  14. package/dist/cli/commands/update.d.ts.map +1 -0
  15. package/dist/cli/commands/update.js +153 -0
  16. package/dist/cli/commands/update.js.map +1 -0
  17. package/dist/cli/index.js +11 -0
  18. package/dist/cli/index.js.map +1 -1
  19. package/dist/cli/program.d.ts.map +1 -1
  20. package/dist/cli/program.js +2 -0
  21. package/dist/cli/program.js.map +1 -1
  22. package/dist/gateway/buyer-process.d.ts +5 -0
  23. package/dist/gateway/buyer-process.d.ts.map +1 -1
  24. package/dist/gateway/buyer-process.js +7 -4
  25. package/dist/gateway/buyer-process.js.map +1 -1
  26. package/dist/gateway/buyer-process.test.js +28 -2
  27. package/dist/gateway/buyer-process.test.js.map +1 -1
  28. package/dist/gateway/console-api/deps.d.ts +3 -0
  29. package/dist/gateway/console-api/deps.d.ts.map +1 -1
  30. package/dist/gateway/console-api/handlers/index.d.ts.map +1 -1
  31. package/dist/gateway/console-api/handlers/index.js +2 -0
  32. package/dist/gateway/console-api/handlers/index.js.map +1 -1
  33. package/dist/gateway/console-api/handlers/staking.d.ts +28 -0
  34. package/dist/gateway/console-api/handlers/staking.d.ts.map +1 -0
  35. package/dist/gateway/console-api/handlers/staking.js +153 -0
  36. package/dist/gateway/console-api/handlers/staking.js.map +1 -0
  37. package/dist/gateway/console-api/handlers/staking.test.d.ts +2 -0
  38. package/dist/gateway/console-api/handlers/staking.test.d.ts.map +1 -0
  39. package/dist/gateway/console-api/handlers/staking.test.js +126 -0
  40. package/dist/gateway/console-api/handlers/staking.test.js.map +1 -0
  41. package/dist/gateway/console-api/handlers/update.d.ts +13 -0
  42. package/dist/gateway/console-api/handlers/update.d.ts.map +1 -0
  43. package/dist/gateway/console-api/handlers/update.js +65 -0
  44. package/dist/gateway/console-api/handlers/update.js.map +1 -0
  45. package/dist/gateway/console-api/router.d.ts +1 -1
  46. package/dist/gateway/console-api/router.d.ts.map +1 -1
  47. package/dist/gateway/console-api/router.js +8 -3
  48. package/dist/gateway/console-api/router.js.map +1 -1
  49. package/dist/gateway/console-api/types.d.ts +47 -0
  50. package/dist/gateway/console-api/types.d.ts.map +1 -1
  51. package/dist/gateway/console-api/types.js.map +1 -1
  52. package/dist/gateway/console-api/update.test.d.ts +2 -0
  53. package/dist/gateway/console-api/update.test.d.ts.map +1 -0
  54. package/dist/gateway/console-api/update.test.js +198 -0
  55. package/dist/gateway/console-api/update.test.js.map +1 -0
  56. package/dist/gateway/console.d.ts +3 -0
  57. package/dist/gateway/console.d.ts.map +1 -1
  58. package/dist/gateway/console.js +3 -0
  59. package/dist/gateway/console.js.map +1 -1
  60. package/dist/gateway/gateway-policy.test.js +66 -0
  61. package/dist/gateway/gateway-policy.test.js.map +1 -1
  62. package/dist/gateway/gateway.test.js +88 -0
  63. package/dist/gateway/gateway.test.js.map +1 -1
  64. package/dist/gateway/policy-resolver.test.js +11 -3
  65. package/dist/gateway/policy-resolver.test.js.map +1 -1
  66. package/dist/gateway/request-errors.test.js +119 -3
  67. package/dist/gateway/request-errors.test.js.map +1 -1
  68. package/dist/gateway/request-shaping.d.ts +4 -2
  69. package/dist/gateway/request-shaping.d.ts.map +1 -1
  70. package/dist/gateway/request-shaping.js +16 -10
  71. package/dist/gateway/request-shaping.js.map +1 -1
  72. package/dist/gateway/routing-through-gateway.test.js +1 -1
  73. package/dist/gateway/routing-through-gateway.test.js.map +1 -1
  74. package/dist/gateway/server.d.ts +6 -0
  75. package/dist/gateway/server.d.ts.map +1 -1
  76. package/dist/gateway/server.js +162 -73
  77. package/dist/gateway/server.js.map +1 -1
  78. package/dist/gateway/services/usage.d.ts.map +1 -1
  79. package/dist/gateway/services/usage.js +7 -0
  80. package/dist/gateway/services/usage.js.map +1 -1
  81. package/dist/gateway/store-data.test.js +1 -1
  82. package/dist/gateway/store-data.test.js.map +1 -1
  83. package/dist/gateway/store-migrations.d.ts.map +1 -1
  84. package/dist/gateway/store-migrations.js +7 -0
  85. package/dist/gateway/store-migrations.js.map +1 -1
  86. package/dist/gateway/store.d.ts +24 -1
  87. package/dist/gateway/store.d.ts.map +1 -1
  88. package/dist/gateway/store.js +29 -10
  89. package/dist/gateway/store.js.map +1 -1
  90. package/dist/gateway/updates.d.ts +34 -0
  91. package/dist/gateway/updates.d.ts.map +1 -0
  92. package/dist/gateway/updates.js +155 -0
  93. package/dist/gateway/updates.js.map +1 -0
  94. package/dist/proxy/buyer-proxy.d.ts +34 -12
  95. package/dist/proxy/buyer-proxy.d.ts.map +1 -1
  96. package/dist/proxy/buyer-proxy.js +320 -61
  97. package/dist/proxy/buyer-proxy.js.map +1 -1
  98. package/dist/proxy/buyer-proxy.test.js +430 -23
  99. package/dist/proxy/buyer-proxy.test.js.map +1 -1
  100. package/dist/proxy/gateway-policy.test.js +7 -6
  101. package/dist/proxy/gateway-policy.test.js.map +1 -1
  102. package/dist/proxy/response-quality.d.ts +25 -0
  103. package/dist/proxy/response-quality.d.ts.map +1 -0
  104. package/dist/proxy/response-quality.js +203 -0
  105. package/dist/proxy/response-quality.js.map +1 -0
  106. package/dist/proxy/response-quality.test.d.ts +2 -0
  107. package/dist/proxy/response-quality.test.d.ts.map +1 -0
  108. package/dist/proxy/response-quality.test.js +72 -0
  109. package/dist/proxy/response-quality.test.js.map +1 -0
  110. package/dist/proxy/route-policy.d.ts +2 -0
  111. package/dist/proxy/route-policy.d.ts.map +1 -1
  112. package/dist/proxy/route-policy.js +9 -8
  113. package/dist/proxy/route-policy.js.map +1 -1
  114. package/dist/proxy/route-policy.test.js +6 -0
  115. package/dist/proxy/route-policy.test.js.map +1 -1
  116. package/dist/proxy/router-execution.d.ts.map +1 -1
  117. package/dist/proxy/router-execution.js +14 -4
  118. package/dist/proxy/router-execution.js.map +1 -1
  119. package/dist/proxy/router-execution.test.js +35 -0
  120. package/dist/proxy/router-execution.test.js.map +1 -1
  121. package/dist/update/install-method.d.ts +25 -0
  122. package/dist/update/install-method.d.ts.map +1 -0
  123. package/dist/update/install-method.js +76 -0
  124. package/dist/update/install-method.js.map +1 -0
  125. package/dist/update/notifier.d.ts +30 -0
  126. package/dist/update/notifier.d.ts.map +1 -0
  127. package/dist/update/notifier.js +84 -0
  128. package/dist/update/notifier.js.map +1 -0
  129. package/dist/update/root-updater.d.ts +80 -0
  130. package/dist/update/root-updater.d.ts.map +1 -0
  131. package/dist/update/root-updater.js +104 -0
  132. package/dist/update/root-updater.js.map +1 -0
  133. package/dist/update/update.test.d.ts +2 -0
  134. package/dist/update/update.test.d.ts.map +1 -0
  135. package/dist/update/update.test.js +224 -0
  136. package/dist/update/update.test.js.map +1 -0
  137. package/dist/update/version.d.ts +29 -0
  138. package/dist/update/version.d.ts.map +1 -0
  139. package/dist/update/version.js +110 -0
  140. package/dist/update/version.js.map +1 -0
  141. package/dist/update/watch.d.ts +32 -0
  142. package/dist/update/watch.d.ts.map +1 -0
  143. package/dist/update/watch.js +59 -0
  144. package/dist/update/watch.js.map +1 -0
  145. package/package.json +10 -10
@@ -0,0 +1,224 @@
1
+ import assert from 'node:assert/strict';
2
+ import { mkdtempSync, readdirSync, rmSync, writeFileSync, existsSync, readFileSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import test from 'node:test';
6
+ import { detectInstallMethod } from './install-method.js';
7
+ import { notifyIfUpdateAvailable } from './notifier.js';
8
+ import { watchForUpdates } from './watch.js';
9
+ import { readRootUpdateProgress, requestRootUpdate, rootUpdaterPaths, updateInFlight } from './root-updater.js';
10
+ import { compareVersions, distTagsUrl, fetchLatestVersion, isNewer, readUpdateCache, registryUrl, updateChecksDisabled, writeUpdateCache, } from './version.js';
11
+ function tempDir() {
12
+ const dir = mkdtempSync(join(tmpdir(), 'antseed-update-'));
13
+ return { dir, cleanup: () => rmSync(dir, { recursive: true, force: true }) };
14
+ }
15
+ test('compareVersions follows semver precedence', () => {
16
+ assert.equal(compareVersions('0.1.193', '0.1.180'), 1);
17
+ assert.equal(compareVersions('0.1.180', '0.1.193'), -1);
18
+ assert.equal(compareVersions('0.2.0', '0.1.999'), 1);
19
+ assert.equal(compareVersions('1.0.0', '1.0.0'), 0);
20
+ assert.equal(compareVersions('1.0.0-beta.2', '1.0.0'), -1);
21
+ assert.equal(compareVersions('1.0.0', '1.0.0-beta.2'), 1);
22
+ assert.equal(compareVersions('1.0.0-beta.10', '1.0.0-beta.2'), 1);
23
+ assert.equal(compareVersions('1.0.0-alpha', '1.0.0-alpha.1'), -1);
24
+ assert.equal(compareVersions('1.0.0-1', '1.0.0-alpha'), -1);
25
+ assert.equal(compareVersions('not-a-version', '1.0.0'), 0);
26
+ assert.equal(isNewer('0.1.193', '0.1.180'), true);
27
+ assert.equal(isNewer('0.1.180', '0.1.180'), false);
28
+ assert.equal(isNewer(null, '0.1.180'), false);
29
+ });
30
+ test('registryUrl prefers ANTSEED_NPM_REGISTRY, then npm config, and ignores non-http values', () => {
31
+ assert.equal(registryUrl({}), 'https://registry.npmjs.org');
32
+ assert.equal(registryUrl({ npm_config_registry: 'https://npm.example.test/' }), 'https://npm.example.test');
33
+ assert.equal(registryUrl({ ANTSEED_NPM_REGISTRY: 'https://mirror.test//', npm_config_registry: 'https://npm.example.test' }), 'https://mirror.test');
34
+ assert.equal(registryUrl({ ANTSEED_NPM_REGISTRY: 'file:///etc/passwd' }), 'https://registry.npmjs.org');
35
+ assert.equal(distTagsUrl('https://r.test'), 'https://r.test/-/package/@antseed%2fcli/dist-tags');
36
+ });
37
+ test('fetchLatestVersion reads the latest dist-tag and rejects odd answers', async () => {
38
+ const answer = (status, body) => (async () => new Response(JSON.stringify(body), { status }));
39
+ assert.equal(await fetchLatestVersion({ registry: 'https://r.test', fetch: answer(200, { latest: '0.1.193', next: '0.2.0-rc.1' }) }), '0.1.193');
40
+ await assert.rejects(fetchLatestVersion({ registry: 'https://r.test', fetch: answer(500, {}) }), /500/);
41
+ await assert.rejects(fetchLatestVersion({ registry: 'https://r.test', fetch: answer(200, { latest: '; rm -rf /' }) }), /no valid latest/);
42
+ });
43
+ test('the update cache round-trips and ignores a corrupt file', () => {
44
+ const { dir, cleanup } = tempDir();
45
+ try {
46
+ assert.equal(readUpdateCache(dir), null);
47
+ writeUpdateCache(dir, { checkedAt: 123, latest: '0.1.193' });
48
+ assert.deepEqual(readUpdateCache(dir), { checkedAt: 123, latest: '0.1.193' });
49
+ writeFileSync(join(dir, 'update-check.json'), '{"checkedAt":1,"latest":"evil"}');
50
+ assert.equal(readUpdateCache(dir), null);
51
+ }
52
+ finally {
53
+ cleanup();
54
+ }
55
+ });
56
+ test('updateChecksDisabled honours NO_UPDATE_NOTIFIER, ANTSEED_NO_UPDATE_CHECK and CI', () => {
57
+ assert.equal(updateChecksDisabled({}), false);
58
+ assert.equal(updateChecksDisabled({ NO_UPDATE_NOTIFIER: '1' }), true);
59
+ assert.equal(updateChecksDisabled({ ANTSEED_NO_UPDATE_CHECK: 'true' }), true);
60
+ assert.equal(updateChecksDisabled({ CI: 'true' }), true);
61
+ assert.equal(updateChecksDisabled({ CI: 'false' }), false);
62
+ assert.equal(updateChecksDisabled({ NO_UPDATE_NOTIFIER: '0' }), false);
63
+ });
64
+ test('detectInstallMethod picks the package manager from where the CLI lives', () => {
65
+ const detect = (scriptPath, env = {}, isWritable = () => true) => detectInstallMethod({ scriptPath, env, electron: false, isWritable });
66
+ const npm = detect('/Users/a/.nvm/versions/node/v24.0.0/lib/node_modules/@antseed/cli/dist/cli/index.js');
67
+ assert.equal(npm.kind, 'npm');
68
+ assert.deepEqual(npm.argv?.slice(1), ['install', '-g', '@antseed/cli@latest']);
69
+ const rootNpm = detect('/usr/lib/node_modules/@antseed/cli/dist/cli/index.js', {}, () => false);
70
+ assert.equal(rootNpm.kind, 'npm');
71
+ assert.equal(rootNpm.argv, null);
72
+ assert.equal(rootNpm.command, 'sudo npm install -g @antseed/cli@latest');
73
+ assert.equal(detect('C:\\Users\\a\\AppData\\Roaming\\npm\\node_modules\\@antseed\\cli\\dist\\cli\\index.js').kind, 'npm');
74
+ assert.equal(detect('/Users/a/Library/pnpm/global/5/node_modules/@antseed/cli/dist/cli/index.js').kind, 'pnpm');
75
+ assert.equal(detect('/Users/a/.config/yarn/global/node_modules/@antseed/cli/dist/cli/index.js').kind, 'yarn');
76
+ assert.equal(detect('/Users/a/.bun/install/global/node_modules/@antseed/cli/dist/cli/index.js').kind, 'bun');
77
+ assert.equal(detect('/Users/a/.volta/tools/image/packages/@antseed/cli/lib/node_modules/@antseed/cli/dist/cli/index.js').kind, 'volta');
78
+ assert.equal(detect('/Users/a/.npm/_npx/abc/node_modules/@antseed/cli/dist/cli/index.js').kind, 'npx');
79
+ assert.equal(detect('/nix/store/abc-antseed/lib/antseed/bundle.mjs').kind, 'nix');
80
+ assert.equal(detect('/srv/app/node_modules/@antseed/cli/dist/cli/index.js').kind, 'local');
81
+ assert.equal(detect('/Users/a/Development/antseed/apps/cli/dist/cli/index.js').kind, 'source');
82
+ const installer = detect('/opt/antseed/cli/lib/node_modules/@antseed/cli/dist/cli/index.js', { ANTSEED_UPDATER_REQUEST: '/var/lib/antseed/update-request' });
83
+ assert.equal(installer.kind, 'installer');
84
+ assert.equal(detectInstallMethod({ scriptPath: '/x', env: {}, electron: true }).kind, 'desktop');
85
+ });
86
+ test('root updater: a request reads as requested, then the status file takes over', () => {
87
+ const { dir, cleanup } = tempDir();
88
+ try {
89
+ const env = { ANTSEED_UPDATER_REQUEST: join(dir, 'update-request'), ANTSEED_UPDATER_STATUS: join(dir, 'status.json') };
90
+ const paths = rootUpdaterPaths(env);
91
+ assert.equal(rootUpdaterPaths({ ANTSEED_UPDATER_REQUEST: 'x' }), null);
92
+ assert.equal(readRootUpdateProgress(paths), null);
93
+ requestRootUpdate(paths, 'tester');
94
+ assert.ok(existsSync(paths.request));
95
+ assert.match(readFileSync(paths.request, 'utf8'), /tester/);
96
+ const requested = readRootUpdateProgress(paths);
97
+ assert.equal(requested?.state, 'requested');
98
+ assert.equal(updateInFlight(requested), true);
99
+ rmSync(paths.request);
100
+ writeFileSync(paths.status, JSON.stringify({ state: 'succeeded', from: '0.1.180', to: '0.1.193', startedAt: 1, finishedAt: 2, error: null }));
101
+ const done = readRootUpdateProgress(paths);
102
+ assert.deepEqual(done, { state: 'succeeded', action: 'install', from: '0.1.180', to: '0.1.193', startedAt: 1, finishedAt: 2, error: null });
103
+ assert.equal(updateInFlight(done), false);
104
+ writeFileSync(paths.status, JSON.stringify({ state: 'pwned', startedAt: 1 }));
105
+ assert.equal(readRootUpdateProgress(paths), null);
106
+ }
107
+ finally {
108
+ cleanup();
109
+ }
110
+ });
111
+ function fakeStream(isTTY) {
112
+ const lines = [];
113
+ return { lines, stream: { isTTY, write: (chunk) => { lines.push(chunk); return true; } } };
114
+ }
115
+ test('the notifier prints from the cache, refreshes when stale, and stays quiet when it should', () => {
116
+ const { dir, cleanup } = tempDir();
117
+ try {
118
+ const env = { ANTSEED_UPDATER_REQUEST: join(dir, 'r'), ANTSEED_UPDATER_STATUS: join(dir, 's') };
119
+ const refreshed = [];
120
+ const run = (overrides = {}, isTTY = true) => {
121
+ const out = fakeStream(isTTY);
122
+ notifyIfUpdateAvailable({ dataDir: dir, current: '0.1.180', commandName: 'start', argv: [], env, stream: out.stream, now: 10_000, refresh: (d) => refreshed.push(d), ...overrides });
123
+ return out.lines.join('');
124
+ };
125
+ assert.equal(run(), '');
126
+ assert.deepEqual(refreshed, [dir], 'no cache: refresh in the background, print nothing');
127
+ writeUpdateCache(dir, { checkedAt: 9_000, latest: '0.1.193' });
128
+ refreshed.length = 0;
129
+ assert.match(run(), /0\.1\.193 is available \(you have 0\.1\.180\).*antseed update/);
130
+ assert.deepEqual(refreshed, [], 'a fresh cache is not refreshed');
131
+ assert.equal(run({ argv: ['--json'] }), '');
132
+ assert.equal(run({ commandName: 'update' }), '');
133
+ assert.equal(run({}, false), '');
134
+ assert.equal(run({ env: { ...env, NO_UPDATE_NOTIFIER: '1' } }), '');
135
+ assert.equal(run({ current: '0.1.193' }), '');
136
+ }
137
+ finally {
138
+ cleanup();
139
+ }
140
+ });
141
+ test('root updater: a download request reads as one, and a downloaded version as ready', () => {
142
+ const { dir, cleanup } = tempDir();
143
+ try {
144
+ const paths = { request: join(dir, 'update-request'), status: join(dir, 'status.json') };
145
+ requestRootUpdate(paths, 'owner', 1_000, 'download');
146
+ assert.deepEqual([readRootUpdateProgress(paths)?.state, readRootUpdateProgress(paths)?.action], ['requested', 'download']);
147
+ // Renamed into place whole, so the updater never sees it half written.
148
+ assert.deepEqual(JSON.parse(readFileSync(paths.request, 'utf8')), { requestedAt: 1_000, requestedBy: 'owner', action: 'download' });
149
+ assert.deepEqual(readdirSync(dir).filter((name) => name.endsWith('.tmp')), []);
150
+ rmSync(paths.request);
151
+ writeFileSync(paths.status, JSON.stringify({ state: 'ready', action: 'download', from: '0.1.180', to: '0.1.193', startedAt: 1, finishedAt: 2, error: null }));
152
+ const ready = readRootUpdateProgress(paths);
153
+ assert.deepEqual([ready?.state, ready?.action, ready?.to], ['ready', 'download', '0.1.193']);
154
+ assert.equal(updateInFlight(ready), false);
155
+ // A run left "running" (a reboot, a kill) stops blocking updates once it is stale.
156
+ writeFileSync(paths.status, JSON.stringify({ state: 'running', action: 'install', from: '0.1.180', to: '0.1.193', startedAt: 1_000, finishedAt: null, error: null }));
157
+ assert.equal(readRootUpdateProgress(paths, { staleAfterMs: 60_000, now: 30_000 })?.state, 'running');
158
+ const stale = readRootUpdateProgress(paths, { staleAfterMs: 60_000, now: 90_000 });
159
+ assert.deepEqual([stale?.state, stale?.error], ['failed', 'the update service stopped before finishing']);
160
+ assert.equal(updateInFlight(stale), false);
161
+ assert.equal(readRootUpdateProgress(paths)?.state, 'running', 'the desktop app finishes on its next launch, however late');
162
+ // Requests and statuses from before the two steps install.
163
+ writeFileSync(paths.status, JSON.stringify({ state: 'succeeded', from: '0.1.180', to: '0.1.193', startedAt: 1, finishedAt: 2, error: null }));
164
+ assert.equal(readRootUpdateProgress(paths)?.action, 'install');
165
+ }
166
+ finally {
167
+ cleanup();
168
+ }
169
+ });
170
+ test('a running seller logs each newer version once and installs nothing', async () => {
171
+ const { dir, cleanup } = tempDir();
172
+ try {
173
+ const npm = detectInstallMethod({ env: {}, scriptPath: '/usr/local/lib/node_modules/@antseed/cli/dist/cli/index.js', electron: false, isWritable: () => true });
174
+ let latest = '0.1.180';
175
+ let clock = 0;
176
+ let fetches = 0;
177
+ const lines = [];
178
+ const watch = watchForUpdates({
179
+ dataDir: dir, current: '0.1.180', running: 'seller', env: {}, method: npm,
180
+ log: (line) => lines.push(line), now: () => clock,
181
+ fetchLatest: async () => { fetches += 1; return latest; },
182
+ intervalMs: 1_000,
183
+ });
184
+ try {
185
+ // It checks once as it starts.
186
+ await new Promise((resolve) => setImmediate(resolve));
187
+ assert.equal(fetches, 1);
188
+ assert.deepEqual(lines, [], 'up to date');
189
+ latest = '0.1.193';
190
+ await watch.check();
191
+ assert.equal(fetches, 1, 'a fresh cache answers within the interval');
192
+ clock = 2_000;
193
+ await watch.check();
194
+ assert.equal(lines.length, 1);
195
+ assert.match(lines[0], /Antseed 0\.1\.193 is available \(this seller runs 0\.1\.180\)\. Run .*antseed update.*, then restart the seller\./);
196
+ clock = 4_000;
197
+ await watch.check();
198
+ assert.equal(lines.length, 1, 'once per version');
199
+ latest = '0.1.194';
200
+ clock = 6_000;
201
+ await watch.check();
202
+ assert.equal(lines.length, 2);
203
+ // The 30-minute tick asks npm even when the cache it wrote looks fresh.
204
+ latest = '0.1.195';
205
+ const before = fetches;
206
+ await watch.check(true);
207
+ assert.equal(fetches, before + 1);
208
+ assert.equal(lines.length, 3);
209
+ }
210
+ finally {
211
+ watch.stop();
212
+ }
213
+ const quiet = [];
214
+ const off = watchForUpdates({ dataDir: dir, current: '0.1.180', running: 'seller', env: { ANTSEED_NO_UPDATE_CHECK: '1' }, method: npm, log: (line) => quiet.push(line), fetchLatest: async () => '0.1.199' });
215
+ await off.check();
216
+ const desktop = watchForUpdates({ dataDir: dir, current: '0.1.180', running: 'seller', env: {}, method: { ...npm, kind: 'desktop' }, log: (line) => quiet.push(line), fetchLatest: async () => '0.1.199' });
217
+ await desktop.check();
218
+ assert.deepEqual(quiet, [], 'off when disabled, and in the desktop app, which has its own updater');
219
+ }
220
+ finally {
221
+ cleanup();
222
+ }
223
+ });
224
+ //# sourceMappingURL=update.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.test.js","sourceRoot":"","sources":["../../src/update/update.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /** The package `antseed update` installs. */
2
+ export declare const CLI_PACKAGE = "@antseed/cli";
3
+ /** How long a registry answer stays fresh, and how often running sellers, buyers and gateways ask again: every 30 minutes, like the desktop app. */
4
+ export declare const UPDATE_CHECK_INTERVAL_MS: number;
5
+ export declare function isSemver(value: unknown): value is string;
6
+ /** Semver precedence: negative when `a` is older than `b`. Unparseable versions compare equal. */
7
+ export declare function compareVersions(a: string, b: string): number;
8
+ export declare function isNewer(latest: string | null | undefined, current: string): boolean;
9
+ /** The npm registry to ask: `ANTSEED_NPM_REGISTRY`, then npm's own `npm_config_registry`, then npmjs.org. */
10
+ export declare function registryUrl(env?: NodeJS.ProcessEnv): string;
11
+ /** The dist-tags document of the CLI package: a few bytes, unlike the full packument. */
12
+ export declare function distTagsUrl(registry: string): string;
13
+ /** The version the registry tags `latest`. Throws on network errors, timeouts and odd answers. */
14
+ export declare function fetchLatestVersion(options?: {
15
+ registry?: string;
16
+ timeoutMs?: number;
17
+ fetch?: typeof fetch;
18
+ }): Promise<string>;
19
+ /** The last registry answer, kept in the data dir so most runs never touch the network. */
20
+ export interface UpdateCache {
21
+ checkedAt: number;
22
+ latest: string;
23
+ }
24
+ export declare function updateCachePath(dataDir: string): string;
25
+ export declare function readUpdateCache(dataDir: string): UpdateCache | null;
26
+ export declare function writeUpdateCache(dataDir: string, cache: UpdateCache): void;
27
+ /** `NO_UPDATE_NOTIFIER` (the convention npm and update-notifier share), `ANTSEED_NO_UPDATE_CHECK`, or CI. */
28
+ export declare function updateChecksDisabled(env?: NodeJS.ProcessEnv): boolean;
29
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/update/version.ts"],"names":[],"mappings":"AAGA,6CAA6C;AAC7C,eAAO,MAAM,WAAW,iBAAiB,CAAA;AAEzC,oJAAoJ;AACpJ,eAAO,MAAM,wBAAwB,QAAiB,CAAA;AAKtD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,kGAAkG;AAClG,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CA2B5D;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAEnF;AAED,6GAA6G;AAC7G,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAMxE;AAED,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,kGAAkG;AAClG,wBAAsB,kBAAkB,CAAC,OAAO,GAAE;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAUvB;AAED,2FAA2F;AAC3F,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQnE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAM1E;AAED,6GAA6G;AAC7G,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAMlF"}
@@ -0,0 +1,110 @@
1
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ /** The package `antseed update` installs. */
4
+ export const CLI_PACKAGE = '@antseed/cli';
5
+ /** How long a registry answer stays fresh, and how often running sellers, buyers and gateways ask again: every 30 minutes, like the desktop app. */
6
+ export const UPDATE_CHECK_INTERVAL_MS = 30 * 60 * 1000;
7
+ const DEFAULT_REGISTRY = 'https://registry.npmjs.org';
8
+ const SEMVER = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/;
9
+ export function isSemver(value) {
10
+ return typeof value === 'string' && value.length <= 64 && SEMVER.test(value);
11
+ }
12
+ /** Semver precedence: negative when `a` is older than `b`. Unparseable versions compare equal. */
13
+ export function compareVersions(a, b) {
14
+ const left = SEMVER.exec(a);
15
+ const right = SEMVER.exec(b);
16
+ if (!left || !right)
17
+ return 0;
18
+ for (let index = 1; index <= 3; index += 1) {
19
+ const diff = Number(left[index]) - Number(right[index]);
20
+ if (diff !== 0)
21
+ return Math.sign(diff);
22
+ }
23
+ const pa = left[4];
24
+ const pb = right[4];
25
+ if (pa === pb)
26
+ return 0;
27
+ if (pa === undefined)
28
+ return 1;
29
+ if (pb === undefined)
30
+ return -1;
31
+ const ids = pa.split('.');
32
+ const others = pb.split('.');
33
+ for (let index = 0; index < Math.max(ids.length, others.length); index += 1) {
34
+ const x = ids[index];
35
+ const y = others[index];
36
+ if (x === undefined)
37
+ return -1;
38
+ if (y === undefined)
39
+ return 1;
40
+ const nx = /^\d+$/.test(x);
41
+ const ny = /^\d+$/.test(y);
42
+ if (nx && ny && Number(x) !== Number(y))
43
+ return Math.sign(Number(x) - Number(y));
44
+ if (nx !== ny)
45
+ return nx ? -1 : 1;
46
+ if (x !== y)
47
+ return x < y ? -1 : 1;
48
+ }
49
+ return 0;
50
+ }
51
+ export function isNewer(latest, current) {
52
+ return Boolean(latest) && compareVersions(latest, current) > 0;
53
+ }
54
+ /** The npm registry to ask: `ANTSEED_NPM_REGISTRY`, then npm's own `npm_config_registry`, then npmjs.org. */
55
+ export function registryUrl(env = process.env) {
56
+ for (const candidate of [env['ANTSEED_NPM_REGISTRY'], env['npm_config_registry']]) {
57
+ const value = candidate?.trim();
58
+ if (value && /^https?:\/\//i.test(value))
59
+ return value.replace(/\/+$/, '');
60
+ }
61
+ return DEFAULT_REGISTRY;
62
+ }
63
+ /** The dist-tags document of the CLI package: a few bytes, unlike the full packument. */
64
+ export function distTagsUrl(registry) {
65
+ return `${registry}/-/package/${CLI_PACKAGE.replace('/', '%2f')}/dist-tags`;
66
+ }
67
+ /** The version the registry tags `latest`. Throws on network errors, timeouts and odd answers. */
68
+ export async function fetchLatestVersion(options = {}) {
69
+ const doFetch = options.fetch ?? fetch;
70
+ const response = await doFetch(distTagsUrl(options.registry ?? registryUrl()), {
71
+ headers: { accept: 'application/json' },
72
+ signal: AbortSignal.timeout(options.timeoutMs ?? 5_000),
73
+ });
74
+ if (!response.ok)
75
+ throw new Error(`npm registry answered ${response.status}`);
76
+ const tags = await response.json();
77
+ if (!isSemver(tags.latest))
78
+ throw new Error('npm registry returned no valid latest version');
79
+ return tags.latest;
80
+ }
81
+ export function updateCachePath(dataDir) {
82
+ return join(dataDir, 'update-check.json');
83
+ }
84
+ export function readUpdateCache(dataDir) {
85
+ try {
86
+ const parsed = JSON.parse(readFileSync(updateCachePath(dataDir), 'utf8'));
87
+ if (typeof parsed.checkedAt !== 'number' || !isSemver(parsed.latest))
88
+ return null;
89
+ return { checkedAt: parsed.checkedAt, latest: parsed.latest };
90
+ }
91
+ catch {
92
+ return null;
93
+ }
94
+ }
95
+ export function writeUpdateCache(dataDir, cache) {
96
+ const path = updateCachePath(dataDir);
97
+ mkdirSync(dirname(path), { recursive: true });
98
+ const tmp = `${path}.${process.pid}.tmp`;
99
+ writeFileSync(tmp, JSON.stringify(cache));
100
+ renameSync(tmp, path);
101
+ }
102
+ /** `NO_UPDATE_NOTIFIER` (the convention npm and update-notifier share), `ANTSEED_NO_UPDATE_CHECK`, or CI. */
103
+ export function updateChecksDisabled(env = process.env) {
104
+ const on = (name) => {
105
+ const value = env[name]?.trim().toLowerCase();
106
+ return Boolean(value) && value !== '0' && value !== 'false';
107
+ };
108
+ return on('NO_UPDATE_NOTIFIER') || on('ANTSEED_NO_UPDATE_CHECK') || on('CI');
109
+ }
110
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/update/version.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type InstallMethod } from './install-method.js';
2
+ export interface UpdateWatchOptions {
3
+ dataDir: string;
4
+ current: string;
5
+ /** What runs, for the notice: `seller`, `buyer`. */
6
+ running: string;
7
+ log: (line: string) => void;
8
+ env?: NodeJS.ProcessEnv;
9
+ method?: InstallMethod;
10
+ fetchLatest?: () => Promise<string>;
11
+ now?: () => number;
12
+ intervalMs?: number;
13
+ }
14
+ export interface UpdateWatch {
15
+ /**
16
+ * Announces a version not announced yet. Reads a fresh cache (another
17
+ * command may have just asked npm) unless `fresh`, as every 30-minute tick
18
+ * is: the cache it wrote itself would otherwise still look fresh then.
19
+ */
20
+ check(fresh?: boolean): Promise<void>;
21
+ stop(): void;
22
+ }
23
+ /**
24
+ * Checks npm every 30 minutes while a seller or buyer runs, and logs one line
25
+ * the first time it sees each newer version. It never installs anything:
26
+ * like the desktop app's "Update available", the person runs
27
+ * `antseed update` and restarts when it suits them. Off where the notice is
28
+ * (`NO_UPDATE_NOTIFIER`, `ANTSEED_NO_UPDATE_CHECK`, CI) and for installs
29
+ * that update some other way (the desktop app, npx, project dependencies).
30
+ */
31
+ export declare function watchForUpdates(options: UpdateWatchOptions): UpdateWatch;
32
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/update/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAY7E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;IACnC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,IAAI,IAAI,IAAI,CAAA;CACb;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CA2CxE"}
@@ -0,0 +1,59 @@
1
+ import { detectInstallMethod } from './install-method.js';
2
+ import { NOTIFY_KINDS, updateAvailableLine } from './notifier.js';
3
+ import { fetchLatestVersion, isNewer, readUpdateCache, registryUrl, UPDATE_CHECK_INTERVAL_MS, updateChecksDisabled, writeUpdateCache, } from './version.js';
4
+ /**
5
+ * Checks npm every 30 minutes while a seller or buyer runs, and logs one line
6
+ * the first time it sees each newer version. It never installs anything:
7
+ * like the desktop app's "Update available", the person runs
8
+ * `antseed update` and restarts when it suits them. Off where the notice is
9
+ * (`NO_UPDATE_NOTIFIER`, `ANTSEED_NO_UPDATE_CHECK`, CI) and for installs
10
+ * that update some other way (the desktop app, npx, project dependencies).
11
+ */
12
+ export function watchForUpdates(options) {
13
+ const env = options.env ?? process.env;
14
+ const now = options.now ?? Date.now;
15
+ const method = options.method ?? detectInstallMethod({ env });
16
+ const fetchLatest = options.fetchLatest ?? (() => fetchLatestVersion({ registry: registryUrl(env) }));
17
+ const intervalMs = options.intervalMs ?? UPDATE_CHECK_INTERVAL_MS;
18
+ let announced = null;
19
+ const check = async (fresh = false) => {
20
+ let latest;
21
+ const cache = fresh ? null : readUpdateCache(options.dataDir);
22
+ if (cache && now() - cache.checkedAt < intervalMs) {
23
+ latest = cache.latest;
24
+ }
25
+ else {
26
+ try {
27
+ latest = await fetchLatest();
28
+ }
29
+ catch {
30
+ return; // offline or npm down: the next check tries again
31
+ }
32
+ try {
33
+ writeUpdateCache(options.dataDir, { checkedAt: now(), latest });
34
+ }
35
+ catch {
36
+ // the notice works without the cache
37
+ }
38
+ }
39
+ if (!isNewer(latest, options.current) || latest === announced)
40
+ return;
41
+ announced = latest;
42
+ options.log(updateAvailableLine(latest, options.current, method, options.running));
43
+ };
44
+ if (updateChecksDisabled(env) || !NOTIFY_KINDS.has(method.kind)) {
45
+ return { check: async () => { }, stop: () => { } };
46
+ }
47
+ void check();
48
+ let timer = setInterval(() => { void check(true); }, intervalMs);
49
+ timer.unref?.();
50
+ return {
51
+ check,
52
+ stop() {
53
+ if (timer)
54
+ clearInterval(timer);
55
+ timer = null;
56
+ },
57
+ };
58
+ }
59
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/update/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAsB,MAAM,qBAAqB,CAAA;AAC7E,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EACL,kBAAkB,EAClB,OAAO,EACP,eAAe,EACf,WAAW,EACX,wBAAwB,EACxB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,cAAc,CAAA;AAyBrB;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,OAA2B;IACzD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAA;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;IAC7D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IACrG,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,wBAAwB,CAAA;IACjE,IAAI,SAAS,GAAkB,IAAI,CAAA;IAEnC,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,EAAiB,EAAE;QACnD,IAAI,MAAc,CAAA;QAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAC7D,IAAI,KAAK,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,UAAU,EAAE,CAAC;YAClD,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,WAAW,EAAE,CAAA;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAM,CAAC,kDAAkD;YAC3D,CAAC;YACD,IAAI,CAAC;gBACH,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;YACjE,CAAC;YAAC,MAAM,CAAC;gBACP,qCAAqC;YACvC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAM;QACrE,SAAS,GAAG,MAAM,CAAA;QAClB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;IACpF,CAAC,CAAA;IAED,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAChE,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAA;IAClD,CAAC;IACD,KAAK,KAAK,EAAE,CAAA;IACZ,IAAI,KAAK,GAA0C,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,CAAA,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;IACtG,KAAK,CAAC,KAAK,EAAE,EAAE,CAAA;IACf,OAAO;QACL,KAAK;QACL,IAAI;YACF,IAAI,KAAK;gBAAE,aAAa,CAAC,KAAK,CAAC,CAAA;YAC/B,KAAK,GAAG,IAAI,CAAA;QACd,CAAC;KACF,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antseed/cli",
3
- "version": "0.1.193",
3
+ "version": "0.1.195",
4
4
  "description": "Antseed Network CLI and Web Dashboard",
5
5
  "type": "module",
6
6
  "files": [
@@ -33,14 +33,14 @@
33
33
  "reflect-metadata": "^0.2.2",
34
34
  "zod": "^4",
35
35
  "@antseed/ant-agent": "0.1.35",
36
- "@antseed/connected-apps": "0.1.3",
37
- "@antseed/gateway-console": "0.1.8",
38
- "@antseed/node": "0.2.144",
39
- "@antseed/payments": "0.1.71",
40
- "@antseed/provider-core": "0.2.59",
41
- "@antseed/router-core": "0.1.50",
42
- "@antseed/ants": "0.1.27",
43
- "@antseed/api-adapter": "0.1.53"
36
+ "@antseed/ants": "0.1.29",
37
+ "@antseed/api-adapter": "0.1.53",
38
+ "@antseed/gateway-console": "0.1.9",
39
+ "@antseed/node": "0.2.146",
40
+ "@antseed/payments": "0.1.73",
41
+ "@antseed/provider-core": "0.2.60",
42
+ "@antseed/connected-apps": "0.1.4",
43
+ "@antseed/router-core": "0.1.50"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@types/better-sqlite3": "^7.6.13",
@@ -59,6 +59,6 @@
59
59
  "start:seed": "node dist/cli/index.js seed",
60
60
  "start:connect": "node dist/cli/index.js connect",
61
61
  "typecheck": "tsc --noEmit",
62
- "test": "npm run build && node --test dist/config/*.test.js dist/cli/*.test.js dist/cli/commands/**/*.test.js dist/proxy/*.test.js dist/plugins/*.test.js dist/system-proxy/*.test.js dist/gateway/*.test.js dist/gateway/*/*.test.js dist/gateway/*/*/*.test.js dist/routing-policy/*.test.js dist/buyer-identities/*.test.js"
62
+ "test": "npm run build && node --test dist/config/*.test.js dist/cli/*.test.js dist/cli/commands/**/*.test.js dist/proxy/*.test.js dist/plugins/*.test.js dist/system-proxy/*.test.js dist/gateway/*.test.js dist/gateway/*/*.test.js dist/gateway/*/*/*.test.js dist/routing-policy/*.test.js dist/buyer-identities/*.test.js dist/update/*.test.js"
63
63
  }
64
64
  }